Merge pull request #6414 from y-zeng/reflection_proto

Add reflection.proto
diff --git a/BUILD b/BUILD
index b4b10b5..793c1c7 100644
--- a/BUILD
+++ b/BUILD
@@ -179,6 +179,7 @@
     "src/core/lib/iomgr/endpoint.h",
     "src/core/lib/iomgr/endpoint_pair.h",
     "src/core/lib/iomgr/ev_poll_and_epoll_posix.h",
+    "src/core/lib/iomgr/ev_poll_posix.h",
     "src/core/lib/iomgr/ev_posix.h",
     "src/core/lib/iomgr/exec_ctx.h",
     "src/core/lib/iomgr/executor.h",
@@ -285,8 +286,9 @@
     "src/core/ext/client_config/subchannel_call_holder.h",
     "src/core/ext/client_config/subchannel_index.h",
     "src/core/ext/client_config/uri_parser.h",
+    "third_party/objective_c/Cronet/cronet_c_for_grpc.h",
     "src/core/ext/lb_policy/grpclb/load_balancer_api.h",
-    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h",
+    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h",
     "src/core/ext/census/aggregation.h",
     "src/core/ext/census/census_interface.h",
     "src/core/ext/census/census_rpc_stats.h",
@@ -312,6 +314,7 @@
     "src/core/lib/iomgr/endpoint_pair_posix.c",
     "src/core/lib/iomgr/endpoint_pair_windows.c",
     "src/core/lib/iomgr/ev_poll_and_epoll_posix.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",
@@ -439,8 +442,11 @@
     "src/core/ext/client_config/uri_parser.c",
     "src/core/ext/transport/chttp2/server/insecure/server_chttp2.c",
     "src/core/ext/transport/chttp2/client/insecure/channel_create.c",
+    "src/core/ext/transport/cronet/client/secure/cronet_channel_create.c",
+    "src/core/ext/transport/cronet/transport/cronet_api_dummy.c",
+    "src/core/ext/transport/cronet/transport/cronet_transport.c",
     "src/core/ext/lb_policy/grpclb/load_balancer_api.c",
-    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c",
+    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c",
     "src/core/ext/lb_policy/pick_first/pick_first.c",
     "src/core/ext/lb_policy/round_robin/round_robin.c",
     "src/core/ext/resolver/dns/native/dns_resolver.c",
@@ -463,6 +469,7 @@
     "include/grpc/grpc.h",
     "include/grpc/status.h",
     "include/grpc/impl/codegen/byte_buffer.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/grpc_types.h",
@@ -482,6 +489,7 @@
     "include/grpc/impl/codegen/sync_posix.h",
     "include/grpc/impl/codegen/sync_win32.h",
     "include/grpc/impl/codegen/time.h",
+    "include/grpc/grpc_cronet.h",
     "include/grpc/grpc_security.h",
     "include/grpc/grpc_security_constants.h",
     "include/grpc/census.h",
@@ -524,6 +532,7 @@
     "src/core/lib/iomgr/endpoint.h",
     "src/core/lib/iomgr/endpoint_pair.h",
     "src/core/lib/iomgr/ev_poll_and_epoll_posix.h",
+    "src/core/lib/iomgr/ev_poll_posix.h",
     "src/core/lib/iomgr/ev_posix.h",
     "src/core/lib/iomgr/exec_ctx.h",
     "src/core/lib/iomgr/executor.h",
@@ -617,7 +626,7 @@
     "src/core/ext/client_config/subchannel_index.h",
     "src/core/ext/client_config/uri_parser.h",
     "src/core/ext/lb_policy/grpclb/load_balancer_api.h",
-    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h",
+    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h",
     "src/core/ext/census/aggregation.h",
     "src/core/ext/census/census_interface.h",
     "src/core/ext/census/census_rpc_stats.h",
@@ -644,6 +653,7 @@
     "src/core/lib/iomgr/endpoint_pair_posix.c",
     "src/core/lib/iomgr/endpoint_pair_windows.c",
     "src/core/lib/iomgr/ev_poll_and_epoll_posix.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",
@@ -753,7 +763,7 @@
     "src/core/ext/resolver/dns/native/dns_resolver.c",
     "src/core/ext/resolver/sockaddr/sockaddr_resolver.c",
     "src/core/ext/lb_policy/grpclb/load_balancer_api.c",
-    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c",
+    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c",
     "src/core/ext/lb_policy/pick_first/pick_first.c",
     "src/core/ext/lb_policy/round_robin/round_robin.c",
     "src/core/ext/census/context.c",
@@ -774,6 +784,7 @@
     "include/grpc/grpc.h",
     "include/grpc/status.h",
     "include/grpc/impl/codegen/byte_buffer.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/grpc_types.h",
@@ -890,6 +901,8 @@
     "include/grpc++/impl/rpc_service_method.h",
     "include/grpc++/impl/serialization_traits.h",
     "include/grpc++/impl/server_builder_option.h",
+    "include/grpc++/impl/server_builder_plugin.h",
+    "include/grpc++/impl/server_initializer.h",
     "include/grpc++/impl/service_type.h",
     "include/grpc++/impl/sync.h",
     "include/grpc++/impl/sync_cxx11.h",
@@ -946,6 +959,7 @@
     "include/grpc++/impl/codegen/sync_stream.h",
     "include/grpc++/impl/codegen/time.h",
     "include/grpc/impl/codegen/byte_buffer.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/grpc_types.h",
@@ -1035,6 +1049,8 @@
     "include/grpc++/impl/rpc_service_method.h",
     "include/grpc++/impl/serialization_traits.h",
     "include/grpc++/impl/server_builder_option.h",
+    "include/grpc++/impl/server_builder_plugin.h",
+    "include/grpc++/impl/server_initializer.h",
     "include/grpc++/impl/service_type.h",
     "include/grpc++/impl/sync.h",
     "include/grpc++/impl/sync_cxx11.h",
@@ -1091,6 +1107,7 @@
     "include/grpc++/impl/codegen/sync_stream.h",
     "include/grpc++/impl/codegen/time.h",
     "include/grpc/impl/codegen/byte_buffer.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/grpc_types.h",
@@ -1329,6 +1346,7 @@
     "src/core/lib/iomgr/endpoint_pair_posix.c",
     "src/core/lib/iomgr/endpoint_pair_windows.c",
     "src/core/lib/iomgr/ev_poll_and_epoll_posix.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",
@@ -1456,8 +1474,11 @@
     "src/core/ext/client_config/uri_parser.c",
     "src/core/ext/transport/chttp2/server/insecure/server_chttp2.c",
     "src/core/ext/transport/chttp2/client/insecure/channel_create.c",
+    "src/core/ext/transport/cronet/client/secure/cronet_channel_create.c",
+    "src/core/ext/transport/cronet/transport/cronet_api_dummy.c",
+    "src/core/ext/transport/cronet/transport/cronet_transport.c",
     "src/core/ext/lb_policy/grpclb/load_balancer_api.c",
-    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c",
+    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c",
     "src/core/ext/lb_policy/pick_first/pick_first.c",
     "src/core/ext/lb_policy/round_robin/round_robin.c",
     "src/core/ext/resolver/dns/native/dns_resolver.c",
@@ -1480,6 +1501,7 @@
     "include/grpc/grpc.h",
     "include/grpc/status.h",
     "include/grpc/impl/codegen/byte_buffer.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/grpc_types.h",
@@ -1499,6 +1521,7 @@
     "include/grpc/impl/codegen/sync_posix.h",
     "include/grpc/impl/codegen/sync_win32.h",
     "include/grpc/impl/codegen/time.h",
+    "include/grpc/grpc_cronet.h",
     "include/grpc/grpc_security.h",
     "include/grpc/grpc_security_constants.h",
     "include/grpc/census.h",
@@ -1520,6 +1543,7 @@
     "src/core/lib/iomgr/endpoint.h",
     "src/core/lib/iomgr/endpoint_pair.h",
     "src/core/lib/iomgr/ev_poll_and_epoll_posix.h",
+    "src/core/lib/iomgr/ev_poll_posix.h",
     "src/core/lib/iomgr/ev_posix.h",
     "src/core/lib/iomgr/exec_ctx.h",
     "src/core/lib/iomgr/executor.h",
@@ -1626,8 +1650,9 @@
     "src/core/ext/client_config/subchannel_call_holder.h",
     "src/core/ext/client_config/subchannel_index.h",
     "src/core/ext/client_config/uri_parser.h",
+    "third_party/objective_c/Cronet/cronet_c_for_grpc.h",
     "src/core/ext/lb_policy/grpclb/load_balancer_api.h",
-    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h",
+    "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h",
     "src/core/ext/census/aggregation.h",
     "src/core/ext/census/census_interface.h",
     "src/core/ext/census/census_rpc_stats.h",
diff --git a/Makefile b/Makefile
index 922e0b0..42cedf5 100644
--- a/Makefile
+++ b/Makefile
@@ -187,8 +187,8 @@
 CXX_ubsan = clang++
 LD_ubsan = clang
 LDXX_ubsan = clang++
-CPPFLAGS_ubsan = -O1 -fsanitize-coverage=edge -fsanitize=undefined -fno-omit-frame-pointer -Wno-unused-command-line-argument
-LDFLAGS_ubsan = -fsanitize=undefined
+CPPFLAGS_ubsan = -O0 -fsanitize-coverage=edge -fsanitize=undefined,unsigned-integer-overflow -fno-omit-frame-pointer -Wno-unused-command-line-argument -Wvarargs
+LDFLAGS_ubsan = -fsanitize=undefined,unsigned-integer-overflow
 DEFINES_ubsan = NDEBUG
 DEFINES_ubsan += GRPC_TEST_SLOWDOWN_BUILD_FACTOR=1.5
 
@@ -319,12 +319,19 @@
 HAS_WORKING_SHADOW = $(shell $(CHECK_SHADOW_WORKS_CMD) 2> /dev/null && echo true || echo false)
 ifeq ($(HAS_WORKING_SHADOW),true)
 W_SHADOW=-Wshadow
+NO_W_SHADOW=-Wno-shadow
 endif
-
-CHECK_NO_SHIFT_NEGATIVE_VALUE_CMD = $(CC) -std=c99 -Werror -Wno-shift-negative-value -o $(TMPOUT) -c test/build/empty.c
-HAS_NO_SHIFT_NEGATIVE_VALUE = $(shell $(CHECK_NO_SHIFT_NEGATIVE_VALUE_CMD) 2> /dev/null && echo true || echo false)
-ifeq ($(HAS_NO_SHIFT_NEGATIVE_VALUE),true)
+CHECK_EXTRA_SEMI_WORKS_CMD = $(CC) -std=c99 -Werror -Wextra-semi -o $(TMPOUT) -c test/build/extra-semi.c
+HAS_WORKING_EXTRA_SEMI = $(shell $(CHECK_EXTRA_SEMI_WORKS_CMD) 2> /dev/null && echo true || echo false)
+ifeq ($(HAS_WORKING_EXTRA_SEMI),true)
+W_EXTRA_SEMI=-Wextra-semi
+NO_W_EXTRA_SEMI=-Wno-extra-semi
+endif
+CHECK_NO_SHIFT_NEGATIVE_VALUE_WORKS_CMD = $(CC) -std=c99 -Werror -Wno-shift-negative-value -o $(TMPOUT) -c test/build/no-shift-negative-value.c
+HAS_WORKING_NO_SHIFT_NEGATIVE_VALUE = $(shell $(CHECK_NO_SHIFT_NEGATIVE_VALUE_WORKS_CMD) 2> /dev/null && echo true || echo false)
+ifeq ($(HAS_WORKING_NO_SHIFT_NEGATIVE_VALUE),true)
 W_NO_SHIFT_NEGATIVE_VALUE=-Wno-shift-negative-value
+NO_W_NO_SHIFT_NEGATIVE_VALUE=-Wshift-negative-value
 endif
 
 # The HOST compiler settings are used to compile the protoc plugins.
@@ -341,7 +348,7 @@
 DEFINES += $(EXTRA_DEFINES)
 endif
 
-CFLAGS += -std=c99 -Wsign-conversion -Wconversion $(W_SHADOW)
+CFLAGS += -std=c99 -Wsign-conversion -Wconversion $(W_SHADOW) $(W_EXTRA_SEMI)
 ifeq ($(HAS_CXX11),true)
 CXXFLAGS += -std=c++11
 else
@@ -407,7 +414,7 @@
 Q = @
 endif
 
-VERSION = 0.14.0-dev
+VERSION = 0.15.0-dev
 
 CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
 CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
@@ -472,7 +479,7 @@
 
 OPENSSL_ALPN_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/openssl-alpn.c $(addprefix -l, $(OPENSSL_LIBS)) $(LDFLAGS)
 OPENSSL_NPN_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/openssl-npn.c $(addprefix -l, $(OPENSSL_LIBS)) $(LDFLAGS)
-BORINGSSL_COMPILE_CHECK_CMD = $(CC) $(CPPFLAGS) -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare -o $(TMPOUT) test/build/boringssl.c $(LDFLAGS)
+BORINGSSL_COMPILE_CHECK_CMD = $(CC) $(CPPFLAGS) -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX $(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) -o $(TMPOUT) test/build/boringssl.c $(LDFLAGS)
 ZLIB_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/zlib.c -lz $(LDFLAGS)
 PROTOBUF_CHECK_CMD = $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $(TMPOUT) test/build/protobuf.cc -lprotobuf $(LDFLAGS)
 
@@ -1035,6 +1042,7 @@
 reconnect_interop_server: $(BINDIR)/$(CONFIG)/reconnect_interop_server
 secure_auth_context_test: $(BINDIR)/$(CONFIG)/secure_auth_context_test
 secure_sync_unary_ping_pong_test: $(BINDIR)/$(CONFIG)/secure_sync_unary_ping_pong_test
+server_builder_plugin_test: $(BINDIR)/$(CONFIG)/server_builder_plugin_test
 server_crash_test: $(BINDIR)/$(CONFIG)/server_crash_test
 server_crash_test_client: $(BINDIR)/$(CONFIG)/server_crash_test_client
 shutdown_test: $(BINDIR)/$(CONFIG)/shutdown_test
@@ -1089,6 +1097,7 @@
 head_of_line_blocking_bad_client_test: $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test
 headers_bad_client_test: $(BINDIR)/$(CONFIG)/headers_bad_client_test
 initial_settings_frame_bad_client_test: $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test
+large_metadata_bad_client_test: $(BINDIR)/$(CONFIG)/large_metadata_bad_client_test
 server_registered_method_bad_client_test: $(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test
 simple_request_bad_client_test: $(BINDIR)/$(CONFIG)/simple_request_bad_client_test
 unknown_frame_bad_client_test: $(BINDIR)/$(CONFIG)/unknown_frame_bad_client_test
@@ -1318,6 +1327,7 @@
   $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test \
   $(BINDIR)/$(CONFIG)/headers_bad_client_test \
   $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test \
+  $(BINDIR)/$(CONFIG)/large_metadata_bad_client_test \
   $(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test \
   $(BINDIR)/$(CONFIG)/simple_request_bad_client_test \
   $(BINDIR)/$(CONFIG)/unknown_frame_bad_client_test \
@@ -1401,6 +1411,7 @@
   $(BINDIR)/$(CONFIG)/reconnect_interop_server \
   $(BINDIR)/$(CONFIG)/secure_auth_context_test \
   $(BINDIR)/$(CONFIG)/secure_sync_unary_ping_pong_test \
+  $(BINDIR)/$(CONFIG)/server_builder_plugin_test \
   $(BINDIR)/$(CONFIG)/server_crash_test \
   $(BINDIR)/$(CONFIG)/server_crash_test_client \
   $(BINDIR)/$(CONFIG)/shutdown_test \
@@ -1656,6 +1667,8 @@
 	$(Q) $(BINDIR)/$(CONFIG)/headers_bad_client_test || ( echo test headers_bad_client_test failed ; exit 1 )
 	$(E) "[RUN]     Testing initial_settings_frame_bad_client_test"
 	$(Q) $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test || ( echo test initial_settings_frame_bad_client_test failed ; exit 1 )
+	$(E) "[RUN]     Testing large_metadata_bad_client_test"
+	$(Q) $(BINDIR)/$(CONFIG)/large_metadata_bad_client_test || ( echo test large_metadata_bad_client_test failed ; exit 1 )
 	$(E) "[RUN]     Testing server_registered_method_bad_client_test"
 	$(Q) $(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test || ( echo test server_registered_method_bad_client_test failed ; exit 1 )
 	$(E) "[RUN]     Testing simple_request_bad_client_test"
@@ -1732,6 +1745,8 @@
 	$(Q) $(BINDIR)/$(CONFIG)/secure_auth_context_test || ( echo test secure_auth_context_test failed ; exit 1 )
 	$(E) "[RUN]     Testing secure_sync_unary_ping_pong_test"
 	$(Q) $(BINDIR)/$(CONFIG)/secure_sync_unary_ping_pong_test || ( echo test secure_sync_unary_ping_pong_test failed ; exit 1 )
+	$(E) "[RUN]     Testing server_builder_plugin_test"
+	$(Q) $(BINDIR)/$(CONFIG)/server_builder_plugin_test || ( echo test server_builder_plugin_test failed ; exit 1 )
 	$(E) "[RUN]     Testing server_crash_test"
 	$(Q) $(BINDIR)/$(CONFIG)/server_crash_test || ( echo test server_crash_test failed ; exit 1 )
 	$(E) "[RUN]     Testing shutdown_test"
@@ -1870,15 +1885,15 @@
 	$(Q) echo "$(GRPCXX_UNSECURE_PC_FILE)" | tr , '\n' >$@
 
 ifeq ($(NO_PROTOC),true)
-$(GENDIR)/src/proto/grpc/lb/v0/load_balancer.pb.cc: protoc_dep_error
-$(GENDIR)/src/proto/grpc/lb/v0/load_balancer.grpc.pb.cc: protoc_dep_error
+$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc: protoc_dep_error
+$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc: protoc_dep_error
 else
-$(GENDIR)/src/proto/grpc/lb/v0/load_balancer.pb.cc: src/proto/grpc/lb/v0/load_balancer.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) 
+$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc: src/proto/grpc/lb/v1/load_balancer.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) 
 	$(E) "[PROTOC]  Generating protobuf CC file from $<"
 	$(Q) mkdir -p `dirname $@`
 	$(Q) $(PROTOC) --cpp_out=$(GENDIR) $<
 
-$(GENDIR)/src/proto/grpc/lb/v0/load_balancer.grpc.pb.cc: src/proto/grpc/lb/v0/load_balancer.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) 
+$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc: src/proto/grpc/lb/v1/load_balancer.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) 
 	$(E) "[GRPC]    Generating gRPC's protobuf service CC file from $<"
 	$(Q) mkdir -p `dirname $@`
 	$(Q) $(PROTOC) --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(BINDIR)/$(CONFIG)/grpc_cpp_plugin $<
@@ -2496,6 +2511,7 @@
     src/core/lib/iomgr/endpoint_pair_posix.c \
     src/core/lib/iomgr/endpoint_pair_windows.c \
     src/core/lib/iomgr/ev_poll_and_epoll_posix.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 \
@@ -2623,8 +2639,11 @@
     src/core/ext/client_config/uri_parser.c \
     src/core/ext/transport/chttp2/server/insecure/server_chttp2.c \
     src/core/ext/transport/chttp2/client/insecure/channel_create.c \
+    src/core/ext/transport/cronet/client/secure/cronet_channel_create.c \
+    src/core/ext/transport/cronet/transport/cronet_api_dummy.c \
+    src/core/ext/transport/cronet/transport/cronet_transport.c \
     src/core/ext/lb_policy/grpclb/load_balancer_api.c \
-    src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c \
+    src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c \
     third_party/nanopb/pb_common.c \
     third_party/nanopb/pb_decode.c \
     third_party/nanopb/pb_encode.c \
@@ -2650,6 +2669,7 @@
     include/grpc/grpc.h \
     include/grpc/status.h \
     include/grpc/impl/codegen/byte_buffer.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/grpc_types.h \
@@ -2669,6 +2689,7 @@
     include/grpc/impl/codegen/sync_posix.h \
     include/grpc/impl/codegen/sync_win32.h \
     include/grpc/impl/codegen/time.h \
+    include/grpc/grpc_cronet.h \
     include/grpc/grpc_security.h \
     include/grpc/grpc_security_constants.h \
     include/grpc/census.h \
@@ -2837,6 +2858,7 @@
     src/core/lib/iomgr/endpoint_pair_posix.c \
     src/core/lib/iomgr/endpoint_pair_windows.c \
     src/core/lib/iomgr/ev_poll_and_epoll_posix.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 \
@@ -2946,7 +2968,7 @@
     src/core/ext/resolver/dns/native/dns_resolver.c \
     src/core/ext/resolver/sockaddr/sockaddr_resolver.c \
     src/core/ext/lb_policy/grpclb/load_balancer_api.c \
-    src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c \
+    src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c \
     third_party/nanopb/pb_common.c \
     third_party/nanopb/pb_decode.c \
     third_party/nanopb/pb_encode.c \
@@ -2970,6 +2992,7 @@
     include/grpc/grpc.h \
     include/grpc/status.h \
     include/grpc/impl/codegen/byte_buffer.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/grpc_types.h \
@@ -3200,6 +3223,8 @@
     include/grpc++/impl/rpc_service_method.h \
     include/grpc++/impl/serialization_traits.h \
     include/grpc++/impl/server_builder_option.h \
+    include/grpc++/impl/server_builder_plugin.h \
+    include/grpc++/impl/server_initializer.h \
     include/grpc++/impl/service_type.h \
     include/grpc++/impl/sync.h \
     include/grpc++/impl/sync_cxx11.h \
@@ -3256,6 +3281,7 @@
     include/grpc++/impl/codegen/sync_stream.h \
     include/grpc++/impl/codegen/time.h \
     include/grpc/impl/codegen/byte_buffer.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/grpc_types.h \
@@ -3503,6 +3529,8 @@
     include/grpc++/impl/rpc_service_method.h \
     include/grpc++/impl/serialization_traits.h \
     include/grpc++/impl/server_builder_option.h \
+    include/grpc++/impl/server_builder_plugin.h \
+    include/grpc++/impl/server_initializer.h \
     include/grpc++/impl/service_type.h \
     include/grpc++/impl/sync.h \
     include/grpc++/impl/sync_cxx11.h \
@@ -3559,6 +3587,7 @@
     include/grpc++/impl/codegen/sync_stream.h \
     include/grpc++/impl/codegen/time.h \
     include/grpc/impl/codegen/byte_buffer.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/grpc_types.h \
@@ -4322,7 +4351,7 @@
 LIBBORINGSSL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_SRC))))
 
 $(LIBBORINGSSL_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
-$(LIBBORINGSSL_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare
+$(LIBBORINGSSL_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.a: $(ZLIB_DEP)  $(LIBBORINGSSL_OBJS) 
 	$(E) "[AR]      Creating $@"
@@ -4351,7 +4380,7 @@
 LIBBORINGSSL_TEST_UTIL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_TEST_UTIL_SRC))))
 
 $(LIBBORINGSSL_TEST_UTIL_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
-$(LIBBORINGSSL_TEST_UTIL_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare
+$(LIBBORINGSSL_TEST_UTIL_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)
 
@@ -4389,7 +4418,7 @@
 LIBBORINGSSL_AES_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_AES_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_AES_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_AES_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
+$(LIBBORINGSSL_AES_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)
 
@@ -4427,7 +4456,7 @@
 LIBBORINGSSL_ASN1_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_ASN1_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_ASN1_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_ASN1_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
+$(LIBBORINGSSL_ASN1_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)
 
@@ -4465,7 +4494,7 @@
 LIBBORINGSSL_BASE64_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_BASE64_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_BASE64_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_BASE64_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
+$(LIBBORINGSSL_BASE64_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)
 
@@ -4503,7 +4532,7 @@
 LIBBORINGSSL_BIO_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_BIO_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_BIO_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_BIO_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
+$(LIBBORINGSSL_BIO_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)
 
@@ -4541,7 +4570,7 @@
 LIBBORINGSSL_BN_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_BN_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_BN_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_BN_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
+$(LIBBORINGSSL_BN_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)
 
@@ -4579,7 +4608,7 @@
 LIBBORINGSSL_BYTESTRING_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_BYTESTRING_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_BYTESTRING_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_BYTESTRING_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
+$(LIBBORINGSSL_BYTESTRING_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)
 
@@ -4617,7 +4646,7 @@
 LIBBORINGSSL_AEAD_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_AEAD_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_AEAD_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_AEAD_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
+$(LIBBORINGSSL_AEAD_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)
 
@@ -4655,7 +4684,7 @@
 LIBBORINGSSL_CIPHER_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_CIPHER_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_CIPHER_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_CIPHER_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
+$(LIBBORINGSSL_CIPHER_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)
 
@@ -4693,7 +4722,7 @@
 LIBBORINGSSL_CMAC_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_CMAC_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_CMAC_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_CMAC_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
+$(LIBBORINGSSL_CMAC_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)
 
@@ -4731,7 +4760,7 @@
 LIBBORINGSSL_CONSTANT_TIME_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_CONSTANT_TIME_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_CONSTANT_TIME_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_CONSTANT_TIME_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
+$(LIBBORINGSSL_CONSTANT_TIME_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_constant_time_test_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_CONSTANT_TIME_TEST_LIB_OBJS) 
 	$(E) "[AR]      Creating $@"
@@ -4758,7 +4787,7 @@
 LIBBORINGSSL_ED25519_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_ED25519_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_ED25519_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_ED25519_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
+$(LIBBORINGSSL_ED25519_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)
 
@@ -4796,7 +4825,7 @@
 LIBBORINGSSL_X25519_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_X25519_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_X25519_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_X25519_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
+$(LIBBORINGSSL_X25519_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)
 
@@ -4834,7 +4863,7 @@
 LIBBORINGSSL_DH_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_DH_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_DH_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_DH_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
+$(LIBBORINGSSL_DH_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)
 
@@ -4872,7 +4901,7 @@
 LIBBORINGSSL_DIGEST_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_DIGEST_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_DIGEST_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_DIGEST_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
+$(LIBBORINGSSL_DIGEST_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)
 
@@ -4910,7 +4939,7 @@
 LIBBORINGSSL_DSA_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_DSA_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_DSA_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_DSA_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
+$(LIBBORINGSSL_DSA_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_dsa_test_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_DSA_TEST_LIB_OBJS) 
 	$(E) "[AR]      Creating $@"
@@ -4937,7 +4966,7 @@
 LIBBORINGSSL_EC_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_EC_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_EC_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_EC_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
+$(LIBBORINGSSL_EC_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)
 
@@ -4975,7 +5004,7 @@
 LIBBORINGSSL_EXAMPLE_MUL_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_EXAMPLE_MUL_LIB_SRC))))
 
 $(LIBBORINGSSL_EXAMPLE_MUL_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_EXAMPLE_MUL_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare
+$(LIBBORINGSSL_EXAMPLE_MUL_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_example_mul_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_EXAMPLE_MUL_LIB_OBJS) 
 	$(E) "[AR]      Creating $@"
@@ -5002,7 +5031,7 @@
 LIBBORINGSSL_ECDSA_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_ECDSA_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_ECDSA_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_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
+$(LIBBORINGSSL_ECDSA_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)
 
@@ -5040,7 +5069,7 @@
 LIBBORINGSSL_ERR_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_ERR_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_ERR_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_ERR_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
+$(LIBBORINGSSL_ERR_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)
 
@@ -5078,7 +5107,7 @@
 LIBBORINGSSL_EVP_EXTRA_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_EVP_EXTRA_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_EVP_EXTRA_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_EVP_EXTRA_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
+$(LIBBORINGSSL_EVP_EXTRA_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)
 
@@ -5116,7 +5145,7 @@
 LIBBORINGSSL_EVP_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_EVP_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_EVP_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_EVP_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
+$(LIBBORINGSSL_EVP_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)
 
@@ -5154,7 +5183,7 @@
 LIBBORINGSSL_PBKDF_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_PBKDF_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_PBKDF_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_PBKDF_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
+$(LIBBORINGSSL_PBKDF_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)
 
@@ -5192,7 +5221,7 @@
 LIBBORINGSSL_HKDF_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_HKDF_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_HKDF_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_HKDF_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
+$(LIBBORINGSSL_HKDF_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_hkdf_test_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_HKDF_TEST_LIB_OBJS) 
 	$(E) "[AR]      Creating $@"
@@ -5219,7 +5248,7 @@
 LIBBORINGSSL_HMAC_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_HMAC_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_HMAC_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_HMAC_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
+$(LIBBORINGSSL_HMAC_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)
 
@@ -5257,7 +5286,7 @@
 LIBBORINGSSL_LHASH_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_LHASH_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_LHASH_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_LHASH_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
+$(LIBBORINGSSL_LHASH_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_lhash_test_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_LHASH_TEST_LIB_OBJS) 
 	$(E) "[AR]      Creating $@"
@@ -5284,7 +5313,7 @@
 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
+$(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) 
 	$(E) "[AR]      Creating $@"
@@ -5311,7 +5340,7 @@
 LIBBORINGSSL_PKCS12_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_PKCS12_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_PKCS12_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_PKCS12_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
+$(LIBBORINGSSL_PKCS12_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)
 
@@ -5349,7 +5378,7 @@
 LIBBORINGSSL_PKCS8_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_PKCS8_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_PKCS8_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_PKCS8_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
+$(LIBBORINGSSL_PKCS8_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)
 
@@ -5387,7 +5416,7 @@
 LIBBORINGSSL_POLY1305_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_POLY1305_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_POLY1305_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_POLY1305_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
+$(LIBBORINGSSL_POLY1305_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)
 
@@ -5425,7 +5454,7 @@
 LIBBORINGSSL_REFCOUNT_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_REFCOUNT_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_REFCOUNT_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_REFCOUNT_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
+$(LIBBORINGSSL_REFCOUNT_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_refcount_test_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_REFCOUNT_TEST_LIB_OBJS) 
 	$(E) "[AR]      Creating $@"
@@ -5452,7 +5481,7 @@
 LIBBORINGSSL_RSA_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_RSA_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_RSA_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_RSA_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
+$(LIBBORINGSSL_RSA_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)
 
@@ -5490,7 +5519,7 @@
 LIBBORINGSSL_THREAD_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_THREAD_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_THREAD_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_THREAD_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
+$(LIBBORINGSSL_THREAD_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_thread_test_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_THREAD_TEST_LIB_OBJS) 
 	$(E) "[AR]      Creating $@"
@@ -5517,7 +5546,7 @@
 LIBBORINGSSL_PKCS7_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_PKCS7_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_PKCS7_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_PKCS7_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
+$(LIBBORINGSSL_PKCS7_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_pkcs7_test_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_PKCS7_TEST_LIB_OBJS) 
 	$(E) "[AR]      Creating $@"
@@ -5544,7 +5573,7 @@
 LIBBORINGSSL_X509_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_X509_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_X509_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_X509_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
+$(LIBBORINGSSL_X509_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)
 
@@ -5582,7 +5611,7 @@
 LIBBORINGSSL_TAB_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_TAB_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_TAB_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_TAB_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
+$(LIBBORINGSSL_TAB_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_tab_test_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_TAB_TEST_LIB_OBJS) 
 	$(E) "[AR]      Creating $@"
@@ -5609,7 +5638,7 @@
 LIBBORINGSSL_V3NAME_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_V3NAME_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_V3NAME_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_V3NAME_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
+$(LIBBORINGSSL_V3NAME_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_v3name_test_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_V3NAME_TEST_LIB_OBJS) 
 	$(E) "[AR]      Creating $@"
@@ -5636,7 +5665,7 @@
 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
+$(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 $@"
@@ -5663,7 +5692,7 @@
 LIBBORINGSSL_SSL_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_SSL_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_SSL_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_SSL_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
+$(LIBBORINGSSL_SSL_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)
 
@@ -10742,7 +10771,7 @@
 
 
 GRPCLB_API_TEST_SRC = \
-    $(GENDIR)/src/proto/grpc/lb/v0/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v0/load_balancer.grpc.pb.cc \
+    $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc \
     test/cpp/grpclb/grpclb_api_test.cc \
 
 GRPCLB_API_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPCLB_API_TEST_SRC))))
@@ -10774,7 +10803,7 @@
 
 endif
 
-$(OBJDIR)/$(CONFIG)/src/proto/grpc/lb/v0/load_balancer.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.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
 
 $(OBJDIR)/$(CONFIG)/test/cpp/grpclb/grpclb_api_test.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a
 
@@ -10785,7 +10814,7 @@
 -include $(GRPCLB_API_TEST_OBJS:.o=.dep)
 endif
 endif
-$(OBJDIR)/$(CONFIG)/test/cpp/grpclb/grpclb_api_test.o: $(GENDIR)/src/proto/grpc/lb/v0/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v0/load_balancer.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/grpclb/grpclb_api_test.o: $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc
 
 
 HYBRID_END2END_TEST_SRC = \
@@ -11479,6 +11508,49 @@
 endif
 
 
+SERVER_BUILDER_PLUGIN_TEST_SRC = \
+    test/cpp/end2end/server_builder_plugin_test.cc \
+
+SERVER_BUILDER_PLUGIN_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_BUILDER_PLUGIN_TEST_SRC))))
+ifeq ($(NO_SECURE),true)
+
+# You can't build secure targets if you don't have OpenSSL.
+
+$(BINDIR)/$(CONFIG)/server_builder_plugin_test: openssl_dep_error
+
+else
+
+
+
+
+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)/server_builder_plugin_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/server_builder_plugin_test: $(PROTOBUF_DEP) $(SERVER_BUILDER_PLUGIN_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) $(SERVER_BUILDER_PLUGIN_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)/server_builder_plugin_test
+
+endif
+
+endif
+
+$(OBJDIR)/$(CONFIG)/test/cpp/end2end/server_builder_plugin_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_server_builder_plugin_test: $(SERVER_BUILDER_PLUGIN_TEST_OBJS:.o=.dep)
+
+ifneq ($(NO_SECURE),true)
+ifneq ($(NO_DEPS),true)
+-include $(SERVER_BUILDER_PLUGIN_TEST_OBJS:.o=.dep)
+endif
+endif
+
+
 SERVER_CRASH_TEST_SRC = \
     test/cpp/end2end/server_crash_test.cc \
 
@@ -11978,7 +12050,7 @@
 # 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_AES_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_AES_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_AES_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_AES_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12005,7 +12077,7 @@
 # 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_ASN1_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_ASN1_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_ASN1_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_ASN1_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12032,7 +12104,7 @@
 # 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_BASE64_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_BASE64_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_BASE64_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_BASE64_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12059,7 +12131,7 @@
 # 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_BIO_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_BIO_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_BIO_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_BIO_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12086,7 +12158,7 @@
 # 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_BN_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_BN_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_BN_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_BN_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12113,7 +12185,7 @@
 # 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_BYTESTRING_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_BYTESTRING_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_BYTESTRING_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_BYTESTRING_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12140,7 +12212,7 @@
 # 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
+$(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
 
@@ -12167,7 +12239,7 @@
 # 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_CIPHER_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_CIPHER_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_CIPHER_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_CIPHER_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12194,7 +12266,7 @@
 # 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_CMAC_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_CMAC_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_CMAC_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_CMAC_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12221,7 +12293,7 @@
 # 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_CONSTANT_TIME_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_CONSTANT_TIME_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_CONSTANT_TIME_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_CONSTANT_TIME_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12248,7 +12320,7 @@
 # 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_ED25519_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_ED25519_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_ED25519_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_ED25519_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12275,7 +12347,7 @@
 # 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
+$(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
 
@@ -12302,7 +12374,7 @@
 # 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_DH_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_DH_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_DH_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_DH_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12329,7 +12401,7 @@
 # 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_DIGEST_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_DIGEST_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_DIGEST_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_DIGEST_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12356,7 +12428,7 @@
 # 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_DSA_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_DSA_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_DSA_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_DSA_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12383,7 +12455,7 @@
 # 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_EC_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_EC_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_EC_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_EC_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12410,7 +12482,7 @@
 # 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_EXAMPLE_MUL_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_EXAMPLE_MUL_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_EXAMPLE_MUL_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_EXAMPLE_MUL_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12437,7 +12509,7 @@
 # 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
+$(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
 
@@ -12464,7 +12536,7 @@
 # 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
+$(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
 
@@ -12491,7 +12563,7 @@
 # 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_EVP_EXTRA_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_EVP_EXTRA_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_EVP_EXTRA_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_EVP_EXTRA_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12518,7 +12590,7 @@
 # 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_EVP_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_EVP_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_EVP_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_EVP_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12545,7 +12617,7 @@
 # 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_PBKDF_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_PBKDF_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_PBKDF_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_PBKDF_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12572,7 +12644,7 @@
 # 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_HKDF_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_HKDF_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_HKDF_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_HKDF_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12599,7 +12671,7 @@
 # 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_HMAC_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_HMAC_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_HMAC_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_HMAC_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12626,7 +12698,7 @@
 # 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_LHASH_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_LHASH_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_LHASH_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_LHASH_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12653,7 +12725,7 @@
 # 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_GCM_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_GCM_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_GCM_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_GCM_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12680,7 +12752,7 @@
 # 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
+$(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
 
@@ -12707,7 +12779,7 @@
 # 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_PKCS8_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_PKCS8_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_PKCS8_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_PKCS8_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12734,7 +12806,7 @@
 # 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_POLY1305_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_POLY1305_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_POLY1305_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_POLY1305_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12761,7 +12833,7 @@
 # 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_REFCOUNT_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_REFCOUNT_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_REFCOUNT_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_REFCOUNT_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12788,7 +12860,7 @@
 # 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_RSA_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_RSA_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_RSA_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_RSA_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12815,7 +12887,7 @@
 # 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_THREAD_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_THREAD_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_THREAD_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_THREAD_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12842,7 +12914,7 @@
 # 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_PKCS7_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_PKCS7_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_PKCS7_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_PKCS7_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12869,7 +12941,7 @@
 # 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_X509_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_X509_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_X509_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_X509_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12896,7 +12968,7 @@
 # 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_TAB_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_TAB_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_TAB_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_TAB_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12923,7 +12995,7 @@
 # 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_V3NAME_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+$(BORINGSSL_V3NAME_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_V3NAME_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_V3NAME_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
 
@@ -12950,7 +13022,7 @@
 # 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
+$(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
 
@@ -12977,7 +13049,7 @@
 # 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
+$(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
 
@@ -13100,6 +13172,26 @@
 endif
 
 
+LARGE_METADATA_BAD_CLIENT_TEST_SRC = \
+    test/core/bad_client/tests/large_metadata.c \
+
+LARGE_METADATA_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LARGE_METADATA_BAD_CLIENT_TEST_SRC))))
+
+
+$(BINDIR)/$(CONFIG)/large_metadata_bad_client_test: $(LARGE_METADATA_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libbad_client_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
+	$(E) "[LD]      Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(LD) $(LDFLAGS) $(LARGE_METADATA_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libbad_client_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/large_metadata_bad_client_test
+
+$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/large_metadata.o:  $(LIBDIR)/$(CONFIG)/libbad_client_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
+
+deps_large_metadata_bad_client_test: $(LARGE_METADATA_BAD_CLIENT_TEST_OBJS:.o=.dep)
+
+ifneq ($(NO_DEPS),true)
+-include $(LARGE_METADATA_BAD_CLIENT_TEST_OBJS:.o=.dep)
+endif
+
+
 SERVER_REGISTERED_METHOD_BAD_CLIENT_TEST_SRC = \
     test/core/bad_client/tests/server_registered_method.c \
 
@@ -14313,6 +14405,9 @@
 # otherwise parallel compilation will fail if a source is compiled first.
 src/core/ext/transport/chttp2/client/secure/secure_channel_create.c: $(OPENSSL_DEP)
 src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c: $(OPENSSL_DEP)
+src/core/ext/transport/cronet/client/secure/cronet_channel_create.c: $(OPENSSL_DEP)
+src/core/ext/transport/cronet/transport/cronet_api_dummy.c: $(OPENSSL_DEP)
+src/core/ext/transport/cronet/transport/cronet_transport.c: $(OPENSSL_DEP)
 src/core/lib/http/httpcli_security_connector.c: $(OPENSSL_DEP)
 src/core/lib/security/b64.c: $(OPENSSL_DEP)
 src/core/lib/security/client_auth_filter.c: $(OPENSSL_DEP)
diff --git a/binding.gyp b/binding.gyp
index 4314ab7..760bb24 100644
--- a/binding.gyp
+++ b/binding.gyp
@@ -582,6 +582,7 @@
         'src/core/lib/iomgr/endpoint_pair_posix.c',
         'src/core/lib/iomgr/endpoint_pair_windows.c',
         'src/core/lib/iomgr/ev_poll_and_epoll_posix.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',
@@ -709,8 +710,11 @@
         'src/core/ext/client_config/uri_parser.c',
         'src/core/ext/transport/chttp2/server/insecure/server_chttp2.c',
         'src/core/ext/transport/chttp2/client/insecure/channel_create.c',
+        'src/core/ext/transport/cronet/client/secure/cronet_channel_create.c',
+        'src/core/ext/transport/cronet/transport/cronet_api_dummy.c',
+        'src/core/ext/transport/cronet/transport/cronet_transport.c',
         'src/core/ext/lb_policy/grpclb/load_balancer_api.c',
-        'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c',
+        'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c',
         'third_party/nanopb/pb_common.c',
         'third_party/nanopb/pb_decode.c',
         'third_party/nanopb/pb_encode.c',
diff --git a/build.yaml b/build.yaml
index 441752d..ac61612 100644
--- a/build.yaml
+++ b/build.yaml
@@ -7,7 +7,7 @@
   '#3': Use "-preN" suffixes to identify pre-release versions
   '#4': Per-language overrides are possible with (eg) ruby_version tag here
   '#5': See the expand_version.py for all the quirks here
-  version: 0.14.0-dev
+  version: 0.15.0-dev
 filegroups:
 - name: census
   public_headers:
@@ -166,6 +166,7 @@
   - src/core/lib/iomgr/endpoint.h
   - src/core/lib/iomgr/endpoint_pair.h
   - src/core/lib/iomgr/ev_poll_and_epoll_posix.h
+  - src/core/lib/iomgr/ev_poll_posix.h
   - src/core/lib/iomgr/ev_posix.h
   - src/core/lib/iomgr/exec_ctx.h
   - src/core/lib/iomgr/executor.h
@@ -240,6 +241,7 @@
   - src/core/lib/iomgr/endpoint_pair_posix.c
   - src/core/lib/iomgr/endpoint_pair_windows.c
   - src/core/lib/iomgr/ev_poll_and_epoll_posix.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
@@ -351,6 +353,7 @@
 - name: grpc_codegen
   public_headers:
   - include/grpc/impl/codegen/byte_buffer.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/grpc_types.h
@@ -361,10 +364,10 @@
 - name: grpc_lb_policy_grpclb
   headers:
   - src/core/ext/lb_policy/grpclb/load_balancer_api.h
-  - src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h
+  - src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h
   src:
   - src/core/ext/lb_policy/grpclb/load_balancer_api.c
-  - src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c
+  - src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c
   uses:
   - grpc_base
   - grpc_client_config
@@ -399,6 +402,7 @@
   - grpc_client_config
 - name: grpc_secure
   public_headers:
+  - include/grpc/grpc_cronet.h
   - include/grpc/grpc_security.h
   - include/grpc/grpc_security_constants.h
   headers:
@@ -546,6 +550,16 @@
   - grpc_transport_chttp2
   - grpc_base
   - grpc_secure
+- name: grpc_transport_cronet_client_secure
+  headers:
+  - third_party/objective_c/Cronet/cronet_c_for_grpc.h
+  src:
+  - src/core/ext/transport/cronet/client/secure/cronet_channel_create.c
+  - src/core/ext/transport/cronet/transport/cronet_api_dummy.c
+  - src/core/ext/transport/cronet/transport/cronet_transport.c
+  filegroups:
+  - grpc_base
+  - grpc_transport_chttp2
 - name: nanopb
   headers:
   - third_party/nanopb/pb.h
@@ -590,6 +604,8 @@
   - include/grpc++/impl/rpc_service_method.h
   - include/grpc++/impl/serialization_traits.h
   - include/grpc++/impl/server_builder_option.h
+  - include/grpc++/impl/server_builder_plugin.h
+  - include/grpc++/impl/server_initializer.h
   - include/grpc++/impl/service_type.h
   - include/grpc++/impl/sync.h
   - include/grpc++/impl/sync_cxx11.h
@@ -733,6 +749,7 @@
   - grpc_transport_chttp2_client_secure
   - grpc_transport_chttp2_server_insecure
   - grpc_transport_chttp2_client_insecure
+  - grpc_transport_cronet_client_secure
   - grpc_lb_policy_grpclb
   - grpc_lb_policy_pick_first
   - grpc_lb_policy_round_robin
@@ -2642,7 +2659,7 @@
   build: test
   language: c++
   src:
-  - src/proto/grpc/lb/v0/load_balancer.proto
+  - src/proto/grpc/lb/v1/load_balancer.proto
   - test/cpp/grpclb/grpclb_api_test.cc
   deps:
   - grpc++_test_util
@@ -2914,6 +2931,19 @@
   - mac
   - linux
   - posix
+- name: server_builder_plugin_test
+  gtest: true
+  build: test
+  language: c++
+  src:
+  - test/cpp/end2end/server_builder_plugin_test.cc
+  deps:
+  - grpc++_test_util
+  - grpc_test_util
+  - grpc++
+  - grpc
+  - gpr_test_util
+  - gpr
 - name: server_crash_test
   gtest: true
   cpu_cost: 0.1
@@ -3239,19 +3269,21 @@
     timeout_multiplier: 5
   ubsan:
     CC: clang
-    CPPFLAGS: -O1 -fsanitize-coverage=edge -fsanitize=undefined -fno-omit-frame-pointer
-      -Wno-unused-command-line-argument
+    CPPFLAGS: -O0 -fsanitize-coverage=edge -fsanitize=undefined,unsigned-integer-overflow
+      -fno-omit-frame-pointer -Wno-unused-command-line-argument -Wvarargs
     CXX: clang++
     DEFINES: NDEBUG
     LD: clang
-    LDFLAGS: -fsanitize=undefined
+    LDFLAGS: -fsanitize=undefined,unsigned-integer-overflow
     LDXX: clang++
     compile_the_world: true
+    test_environ:
+      UBSAN_OPTIONS: print_stacktrace=1
     timeout_multiplier: 1.5
 defaults:
   boringssl:
     CFLAGS: -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas
-      -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare
+      -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
     CPPFLAGS: -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM
       -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
   global:
diff --git a/composer.json b/composer.json
index 97b1a5c..b77a59e 100644
--- a/composer.json
+++ b/composer.json
@@ -2,7 +2,7 @@
   "name": "grpc/grpc",
   "type": "library",
   "description": "gRPC library for PHP",
-  "version": "0.14.0",
+  "version": "0.15.0",
   "keywords": ["rpc"],
   "homepage": "http://grpc.io",
   "license": "BSD-3-Clause",
diff --git a/config.m4 b/config.m4
index 74f9ad2..6ed1887 100644
--- a/config.m4
+++ b/config.m4
@@ -101,6 +101,7 @@
     src/core/lib/iomgr/endpoint_pair_posix.c \
     src/core/lib/iomgr/endpoint_pair_windows.c \
     src/core/lib/iomgr/ev_poll_and_epoll_posix.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 \
@@ -228,8 +229,11 @@
     src/core/ext/client_config/uri_parser.c \
     src/core/ext/transport/chttp2/server/insecure/server_chttp2.c \
     src/core/ext/transport/chttp2/client/insecure/channel_create.c \
+    src/core/ext/transport/cronet/client/secure/cronet_channel_create.c \
+    src/core/ext/transport/cronet/transport/cronet_api_dummy.c \
+    src/core/ext/transport/cronet/transport/cronet_transport.c \
     src/core/ext/lb_policy/grpclb/load_balancer_api.c \
-    src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c \
+    src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c \
     third_party/nanopb/pb_common.c \
     third_party/nanopb/pb_decode.c \
     third_party/nanopb/pb_encode.c \
@@ -555,7 +559,7 @@
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/census)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/client_config)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/lb_policy/grpclb)
-  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/lb_policy/pick_first)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/lb_policy/round_robin)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/resolver/dns/native)
@@ -566,6 +570,8 @@
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server/insecure)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server/secure)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/transport)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/cronet/client/secure)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/cronet/transport)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/channel)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/compression)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/debug)
diff --git a/examples/cpp/helloworld/Makefile b/examples/cpp/helloworld/Makefile
index 470b835..58a82db 100644
--- a/examples/cpp/helloworld/Makefile
+++ b/examples/cpp/helloworld/Makefile
@@ -41,7 +41,7 @@
 
 vpath %.proto $(PROTOS_PATH)
 
-all: system-check greeter_client greeter_server greeter_async_client greeter_async_server
+all: system-check greeter_client greeter_server greeter_async_client greeter_async_client2 greeter_async_server
 
 greeter_client: helloworld.pb.o helloworld.grpc.pb.o greeter_client.o
 	$(CXX) $^ $(LDFLAGS) -o $@
@@ -52,6 +52,9 @@
 greeter_async_client: helloworld.pb.o helloworld.grpc.pb.o greeter_async_client.o
 	$(CXX) $^ $(LDFLAGS) -o $@
 
+greeter_async_client2: helloworld.pb.o helloworld.grpc.pb.o greeter_async_client2.o
+	$(CXX) $^ $(LDFLAGS) -o $@
+
 greeter_async_server: helloworld.pb.o helloworld.grpc.pb.o greeter_async_server.o
 	$(CXX) $^ $(LDFLAGS) -o $@
 
@@ -64,7 +67,7 @@
 	$(PROTOC) -I $(PROTOS_PATH) --cpp_out=. $<
 
 clean:
-	rm -f *.o *.pb.cc *.pb.h greeter_client greeter_server greeter_async_client greeter_async_server
+	rm -f *.o *.pb.cc *.pb.h greeter_client greeter_server greeter_async_client greeter_async_client2 greeter_async_server
 
 
 # The following is to test your system and ensure a smoother experience.
diff --git a/examples/cpp/helloworld/greeter_async_client.cc b/examples/cpp/helloworld/greeter_async_client.cc
index 3501426..c1f5eb5 100644
--- a/examples/cpp/helloworld/greeter_async_client.cc
+++ b/examples/cpp/helloworld/greeter_async_client.cc
@@ -53,7 +53,7 @@
   explicit GreeterClient(std::shared_ptr<Channel> channel)
       : stub_(Greeter::NewStub(channel)) {}
 
-  // Assambles the client's payload, sends it and presents the response back
+  // Assembles the client's payload, sends it and presents the response back
   // from the server.
   std::string SayHello(const std::string& user) {
     // Data we are sending to the server.
@@ -74,9 +74,9 @@
     // Storage for the status of the RPC upon completion.
     Status status;
 
-    // stub_->AsyncSayHello() perform the RPC call, returning an instance we
-    // store in "rpc". Because we are using the asynchronous API, we need the
-    // hold on to the "rpc" instance in order to get updates on the ongoig RPC.
+    // stub_->AsyncSayHello() performs the RPC call, returning an instance we
+    // store in "rpc". Because we are using the asynchronous API, we need to
+    // hold on to the "rpc" instance in order to get updates on the ongoing RPC.
     std::unique_ptr<ClientAsyncResponseReader<HelloReply> > rpc(
         stub_->AsyncSayHello(&context, request, &cq));
 
diff --git a/examples/cpp/helloworld/greeter_async_client2.cc b/examples/cpp/helloworld/greeter_async_client2.cc
new file mode 100644
index 0000000..0902376
--- /dev/null
+++ b/examples/cpp/helloworld/greeter_async_client2.cc
@@ -0,0 +1,153 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <iostream>
+#include <memory>
+#include <string>
+
+#include <grpc++/grpc++.h>
+#include <thread>
+
+#include "helloworld.grpc.pb.h"
+
+using grpc::Channel;
+using grpc::ClientAsyncResponseReader;
+using grpc::ClientContext;
+using grpc::CompletionQueue;
+using grpc::Status;
+using helloworld::HelloRequest;
+using helloworld::HelloReply;
+using helloworld::Greeter;
+
+class GreeterClient {
+  public:
+    explicit GreeterClient(std::shared_ptr<Channel> channel)
+            : stub_(Greeter::NewStub(channel)) {}
+
+    // Assembles the client's payload and sends it to the server.
+    void SayHello(const std::string& user) {
+        // Data we are sending to the server.
+        HelloRequest request;
+        request.set_name(user);
+
+        // Call object to store rpc data
+        AsyncClientCall* call = new AsyncClientCall;
+
+        // stub_->AsyncSayHello() performs the RPC call, returning an instance to
+        // store in "call". Because we are using the asynchronous API, we need to
+        // hold on to the "call" instance in order to get updates on the ongoing RPC.
+        call->response_reader = stub_->AsyncSayHello(&call->context, request, &cq_);
+
+
+        // Request that, upon completion of the RPC, "reply" be updated with the
+        // server's response; "status" with the indication of whether the operation
+        // was successful. Tag the request with the memory address of the call object.
+        call->response_reader->Finish(&call->reply, &call->status, (void*)call);
+
+    }
+
+    // Loop while listening for completed responses.
+    // Prints out the response from the server.
+    void AsyncCompleteRpc() {
+        void* got_tag;
+        bool ok = false;
+
+        // Block until the next result is available in the completion queue "cq".
+        while (cq_.Next(&got_tag, &ok)) {
+            // The tag in this example is the memory location of the call object
+            AsyncClientCall* call = static_cast<AsyncClientCall*>(got_tag);
+
+            // Verify that the request was completed successfully. Note that "ok"
+            // corresponds solely to the request for updates introduced by Finish().
+            GPR_ASSERT(ok);
+
+            if (call->status.ok())
+                std::cout << "Greeter received: " << call->reply.message() << std::endl;
+            else
+                std::cout << "RPC failed" << std::endl;
+
+            // Once we're complete, deallocate the call object.
+            delete call;
+        }
+    }
+
+  private:
+
+    // struct for keeping state and data information
+    struct AsyncClientCall {
+        // Container for the data we expect from the server.
+        HelloReply reply;
+
+        // Context for the client. It could be used to convey extra information to
+        // the server and/or tweak certain RPC behaviors.
+        ClientContext context;
+
+        // Storage for the status of the RPC upon completion.
+        Status status;
+
+
+        std::unique_ptr<ClientAsyncResponseReader<HelloReply>> response_reader;
+    };
+
+    // Out of the passed in Channel comes the stub, stored here, our view of the
+    // server's exposed services.
+    std::unique_ptr<Greeter::Stub> stub_;
+
+    // The producer-consumer queue we use to communicate asynchronously with the
+    // gRPC runtime.
+    CompletionQueue cq_;
+};
+
+int main(int argc, char** argv) {
+
+
+    // Instantiate the client. It requires a channel, out of which the actual RPCs
+    // are created. This channel models a connection to an endpoint (in this case,
+    // localhost at port 50051). We indicate that the channel isn't authenticated
+    // (use of InsecureChannelCredentials()).
+    GreeterClient greeter(grpc::CreateChannel(
+            "localhost:50051", grpc::InsecureChannelCredentials()));
+
+    // Spawn reader thread that loops indefinitely
+    std::thread thread_ = std::thread(&GreeterClient::AsyncCompleteRpc, &greeter);
+
+    for (int i = 0; i < 100; i++) {
+        std::string user("world " + std::to_string(i));
+        greeter.SayHello(user);  // The actual RPC call!
+    }
+
+    std::cout << "Press control-c to quit" << std::endl << std::endl;
+    thread_.join();  //blocks forever
+
+    return 0;
+}
diff --git a/examples/node/README.md b/examples/node/README.md
index 2887883..59fb4a1 100644
--- a/examples/node/README.md
+++ b/examples/node/README.md
@@ -22,18 +22,24 @@
 TRY IT!
 -------
 
+There are two ways to generate the code needed to work with protocol buffers in Node.js - one approach uses [Protobuf.js](https://github.com/dcodeIO/ProtoBuf.js/) to dynamically generate the code at runtime, the other uses code statically generated using the protocol buffer compiler `protoc`. The examples behave identically, and either server can be used with either client.
+
  - Run the server
 
    ```sh
    $ # from this directory
-   $ node ./greeter_server.js &
+   $ node ./dynamic_codegen/greeter_server.js &
+   $ # OR
+   $ node ./static_codegen/greeter_server.js &
    ```
 
  - Run the client
 
    ```sh
    $ # from this directory
-   $ node ./greeter_client.js
+   $ node ./dynamic_codegen/greeter_client.js
+   $ # OR
+   $ node ./dynamic_codegen/greeter_client.js
    ```
 
 TUTORIAL
diff --git a/examples/node/dynamic_codegen/README.md b/examples/node/dynamic_codegen/README.md
new file mode 100644
index 0000000..1a6ec17
--- /dev/null
+++ b/examples/node/dynamic_codegen/README.md
@@ -0,0 +1 @@
+This is the dynamic code generation variant of the Node examples. Code in these examples is generated at runtime using Protobuf.js.
diff --git a/examples/node/greeter_client.js b/examples/node/dynamic_codegen/greeter_client.js
similarity index 96%
rename from examples/node/greeter_client.js
rename to examples/node/dynamic_codegen/greeter_client.js
index 2820acb..e24fb07 100644
--- a/examples/node/greeter_client.js
+++ b/examples/node/dynamic_codegen/greeter_client.js
@@ -31,7 +31,7 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+var PROTO_PATH = __dirname + '/../../protos/helloworld.proto';
 
 var grpc = require('grpc');
 var hello_proto = grpc.load(PROTO_PATH).helloworld;
diff --git a/examples/node/greeter_server.js b/examples/node/dynamic_codegen/greeter_server.js
similarity index 96%
rename from examples/node/greeter_server.js
rename to examples/node/dynamic_codegen/greeter_server.js
index e7ad51f..aa43e4c 100644
--- a/examples/node/greeter_server.js
+++ b/examples/node/dynamic_codegen/greeter_server.js
@@ -31,7 +31,7 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+var PROTO_PATH = __dirname + '/../../protos/helloworld.proto';
 
 var grpc = require('grpc');
 var hello_proto = grpc.load(PROTO_PATH).helloworld;
diff --git a/examples/node/route_guide/README.md b/examples/node/dynamic_codegen/route_guide/README.md
similarity index 100%
copy from examples/node/route_guide/README.md
copy to examples/node/dynamic_codegen/route_guide/README.md
diff --git a/examples/node/route_guide/route_guide_client.js b/examples/node/dynamic_codegen/route_guide/route_guide_client.js
similarity index 98%
rename from examples/node/route_guide/route_guide_client.js
rename to examples/node/dynamic_codegen/route_guide/route_guide_client.js
index fd05a59..775b9ad 100644
--- a/examples/node/route_guide/route_guide_client.js
+++ b/examples/node/dynamic_codegen/route_guide/route_guide_client.js
@@ -31,7 +31,7 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../../protos/route_guide.proto';
+var PROTO_PATH = __dirname + '/../../../protos/route_guide.proto';
 
 var async = require('async');
 var fs = require('fs');
diff --git a/examples/node/route_guide/route_guide_db.json b/examples/node/dynamic_codegen/route_guide/route_guide_db.json
similarity index 100%
copy from examples/node/route_guide/route_guide_db.json
copy to examples/node/dynamic_codegen/route_guide/route_guide_db.json
diff --git a/examples/node/route_guide/route_guide_server.js b/examples/node/dynamic_codegen/route_guide/route_guide_server.js
similarity index 98%
rename from examples/node/route_guide/route_guide_server.js
rename to examples/node/dynamic_codegen/route_guide/route_guide_server.js
index 6c01fac..6d59348 100644
--- a/examples/node/route_guide/route_guide_server.js
+++ b/examples/node/dynamic_codegen/route_guide/route_guide_server.js
@@ -31,7 +31,7 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../../protos/route_guide.proto';
+var PROTO_PATH = __dirname + '/../../../protos/route_guide.proto';
 
 var fs = require('fs');
 var parseArgs = require('minimist');
diff --git a/examples/node/package.json b/examples/node/package.json
index d135df2..2cae031 100644
--- a/examples/node/package.json
+++ b/examples/node/package.json
@@ -3,7 +3,8 @@
   "version": "0.1.0",
   "dependencies": {
     "async": "^1.5.2",
-    "grpc": "0.13.0",
+    "google-protobuf": "^3.0.0-alpha.5",
+    "grpc": "^0.14.0",
     "lodash": "^4.6.1",
     "minimist": "^1.2.0"
   }
diff --git a/examples/node/static_codegen/README.md b/examples/node/static_codegen/README.md
new file mode 100644
index 0000000..fc97d34
--- /dev/null
+++ b/examples/node/static_codegen/README.md
@@ -0,0 +1,7 @@
+This is the static code generation variant of the Node examples. Code in these examples is pre-generated using protoc and the Node gRPC protoc plugin, and the generated code can be found in various `*_pb.js` files. The command line sequence for generating those files is as follows (assuming that `protoc` and `grpc_node_plugin` are present, and starting in the base directory of this package):
+
+```sh
+cd ../protos
+protoc --js_out=import_style=commonjs,binary:../node/static_codegen/ --grpc_out=../node/static_codegen --plugin=protoc-gen-grpc=grpc_node_plugin helloworld.proto
+protoc --js_out=import_style=commonjs,binary:../node/static_codegen/route_guide/ --grpc_out=../node/static_codegen/route_guide/ --plugin=protoc-gen-grpc=grpc_node_plugin route_guide.proto
+```
diff --git a/examples/node/greeter_client.js b/examples/node/static_codegen/greeter_client.js
similarity index 80%
copy from examples/node/greeter_client.js
copy to examples/node/static_codegen/greeter_client.js
index 2820acb..da80cf3 100644
--- a/examples/node/greeter_client.js
+++ b/examples/node/static_codegen/greeter_client.js
@@ -31,22 +31,24 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+var messages = require('./helloworld_pb');
+var services = require('./helloworld_grpc_pb');
 
 var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
 
 function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
-                                       grpc.credentials.createInsecure());
+  var client = new services.GreeterClient('localhost:50051',
+                                          grpc.credentials.createInsecure());
   var user;
   if (process.argv.length >= 3) {
     user = process.argv[2];
   } else {
     user = 'world';
   }
-  client.sayHello({name: user}, function(err, response) {
-    console.log('Greeting:', response.message);
+  var request = new messages.HelloRequest();
+  request.setName(user);
+  client.sayHello(request, function(err, response) {
+    console.log('Greeting:', response.getMessage());
   });
 }
 
diff --git a/examples/node/greeter_server.js b/examples/node/static_codegen/greeter_server.js
similarity index 87%
copy from examples/node/greeter_server.js
copy to examples/node/static_codegen/greeter_server.js
index e7ad51f..a1591b8 100644
--- a/examples/node/greeter_server.js
+++ b/examples/node/static_codegen/greeter_server.js
@@ -31,16 +31,18 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+var messages = require('./helloworld_pb');
+var services = require('./helloworld_grpc_pb');
 
 var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
 
 /**
  * Implements the SayHello RPC method.
  */
 function sayHello(call, callback) {
-  callback(null, {message: 'Hello ' + call.request.name});
+  var reply = new messages.HelloReply();
+  reply.setMessage('Hello ' + call.request.getName());
+  callback(null, reply);
 }
 
 /**
@@ -49,7 +51,7 @@
  */
 function main() {
   var server = new grpc.Server();
-  server.addProtoService(hello_proto.Greeter.service, {sayHello: sayHello});
+  server.addService(services.GreeterService, {sayHello: sayHello});
   server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
   server.start();
 }
diff --git a/examples/node/static_codegen/helloworld_grpc_pb.js b/examples/node/static_codegen/helloworld_grpc_pb.js
new file mode 100644
index 0000000..846f8b6
--- /dev/null
+++ b/examples/node/static_codegen/helloworld_grpc_pb.js
@@ -0,0 +1,44 @@
+// GENERATED CODE -- DO NOT EDIT!
+
+'use strict';
+var grpc = require('grpc');
+var helloworld_pb = require('./helloworld_pb.js');
+
+function serialize_HelloReply(arg) {
+  if (!(arg instanceof helloworld_pb.HelloReply)) {
+    throw new Error('Expected argument of type HelloReply');
+  }
+  return new Buffer(arg.serializeBinary());
+}
+
+function deserialize_HelloReply(buffer_arg) {
+  return helloworld_pb.HelloReply.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_HelloRequest(arg) {
+  if (!(arg instanceof helloworld_pb.HelloRequest)) {
+    throw new Error('Expected argument of type HelloRequest');
+  }
+  return new Buffer(arg.serializeBinary());
+}
+
+function deserialize_HelloRequest(buffer_arg) {
+  return helloworld_pb.HelloRequest.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+
+var GreeterService = exports.GreeterService = {
+  sayHello: {
+    path: '/helloworld.Greeter/SayHello',
+    requestStream: false,
+    responseStream: false,
+    requestType: helloworld_pb.HelloRequest,
+    responseType: helloworld_pb.HelloReply,
+    requestSerialize: serialize_HelloRequest,
+    requestDeserialize: deserialize_HelloRequest,
+    responseSerialize: serialize_HelloReply,
+    responseDeserialize: deserialize_HelloReply,
+  },
+};
+
+exports.GreeterClient = grpc.makeGenericClientConstructor(GreeterService);
diff --git a/examples/node/static_codegen/helloworld_pb.js b/examples/node/static_codegen/helloworld_pb.js
new file mode 100644
index 0000000..6405bd9
--- /dev/null
+++ b/examples/node/static_codegen/helloworld_pb.js
@@ -0,0 +1,332 @@
+/**
+ * @fileoverview
+ * @enhanceable
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global = Function('return this')();
+
+goog.exportSymbol('proto.helloworld.HelloReply', null, global);
+goog.exportSymbol('proto.helloworld.HelloRequest', null, global);
+
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.helloworld.HelloRequest = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.helloworld.HelloRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  proto.helloworld.HelloRequest.displayName = 'proto.helloworld.HelloRequest';
+}
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto suitable for use in Soy templates.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
+ * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
+ *     for transitional soy proto support: http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.helloworld.HelloRequest.prototype.toObject = function(opt_includeInstance) {
+  return proto.helloworld.HelloRequest.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Whether to include the JSPB
+ *     instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.helloworld.HelloRequest} msg The msg instance to transform.
+ * @return {!Object}
+ */
+proto.helloworld.HelloRequest.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    name: msg.getName()
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.helloworld.HelloRequest}
+ */
+proto.helloworld.HelloRequest.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.helloworld.HelloRequest;
+  return proto.helloworld.HelloRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.helloworld.HelloRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.helloworld.HelloRequest}
+ */
+proto.helloworld.HelloRequest.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {string} */ (reader.readString());
+      msg.setName(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Class method variant: serializes the given message to binary data
+ * (in protobuf wire format), writing to the given BinaryWriter.
+ * @param {!proto.helloworld.HelloRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.helloworld.HelloRequest.serializeBinaryToWriter = function(message, writer) {
+  message.serializeBinaryToWriter(writer);
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.helloworld.HelloRequest.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  this.serializeBinaryToWriter(writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format),
+ * writing to the given BinaryWriter.
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.helloworld.HelloRequest.prototype.serializeBinaryToWriter = function (writer) {
+  var f = undefined;
+  f = this.getName();
+  if (f.length > 0) {
+    writer.writeString(
+      1,
+      f
+    );
+  }
+};
+
+
+/**
+ * Creates a deep clone of this proto. No data is shared with the original.
+ * @return {!proto.helloworld.HelloRequest} The clone.
+ */
+proto.helloworld.HelloRequest.prototype.cloneMessage = function() {
+  return /** @type {!proto.helloworld.HelloRequest} */ (jspb.Message.cloneMessage(this));
+};
+
+
+/**
+ * optional string name = 1;
+ * @return {string}
+ */
+proto.helloworld.HelloRequest.prototype.getName = function() {
+  return /** @type {string} */ (jspb.Message.getFieldProto3(this, 1, ""));
+};
+
+
+/** @param {string} value  */
+proto.helloworld.HelloRequest.prototype.setName = function(value) {
+  jspb.Message.setField(this, 1, value);
+};
+
+
+
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.helloworld.HelloReply = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.helloworld.HelloReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  proto.helloworld.HelloReply.displayName = 'proto.helloworld.HelloReply';
+}
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto suitable for use in Soy templates.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
+ * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
+ *     for transitional soy proto support: http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.helloworld.HelloReply.prototype.toObject = function(opt_includeInstance) {
+  return proto.helloworld.HelloReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Whether to include the JSPB
+ *     instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.helloworld.HelloReply} msg The msg instance to transform.
+ * @return {!Object}
+ */
+proto.helloworld.HelloReply.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    message: msg.getMessage()
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.helloworld.HelloReply}
+ */
+proto.helloworld.HelloReply.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.helloworld.HelloReply;
+  return proto.helloworld.HelloReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.helloworld.HelloReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.helloworld.HelloReply}
+ */
+proto.helloworld.HelloReply.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {string} */ (reader.readString());
+      msg.setMessage(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Class method variant: serializes the given message to binary data
+ * (in protobuf wire format), writing to the given BinaryWriter.
+ * @param {!proto.helloworld.HelloReply} message
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.helloworld.HelloReply.serializeBinaryToWriter = function(message, writer) {
+  message.serializeBinaryToWriter(writer);
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.helloworld.HelloReply.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  this.serializeBinaryToWriter(writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format),
+ * writing to the given BinaryWriter.
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.helloworld.HelloReply.prototype.serializeBinaryToWriter = function (writer) {
+  var f = undefined;
+  f = this.getMessage();
+  if (f.length > 0) {
+    writer.writeString(
+      1,
+      f
+    );
+  }
+};
+
+
+/**
+ * Creates a deep clone of this proto. No data is shared with the original.
+ * @return {!proto.helloworld.HelloReply} The clone.
+ */
+proto.helloworld.HelloReply.prototype.cloneMessage = function() {
+  return /** @type {!proto.helloworld.HelloReply} */ (jspb.Message.cloneMessage(this));
+};
+
+
+/**
+ * optional string message = 1;
+ * @return {string}
+ */
+proto.helloworld.HelloReply.prototype.getMessage = function() {
+  return /** @type {string} */ (jspb.Message.getFieldProto3(this, 1, ""));
+};
+
+
+/** @param {string} value  */
+proto.helloworld.HelloReply.prototype.setMessage = function(value) {
+  jspb.Message.setField(this, 1, value);
+};
+
+
+goog.object.extend(exports, proto.helloworld);
diff --git a/examples/node/route_guide/README.md b/examples/node/static_codegen/route_guide/README.md
similarity index 100%
rename from examples/node/route_guide/README.md
rename to examples/node/static_codegen/route_guide/README.md
diff --git a/examples/node/route_guide/route_guide_client.js b/examples/node/static_codegen/route_guide/route_guide_client.js
similarity index 66%
copy from examples/node/route_guide/route_guide_client.js
copy to examples/node/static_codegen/route_guide/route_guide_client.js
index fd05a59..ecde786 100644
--- a/examples/node/route_guide/route_guide_client.js
+++ b/examples/node/static_codegen/route_guide/route_guide_client.js
@@ -31,7 +31,8 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../../protos/route_guide.proto';
+var messages = require('./route_guide_pb');
+var services = require('./route_guide_grpc_pb');
 
 var async = require('async');
 var fs = require('fs');
@@ -39,9 +40,9 @@
 var path = require('path');
 var _ = require('lodash');
 var grpc = require('grpc');
-var routeguide = grpc.load(PROTO_PATH).routeguide;
-var client = new routeguide.RouteGuide('localhost:50051',
-                                       grpc.credentials.createInsecure());
+
+var client = new services.RouteGuideClient('localhost:50051',
+                                           grpc.credentials.createInsecure());
 
 var COORD_FACTOR = 1e7;
 
@@ -56,25 +57,23 @@
     if (error) {
       callback(error);
     }
-    if (feature.name === '') {
+    var latitude = feature.getLocation().getLatitude();
+    var longitude = feature.getLocation().getLongitude();
+    if (feature.getName() === '') {
       console.log('Found no feature at ' +
-          feature.location.latitude/COORD_FACTOR + ', ' +
-          feature.location.longitude/COORD_FACTOR);
+          latitude/COORD_FACTOR + ', ' + longitude/COORD_FACTOR);
     } else {
-      console.log('Found feature called "' + feature.name + '" at ' +
-          feature.location.latitude/COORD_FACTOR + ', ' +
-          feature.location.longitude/COORD_FACTOR);
+      console.log('Found feature called "' + feature.getName() + '" at ' +
+          latitude/COORD_FACTOR + ', ' + longitude/COORD_FACTOR);
     }
     next();
   }
-  var point1 = {
-    latitude: 409146138,
-    longitude: -746188906
-  };
-  var point2 = {
-    latitude: 0,
-    longitude: 0
-  };
+  var point1 = new messages.Point();
+  point1.setLatitude(409146138);
+  point1.setLongitude(-746188906);
+  var point2 = new messages.Point();
+  point2.setLatitude(0);
+  point2.setLongitude(0);
   client.getFeature(point1, featureCallback);
   client.getFeature(point2, featureCallback);
 }
@@ -86,22 +85,21 @@
  * @param {function} callback Called when this demo is complete
  */
 function runListFeatures(callback) {
-  var rectangle = {
-    lo: {
-      latitude: 400000000,
-      longitude: -750000000
-    },
-    hi: {
-      latitude: 420000000,
-      longitude: -730000000
-    }
-  };
+  var rect = new messages.Rectangle();
+  var lo = new messages.Point();
+  lo.setLatitude(400000000);
+  lo.setLongitude(-750000000);
+  rect.setLo(lo);
+  var hi = new messages.Point();
+  hi.setLatitude(420000000);
+  hi.setLongitude(-730000000);
+  rect.setHi(hi);
   console.log('Looking for features between 40, -75 and 42, -73');
-  var call = client.listFeatures(rectangle);
+  var call = client.listFeatures(rect);
   call.on('data', function(feature) {
-      console.log('Found feature called "' + feature.name + '" at ' +
-          feature.location.latitude/COORD_FACTOR + ', ' +
-          feature.location.longitude/COORD_FACTOR);
+      console.log('Found feature called "' + feature.getName() + '" at ' +
+          feature.getLocation().getLatitude()/COORD_FACTOR + ', ' +
+          feature.getLocation().getLongitude()/COORD_FACTOR);
   });
   call.on('end', callback);
 }
@@ -118,46 +116,50 @@
   });
   fs.readFile(path.resolve(argv.db_path), function(err, data) {
     if (err) callback(err);
-    var feature_list = JSON.parse(data);
+    // Transform the loaded features to Feature objects
+    var feature_list = _.map(JSON.parse(data), function(value) {
+      var feature = new messages.Feature();
+      feature.setName(value.name);
+      var location = new messages.Point();
+      location.setLatitude(value.location.latitude);
+      location.setLongitude(value.location.longitude);
+      feature.setLocation(location);
+      return feature;
+    });
 
     var num_points = 10;
     var call = client.recordRoute(function(error, stats) {
       if (error) {
         callback(error);
       }
-      console.log('Finished trip with', stats.point_count, 'points');
-      console.log('Passed', stats.feature_count, 'features');
-      console.log('Travelled', stats.distance, 'meters');
-      console.log('It took', stats.elapsed_time, 'seconds');
+      console.log('Finished trip with', stats.getPointCount(), 'points');
+      console.log('Passed', stats.getFeatureCount(), 'features');
+      console.log('Travelled', stats.getDistance(), 'meters');
+      console.log('It took', stats.getElapsedTime(), 'seconds');
       callback();
     });
     /**
      * Constructs a function that asynchronously sends the given point and then
      * delays sending its callback
-     * @param {number} lat The latitude to send
-     * @param {number} lng The longitude to send
+     * @param {messages.Point} location The point to send
      * @return {function(function)} The function that sends the point
      */
-    function pointSender(lat, lng) {
+    function pointSender(location) {
       /**
        * Sends the point, then calls the callback after a delay
        * @param {function} callback Called when complete
        */
       return function(callback) {
-        console.log('Visiting point ' + lat/COORD_FACTOR + ', ' +
-            lng/COORD_FACTOR);
-        call.write({
-          latitude: lat,
-          longitude: lng
-        });
+        console.log('Visiting point ' + location.getLatitude()/COORD_FACTOR +
+            ', ' + location.getLongitude()/COORD_FACTOR);
+        call.write(location);
         _.delay(callback, _.random(500, 1500));
       };
     }
     var point_senders = [];
     for (var i = 0; i < num_points; i++) {
       var rand_point = feature_list[_.random(0, feature_list.length - 1)];
-      point_senders[i] = pointSender(rand_point.location.latitude,
-                                     rand_point.location.longitude);
+      point_senders[i] = pointSender(rand_point.getLocation());
     }
     async.series(point_senders, function() {
       call.end();
@@ -173,8 +175,9 @@
 function runRouteChat(callback) {
   var call = client.routeChat();
   call.on('data', function(note) {
-    console.log('Got message "' + note.message + '" at ' +
-        note.location.latitude + ', ' + note.location.longitude);
+    console.log('Got message "' + note.getMessage() + '" at ' +
+        note.getLocation().getLatitude() + ', ' +
+        note.getLocation().getLongitude());
   });
 
   call.on('end', callback);
@@ -208,7 +211,13 @@
     var note = notes[i];
     console.log('Sending message "' + note.message + '" at ' +
         note.location.latitude + ', ' + note.location.longitude);
-    call.write(note);
+    var noteMsg = new messages.RouteNote();
+    noteMsg.setMessage(note.message);
+    var location = new messages.Point();
+    location.setLatitude(note.location.latitude);
+    location.setLongitude(note.location.longitude);
+    noteMsg.setLocation(location);
+    call.write(noteMsg);
   }
   call.end();
 }
diff --git a/examples/node/route_guide/route_guide_db.json b/examples/node/static_codegen/route_guide/route_guide_db.json
similarity index 100%
rename from examples/node/route_guide/route_guide_db.json
rename to examples/node/static_codegen/route_guide/route_guide_db.json
diff --git a/examples/node/static_codegen/route_guide/route_guide_grpc_pb.js b/examples/node/static_codegen/route_guide/route_guide_grpc_pb.js
new file mode 100644
index 0000000..1dd7133
--- /dev/null
+++ b/examples/node/static_codegen/route_guide/route_guide_grpc_pb.js
@@ -0,0 +1,110 @@
+// GENERATED CODE -- DO NOT EDIT!
+
+'use strict';
+var grpc = require('grpc');
+var route_guide_pb = require('./route_guide_pb.js');
+
+function serialize_Feature(arg) {
+  if (!(arg instanceof route_guide_pb.Feature)) {
+    throw new Error('Expected argument of type Feature');
+  }
+  return new Buffer(arg.serializeBinary());
+}
+
+function deserialize_Feature(buffer_arg) {
+  return route_guide_pb.Feature.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_Point(arg) {
+  if (!(arg instanceof route_guide_pb.Point)) {
+    throw new Error('Expected argument of type Point');
+  }
+  return new Buffer(arg.serializeBinary());
+}
+
+function deserialize_Point(buffer_arg) {
+  return route_guide_pb.Point.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_Rectangle(arg) {
+  if (!(arg instanceof route_guide_pb.Rectangle)) {
+    throw new Error('Expected argument of type Rectangle');
+  }
+  return new Buffer(arg.serializeBinary());
+}
+
+function deserialize_Rectangle(buffer_arg) {
+  return route_guide_pb.Rectangle.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_RouteNote(arg) {
+  if (!(arg instanceof route_guide_pb.RouteNote)) {
+    throw new Error('Expected argument of type RouteNote');
+  }
+  return new Buffer(arg.serializeBinary());
+}
+
+function deserialize_RouteNote(buffer_arg) {
+  return route_guide_pb.RouteNote.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_RouteSummary(arg) {
+  if (!(arg instanceof route_guide_pb.RouteSummary)) {
+    throw new Error('Expected argument of type RouteSummary');
+  }
+  return new Buffer(arg.serializeBinary());
+}
+
+function deserialize_RouteSummary(buffer_arg) {
+  return route_guide_pb.RouteSummary.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+
+var RouteGuideService = exports.RouteGuideService = {
+  getFeature: {
+    path: '/routeguide.RouteGuide/GetFeature',
+    requestStream: false,
+    responseStream: false,
+    requestType: route_guide_pb.Point,
+    responseType: route_guide_pb.Feature,
+    requestSerialize: serialize_Point,
+    requestDeserialize: deserialize_Point,
+    responseSerialize: serialize_Feature,
+    responseDeserialize: deserialize_Feature,
+  },
+  listFeatures: {
+    path: '/routeguide.RouteGuide/ListFeatures',
+    requestStream: false,
+    responseStream: true,
+    requestType: route_guide_pb.Rectangle,
+    responseType: route_guide_pb.Feature,
+    requestSerialize: serialize_Rectangle,
+    requestDeserialize: deserialize_Rectangle,
+    responseSerialize: serialize_Feature,
+    responseDeserialize: deserialize_Feature,
+  },
+  recordRoute: {
+    path: '/routeguide.RouteGuide/RecordRoute',
+    requestStream: true,
+    responseStream: false,
+    requestType: route_guide_pb.Point,
+    responseType: route_guide_pb.RouteSummary,
+    requestSerialize: serialize_Point,
+    requestDeserialize: deserialize_Point,
+    responseSerialize: serialize_RouteSummary,
+    responseDeserialize: deserialize_RouteSummary,
+  },
+  routeChat: {
+    path: '/routeguide.RouteGuide/RouteChat',
+    requestStream: true,
+    responseStream: true,
+    requestType: route_guide_pb.RouteNote,
+    responseType: route_guide_pb.RouteNote,
+    requestSerialize: serialize_RouteNote,
+    requestDeserialize: deserialize_RouteNote,
+    responseSerialize: serialize_RouteNote,
+    responseDeserialize: deserialize_RouteNote,
+  },
+};
+
+exports.RouteGuideClient = grpc.makeGenericClientConstructor(RouteGuideService);
diff --git a/examples/node/static_codegen/route_guide/route_guide_pb.js b/examples/node/static_codegen/route_guide/route_guide_pb.js
new file mode 100644
index 0000000..f604cd6
--- /dev/null
+++ b/examples/node/static_codegen/route_guide/route_guide_pb.js
@@ -0,0 +1,1033 @@
+/**
+ * @fileoverview
+ * @enhanceable
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global = Function('return this')();
+
+goog.exportSymbol('proto.routeguide.Feature', null, global);
+goog.exportSymbol('proto.routeguide.Point', null, global);
+goog.exportSymbol('proto.routeguide.Rectangle', null, global);
+goog.exportSymbol('proto.routeguide.RouteNote', null, global);
+goog.exportSymbol('proto.routeguide.RouteSummary', null, global);
+
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.routeguide.Point = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.routeguide.Point, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  proto.routeguide.Point.displayName = 'proto.routeguide.Point';
+}
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto suitable for use in Soy templates.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
+ * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
+ *     for transitional soy proto support: http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.routeguide.Point.prototype.toObject = function(opt_includeInstance) {
+  return proto.routeguide.Point.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Whether to include the JSPB
+ *     instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.routeguide.Point} msg The msg instance to transform.
+ * @return {!Object}
+ */
+proto.routeguide.Point.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    latitude: msg.getLatitude(),
+    longitude: msg.getLongitude()
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.routeguide.Point}
+ */
+proto.routeguide.Point.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.routeguide.Point;
+  return proto.routeguide.Point.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.routeguide.Point} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.routeguide.Point}
+ */
+proto.routeguide.Point.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {number} */ (reader.readInt32());
+      msg.setLatitude(value);
+      break;
+    case 2:
+      var value = /** @type {number} */ (reader.readInt32());
+      msg.setLongitude(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Class method variant: serializes the given message to binary data
+ * (in protobuf wire format), writing to the given BinaryWriter.
+ * @param {!proto.routeguide.Point} message
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.routeguide.Point.serializeBinaryToWriter = function(message, writer) {
+  message.serializeBinaryToWriter(writer);
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.routeguide.Point.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  this.serializeBinaryToWriter(writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format),
+ * writing to the given BinaryWriter.
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.routeguide.Point.prototype.serializeBinaryToWriter = function (writer) {
+  var f = undefined;
+  f = this.getLatitude();
+  if (f !== 0) {
+    writer.writeInt32(
+      1,
+      f
+    );
+  }
+  f = this.getLongitude();
+  if (f !== 0) {
+    writer.writeInt32(
+      2,
+      f
+    );
+  }
+};
+
+
+/**
+ * Creates a deep clone of this proto. No data is shared with the original.
+ * @return {!proto.routeguide.Point} The clone.
+ */
+proto.routeguide.Point.prototype.cloneMessage = function() {
+  return /** @type {!proto.routeguide.Point} */ (jspb.Message.cloneMessage(this));
+};
+
+
+/**
+ * optional int32 latitude = 1;
+ * @return {number}
+ */
+proto.routeguide.Point.prototype.getLatitude = function() {
+  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 1, 0));
+};
+
+
+/** @param {number} value  */
+proto.routeguide.Point.prototype.setLatitude = function(value) {
+  jspb.Message.setField(this, 1, value);
+};
+
+
+/**
+ * optional int32 longitude = 2;
+ * @return {number}
+ */
+proto.routeguide.Point.prototype.getLongitude = function() {
+  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 2, 0));
+};
+
+
+/** @param {number} value  */
+proto.routeguide.Point.prototype.setLongitude = function(value) {
+  jspb.Message.setField(this, 2, value);
+};
+
+
+
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.routeguide.Rectangle = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.routeguide.Rectangle, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  proto.routeguide.Rectangle.displayName = 'proto.routeguide.Rectangle';
+}
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto suitable for use in Soy templates.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
+ * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
+ *     for transitional soy proto support: http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.routeguide.Rectangle.prototype.toObject = function(opt_includeInstance) {
+  return proto.routeguide.Rectangle.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Whether to include the JSPB
+ *     instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.routeguide.Rectangle} msg The msg instance to transform.
+ * @return {!Object}
+ */
+proto.routeguide.Rectangle.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    lo: (f = msg.getLo()) && proto.routeguide.Point.toObject(includeInstance, f),
+    hi: (f = msg.getHi()) && proto.routeguide.Point.toObject(includeInstance, f)
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.routeguide.Rectangle}
+ */
+proto.routeguide.Rectangle.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.routeguide.Rectangle;
+  return proto.routeguide.Rectangle.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.routeguide.Rectangle} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.routeguide.Rectangle}
+ */
+proto.routeguide.Rectangle.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = new proto.routeguide.Point;
+      reader.readMessage(value,proto.routeguide.Point.deserializeBinaryFromReader);
+      msg.setLo(value);
+      break;
+    case 2:
+      var value = new proto.routeguide.Point;
+      reader.readMessage(value,proto.routeguide.Point.deserializeBinaryFromReader);
+      msg.setHi(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Class method variant: serializes the given message to binary data
+ * (in protobuf wire format), writing to the given BinaryWriter.
+ * @param {!proto.routeguide.Rectangle} message
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.routeguide.Rectangle.serializeBinaryToWriter = function(message, writer) {
+  message.serializeBinaryToWriter(writer);
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.routeguide.Rectangle.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  this.serializeBinaryToWriter(writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format),
+ * writing to the given BinaryWriter.
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.routeguide.Rectangle.prototype.serializeBinaryToWriter = function (writer) {
+  var f = undefined;
+  f = this.getLo();
+  if (f != null) {
+    writer.writeMessage(
+      1,
+      f,
+      proto.routeguide.Point.serializeBinaryToWriter
+    );
+  }
+  f = this.getHi();
+  if (f != null) {
+    writer.writeMessage(
+      2,
+      f,
+      proto.routeguide.Point.serializeBinaryToWriter
+    );
+  }
+};
+
+
+/**
+ * Creates a deep clone of this proto. No data is shared with the original.
+ * @return {!proto.routeguide.Rectangle} The clone.
+ */
+proto.routeguide.Rectangle.prototype.cloneMessage = function() {
+  return /** @type {!proto.routeguide.Rectangle} */ (jspb.Message.cloneMessage(this));
+};
+
+
+/**
+ * optional Point lo = 1;
+ * @return {proto.routeguide.Point}
+ */
+proto.routeguide.Rectangle.prototype.getLo = function() {
+  return /** @type{proto.routeguide.Point} */ (
+    jspb.Message.getWrapperField(this, proto.routeguide.Point, 1));
+};
+
+
+/** @param {proto.routeguide.Point|undefined} value  */
+proto.routeguide.Rectangle.prototype.setLo = function(value) {
+  jspb.Message.setWrapperField(this, 1, value);
+};
+
+
+proto.routeguide.Rectangle.prototype.clearLo = function() {
+  this.setLo(undefined);
+};
+
+
+/**
+ * optional Point hi = 2;
+ * @return {proto.routeguide.Point}
+ */
+proto.routeguide.Rectangle.prototype.getHi = function() {
+  return /** @type{proto.routeguide.Point} */ (
+    jspb.Message.getWrapperField(this, proto.routeguide.Point, 2));
+};
+
+
+/** @param {proto.routeguide.Point|undefined} value  */
+proto.routeguide.Rectangle.prototype.setHi = function(value) {
+  jspb.Message.setWrapperField(this, 2, value);
+};
+
+
+proto.routeguide.Rectangle.prototype.clearHi = function() {
+  this.setHi(undefined);
+};
+
+
+
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.routeguide.Feature = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.routeguide.Feature, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  proto.routeguide.Feature.displayName = 'proto.routeguide.Feature';
+}
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto suitable for use in Soy templates.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
+ * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
+ *     for transitional soy proto support: http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.routeguide.Feature.prototype.toObject = function(opt_includeInstance) {
+  return proto.routeguide.Feature.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Whether to include the JSPB
+ *     instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.routeguide.Feature} msg The msg instance to transform.
+ * @return {!Object}
+ */
+proto.routeguide.Feature.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    name: msg.getName(),
+    location: (f = msg.getLocation()) && proto.routeguide.Point.toObject(includeInstance, f)
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.routeguide.Feature}
+ */
+proto.routeguide.Feature.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.routeguide.Feature;
+  return proto.routeguide.Feature.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.routeguide.Feature} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.routeguide.Feature}
+ */
+proto.routeguide.Feature.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {string} */ (reader.readString());
+      msg.setName(value);
+      break;
+    case 2:
+      var value = new proto.routeguide.Point;
+      reader.readMessage(value,proto.routeguide.Point.deserializeBinaryFromReader);
+      msg.setLocation(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Class method variant: serializes the given message to binary data
+ * (in protobuf wire format), writing to the given BinaryWriter.
+ * @param {!proto.routeguide.Feature} message
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.routeguide.Feature.serializeBinaryToWriter = function(message, writer) {
+  message.serializeBinaryToWriter(writer);
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.routeguide.Feature.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  this.serializeBinaryToWriter(writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format),
+ * writing to the given BinaryWriter.
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.routeguide.Feature.prototype.serializeBinaryToWriter = function (writer) {
+  var f = undefined;
+  f = this.getName();
+  if (f.length > 0) {
+    writer.writeString(
+      1,
+      f
+    );
+  }
+  f = this.getLocation();
+  if (f != null) {
+    writer.writeMessage(
+      2,
+      f,
+      proto.routeguide.Point.serializeBinaryToWriter
+    );
+  }
+};
+
+
+/**
+ * Creates a deep clone of this proto. No data is shared with the original.
+ * @return {!proto.routeguide.Feature} The clone.
+ */
+proto.routeguide.Feature.prototype.cloneMessage = function() {
+  return /** @type {!proto.routeguide.Feature} */ (jspb.Message.cloneMessage(this));
+};
+
+
+/**
+ * optional string name = 1;
+ * @return {string}
+ */
+proto.routeguide.Feature.prototype.getName = function() {
+  return /** @type {string} */ (jspb.Message.getFieldProto3(this, 1, ""));
+};
+
+
+/** @param {string} value  */
+proto.routeguide.Feature.prototype.setName = function(value) {
+  jspb.Message.setField(this, 1, value);
+};
+
+
+/**
+ * optional Point location = 2;
+ * @return {proto.routeguide.Point}
+ */
+proto.routeguide.Feature.prototype.getLocation = function() {
+  return /** @type{proto.routeguide.Point} */ (
+    jspb.Message.getWrapperField(this, proto.routeguide.Point, 2));
+};
+
+
+/** @param {proto.routeguide.Point|undefined} value  */
+proto.routeguide.Feature.prototype.setLocation = function(value) {
+  jspb.Message.setWrapperField(this, 2, value);
+};
+
+
+proto.routeguide.Feature.prototype.clearLocation = function() {
+  this.setLocation(undefined);
+};
+
+
+
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.routeguide.RouteNote = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.routeguide.RouteNote, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  proto.routeguide.RouteNote.displayName = 'proto.routeguide.RouteNote';
+}
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto suitable for use in Soy templates.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
+ * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
+ *     for transitional soy proto support: http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.routeguide.RouteNote.prototype.toObject = function(opt_includeInstance) {
+  return proto.routeguide.RouteNote.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Whether to include the JSPB
+ *     instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.routeguide.RouteNote} msg The msg instance to transform.
+ * @return {!Object}
+ */
+proto.routeguide.RouteNote.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    location: (f = msg.getLocation()) && proto.routeguide.Point.toObject(includeInstance, f),
+    message: msg.getMessage()
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.routeguide.RouteNote}
+ */
+proto.routeguide.RouteNote.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.routeguide.RouteNote;
+  return proto.routeguide.RouteNote.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.routeguide.RouteNote} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.routeguide.RouteNote}
+ */
+proto.routeguide.RouteNote.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = new proto.routeguide.Point;
+      reader.readMessage(value,proto.routeguide.Point.deserializeBinaryFromReader);
+      msg.setLocation(value);
+      break;
+    case 2:
+      var value = /** @type {string} */ (reader.readString());
+      msg.setMessage(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Class method variant: serializes the given message to binary data
+ * (in protobuf wire format), writing to the given BinaryWriter.
+ * @param {!proto.routeguide.RouteNote} message
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.routeguide.RouteNote.serializeBinaryToWriter = function(message, writer) {
+  message.serializeBinaryToWriter(writer);
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.routeguide.RouteNote.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  this.serializeBinaryToWriter(writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format),
+ * writing to the given BinaryWriter.
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.routeguide.RouteNote.prototype.serializeBinaryToWriter = function (writer) {
+  var f = undefined;
+  f = this.getLocation();
+  if (f != null) {
+    writer.writeMessage(
+      1,
+      f,
+      proto.routeguide.Point.serializeBinaryToWriter
+    );
+  }
+  f = this.getMessage();
+  if (f.length > 0) {
+    writer.writeString(
+      2,
+      f
+    );
+  }
+};
+
+
+/**
+ * Creates a deep clone of this proto. No data is shared with the original.
+ * @return {!proto.routeguide.RouteNote} The clone.
+ */
+proto.routeguide.RouteNote.prototype.cloneMessage = function() {
+  return /** @type {!proto.routeguide.RouteNote} */ (jspb.Message.cloneMessage(this));
+};
+
+
+/**
+ * optional Point location = 1;
+ * @return {proto.routeguide.Point}
+ */
+proto.routeguide.RouteNote.prototype.getLocation = function() {
+  return /** @type{proto.routeguide.Point} */ (
+    jspb.Message.getWrapperField(this, proto.routeguide.Point, 1));
+};
+
+
+/** @param {proto.routeguide.Point|undefined} value  */
+proto.routeguide.RouteNote.prototype.setLocation = function(value) {
+  jspb.Message.setWrapperField(this, 1, value);
+};
+
+
+proto.routeguide.RouteNote.prototype.clearLocation = function() {
+  this.setLocation(undefined);
+};
+
+
+/**
+ * optional string message = 2;
+ * @return {string}
+ */
+proto.routeguide.RouteNote.prototype.getMessage = function() {
+  return /** @type {string} */ (jspb.Message.getFieldProto3(this, 2, ""));
+};
+
+
+/** @param {string} value  */
+proto.routeguide.RouteNote.prototype.setMessage = function(value) {
+  jspb.Message.setField(this, 2, value);
+};
+
+
+
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.routeguide.RouteSummary = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.routeguide.RouteSummary, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  proto.routeguide.RouteSummary.displayName = 'proto.routeguide.RouteSummary';
+}
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto suitable for use in Soy templates.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
+ * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
+ *     for transitional soy proto support: http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.routeguide.RouteSummary.prototype.toObject = function(opt_includeInstance) {
+  return proto.routeguide.RouteSummary.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Whether to include the JSPB
+ *     instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.routeguide.RouteSummary} msg The msg instance to transform.
+ * @return {!Object}
+ */
+proto.routeguide.RouteSummary.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    pointCount: msg.getPointCount(),
+    featureCount: msg.getFeatureCount(),
+    distance: msg.getDistance(),
+    elapsedTime: msg.getElapsedTime()
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.routeguide.RouteSummary}
+ */
+proto.routeguide.RouteSummary.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.routeguide.RouteSummary;
+  return proto.routeguide.RouteSummary.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.routeguide.RouteSummary} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.routeguide.RouteSummary}
+ */
+proto.routeguide.RouteSummary.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {number} */ (reader.readInt32());
+      msg.setPointCount(value);
+      break;
+    case 2:
+      var value = /** @type {number} */ (reader.readInt32());
+      msg.setFeatureCount(value);
+      break;
+    case 3:
+      var value = /** @type {number} */ (reader.readInt32());
+      msg.setDistance(value);
+      break;
+    case 4:
+      var value = /** @type {number} */ (reader.readInt32());
+      msg.setElapsedTime(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Class method variant: serializes the given message to binary data
+ * (in protobuf wire format), writing to the given BinaryWriter.
+ * @param {!proto.routeguide.RouteSummary} message
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.routeguide.RouteSummary.serializeBinaryToWriter = function(message, writer) {
+  message.serializeBinaryToWriter(writer);
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.routeguide.RouteSummary.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  this.serializeBinaryToWriter(writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format),
+ * writing to the given BinaryWriter.
+ * @param {!jspb.BinaryWriter} writer
+ */
+proto.routeguide.RouteSummary.prototype.serializeBinaryToWriter = function (writer) {
+  var f = undefined;
+  f = this.getPointCount();
+  if (f !== 0) {
+    writer.writeInt32(
+      1,
+      f
+    );
+  }
+  f = this.getFeatureCount();
+  if (f !== 0) {
+    writer.writeInt32(
+      2,
+      f
+    );
+  }
+  f = this.getDistance();
+  if (f !== 0) {
+    writer.writeInt32(
+      3,
+      f
+    );
+  }
+  f = this.getElapsedTime();
+  if (f !== 0) {
+    writer.writeInt32(
+      4,
+      f
+    );
+  }
+};
+
+
+/**
+ * Creates a deep clone of this proto. No data is shared with the original.
+ * @return {!proto.routeguide.RouteSummary} The clone.
+ */
+proto.routeguide.RouteSummary.prototype.cloneMessage = function() {
+  return /** @type {!proto.routeguide.RouteSummary} */ (jspb.Message.cloneMessage(this));
+};
+
+
+/**
+ * optional int32 point_count = 1;
+ * @return {number}
+ */
+proto.routeguide.RouteSummary.prototype.getPointCount = function() {
+  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 1, 0));
+};
+
+
+/** @param {number} value  */
+proto.routeguide.RouteSummary.prototype.setPointCount = function(value) {
+  jspb.Message.setField(this, 1, value);
+};
+
+
+/**
+ * optional int32 feature_count = 2;
+ * @return {number}
+ */
+proto.routeguide.RouteSummary.prototype.getFeatureCount = function() {
+  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 2, 0));
+};
+
+
+/** @param {number} value  */
+proto.routeguide.RouteSummary.prototype.setFeatureCount = function(value) {
+  jspb.Message.setField(this, 2, value);
+};
+
+
+/**
+ * optional int32 distance = 3;
+ * @return {number}
+ */
+proto.routeguide.RouteSummary.prototype.getDistance = function() {
+  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 3, 0));
+};
+
+
+/** @param {number} value  */
+proto.routeguide.RouteSummary.prototype.setDistance = function(value) {
+  jspb.Message.setField(this, 3, value);
+};
+
+
+/**
+ * optional int32 elapsed_time = 4;
+ * @return {number}
+ */
+proto.routeguide.RouteSummary.prototype.getElapsedTime = function() {
+  return /** @type {number} */ (jspb.Message.getFieldProto3(this, 4, 0));
+};
+
+
+/** @param {number} value  */
+proto.routeguide.RouteSummary.prototype.setElapsedTime = function(value) {
+  jspb.Message.setField(this, 4, value);
+};
+
+
+goog.object.extend(exports, proto.routeguide);
diff --git a/examples/node/route_guide/route_guide_server.js b/examples/node/static_codegen/route_guide/route_guide_server.js
similarity index 77%
copy from examples/node/route_guide/route_guide_server.js
copy to examples/node/static_codegen/route_guide/route_guide_server.js
index 6c01fac..53628fb 100644
--- a/examples/node/route_guide/route_guide_server.js
+++ b/examples/node/static_codegen/route_guide/route_guide_server.js
@@ -31,14 +31,14 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../../protos/route_guide.proto';
+var messages = require('./route_guide_pb');
+var services = require('./route_guide_grpc_pb');
 
 var fs = require('fs');
 var parseArgs = require('minimist');
 var path = require('path');
 var _ = require('lodash');
 var grpc = require('grpc');
-var routeguide = grpc.load(PROTO_PATH).routeguide;
 
 var COORD_FACTOR = 1e7;
 
@@ -65,16 +65,15 @@
   // Check if there is already a feature object for the given point
   for (var i = 0; i < feature_list.length; i++) {
     feature = feature_list[i];
-    if (feature.location.latitude === point.latitude &&
-        feature.location.longitude === point.longitude) {
+    if (feature.getLocation().getLatitude() === point.getLatitude() &&
+        feature.getLocation().getLongitude() === point.getLongitude()) {
       return feature;
     }
   }
   var name = '';
-  feature = {
-    name: name,
-    location: point
-  };
+  feature = new messages.Feature();
+  feature.setName(name);
+  feature.setLocation(point);
   return feature;
 }
 
@@ -95,21 +94,21 @@
  *     request property for the request value.
  */
 function listFeatures(call) {
-  var lo = call.request.lo;
-  var hi = call.request.hi;
-  var left = _.min([lo.longitude, hi.longitude]);
-  var right = _.max([lo.longitude, hi.longitude]);
-  var top = _.max([lo.latitude, hi.latitude]);
-  var bottom = _.min([lo.latitude, hi.latitude]);
+  var lo = call.request.getLo();
+  var hi = call.request.getHi();
+  var left = _.min([lo.getLongitude(), hi.getLongitude()]);
+  var right = _.max([lo.getLongitude(), hi.getLongitude()]);
+  var top = _.max([lo.getLatitude(), hi.getLatitude()]);
+  var bottom = _.min([lo.getLatitude(), hi.getLatitude()]);
   // For each feature, check if it is in the given bounding box
   _.each(feature_list, function(feature) {
-    if (feature.name === '') {
+    if (feature.getName() === '') {
       return;
     }
-    if (feature.location.longitude >= left &&
-        feature.location.longitude <= right &&
-        feature.location.latitude >= bottom &&
-        feature.location.latitude <= top) {
+    if (feature.getLocation().getLongitude() >= left &&
+        feature.getLocation().getLongitude() <= right &&
+        feature.getLocation().getLatitude() >= bottom &&
+        feature.getLocation().getLatitude() <= top) {
       call.write(feature);
     }
   });
@@ -127,10 +126,10 @@
   function toRadians(num) {
     return num * Math.PI / 180;
   }
-  var lat1 = start.latitude / COORD_FACTOR;
-  var lat2 = end.latitude / COORD_FACTOR;
-  var lon1 = start.longitude / COORD_FACTOR;
-  var lon2 = end.longitude / COORD_FACTOR;
+  var lat1 = start.getLatitude() / COORD_FACTOR;
+  var lat2 = end.getLatitude() / COORD_FACTOR;
+  var lon1 = start.getLongitude() / COORD_FACTOR;
+  var lon2 = end.getLongitude() / COORD_FACTOR;
   var R = 6371000; // metres
   var φ1 = toRadians(lat1);
   var φ2 = toRadians(lat2);
@@ -173,14 +172,14 @@
     previous = point;
   });
   call.on('end', function() {
-    callback(null, {
-      point_count: point_count,
-      feature_count: feature_count,
-      // Cast the distance to an integer
-      distance: distance|0,
-      // End the timer
-      elapsed_time: process.hrtime(start_time)[0]
-    });
+    var summary = new messages.RouteSummary();
+    summary.setPointCount(point_count);
+    summary.setFeatureCount(feature_count);
+    // Cast the distance to an integer
+    summary.setDistance(distance|0);
+    // End the timer
+    summary.setElapsedTime(process.hrtime(start_time)[0]);
+    callback(null, summary);
   });
 }
 
@@ -192,7 +191,7 @@
  * @return {string} The key for an object
  */
 function pointKey(point) {
-  return point.latitude + ' ' + point.longitude;
+  return point.getLatitude() + ' ' + point.getLongitude();
 }
 
 /**
@@ -202,7 +201,7 @@
  */
 function routeChat(call) {
   call.on('data', function(note) {
-    var key = pointKey(note.location);
+    var key = pointKey(note.getLocation());
     /* For each note sent, respond with all previous notes that correspond to
      * the same point */
     if (route_notes.hasOwnProperty(key)) {
@@ -213,7 +212,7 @@
       route_notes[key] = [];
     }
     // Then add the new note to the list
-    route_notes[key].push(JSON.parse(JSON.stringify(note)));
+    route_notes[key].push(note);
   });
   call.on('end', function() {
     call.end();
@@ -227,7 +226,7 @@
  */
 function getServer() {
   var server = new grpc.Server();
-  server.addProtoService(routeguide.RouteGuide.service, {
+  server.addService(services.RouteGuideService, {
     getFeature: getFeature,
     listFeatures: listFeatures,
     recordRoute: recordRoute,
@@ -245,7 +244,16 @@
   });
   fs.readFile(path.resolve(argv.db_path), function(err, data) {
     if (err) throw err;
-    feature_list = JSON.parse(data);
+    // Transform the loaded features to Feature objects
+    feature_list = _.map(JSON.parse(data), function(value) {
+      var feature = new messages.Feature();
+      feature.setName(value.name);
+      var location = new messages.Point();
+      location.setLatitude(value.location.latitude);
+      location.setLongitude(value.location.longitude);
+      feature.setLocation(location);
+      return feature;
+    });
     routeServer.start();
   });
 }
diff --git a/examples/objective-c/route_guide/ViewControllers.m b/examples/objective-c/route_guide/ViewControllers.m
index 0b1a1cf..e329782 100644
--- a/examples/objective-c/route_guide/ViewControllers.m
+++ b/examples/objective-c/route_guide/ViewControllers.m
@@ -80,19 +80,14 @@
  * Run the getFeature demo. Calls getFeature with a point known to have a feature and a point known
  * not to have a feature.
  */
-@interface GetFeatureViewController : UIViewController
+@interface GetFeatureViewController : UIViewController {
+  RTGRouteGuide *service;
+}
 @end
 
 @implementation GetFeatureViewController
 
-- (void)viewDidLoad {
-  [super viewDidLoad];
-
-  // This only needs to be done once per host, before creating service objects for that host.
-  [GRPCCall useInsecureConnectionsForHost:kHostAddress];
-
-  RTGRouteGuide *service = [[RTGRouteGuide alloc] initWithHost:kHostAddress];
-
+- (void)execRequest {
   void (^handler)(RTGFeature *response, NSError *error) = ^(RTGFeature *response, NSError *error) {
     if (response.name.length) {
       NSLog(@"Found feature called %@ at %@.", response.name, response.location);
@@ -111,6 +106,19 @@
   [service getFeatureWithRequest:[RTGPoint message] handler:handler];
 }
 
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  // This only needs to be done once per host, before creating service objects for that host.
+  [GRPCCall useInsecureConnectionsForHost:kHostAddress];
+
+  service = [[RTGRouteGuide alloc] initWithHost:kHostAddress];
+}
+
+- (void)viewDidAppear:(BOOL)animated {
+  [self execRequest];
+}
+
 @end
 
 
@@ -120,16 +128,15 @@
  * Run the listFeatures demo. Calls listFeatures with a rectangle containing all of the features in
  * the pre-generated database. Prints each response as it comes in.
  */
-@interface ListFeaturesViewController : UIViewController
+@interface ListFeaturesViewController : UIViewController {
+  RTGRouteGuide *service;
+}
+
 @end
 
 @implementation ListFeaturesViewController
 
-- (void)viewDidLoad {
-  [super viewDidLoad];
-
-  RTGRouteGuide *service = [[RTGRouteGuide alloc] initWithHost:kHostAddress];
-
+- (void)execRequest {
   RTGRectangle *rectangle = [RTGRectangle message];
   rectangle.lo.latitude = 405E6;
   rectangle.lo.longitude = -750E6;
@@ -147,6 +154,16 @@
   }];
 }
 
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  service = [[RTGRouteGuide alloc] initWithHost:kHostAddress];
+}
+
+- (void)viewDidAppear:(BOOL)animated {
+  [self execRequest];
+}
+
 @end
 
 
@@ -157,14 +174,15 @@
  * database with a variable delay in between. Prints the statistics when they are sent from the
  * server.
  */
-@interface RecordRouteViewController : UIViewController
+@interface RecordRouteViewController : UIViewController {
+  RTGRouteGuide *service;
+}
+
 @end
 
 @implementation RecordRouteViewController
 
-- (void)viewDidLoad {
-  [super viewDidLoad];
-
+- (void)execRequest {
   NSString *dataBasePath = [NSBundle.mainBundle pathForResource:@"route_guide_db"
                                                          ofType:@"json"];
   NSData *dataBaseContent = [NSData dataWithContentsOfFile:dataBasePath];
@@ -178,8 +196,6 @@
     return location;
   }];
 
-  RTGRouteGuide *service = [[RTGRouteGuide alloc] initWithHost:kHostAddress];
-
   [service recordRouteWithRequestsWriter:locations
                                  handler:^(RTGRouteSummary *response, NSError *error) {
     if (response) {
@@ -193,6 +209,16 @@
   }];
 }
 
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  service = [[RTGRouteGuide alloc] initWithHost:kHostAddress];
+}
+
+- (void)viewDidAppear:(BOOL)animated {
+  [self execRequest];
+}
+
 @end
 
 
@@ -202,14 +228,15 @@
  * Run the routeChat demo. Send some chat messages, and print any chat messages that are sent from
  * the server.
  */
-@interface RouteChatViewController : UIViewController
+@interface RouteChatViewController : UIViewController {
+  RTGRouteGuide *service;
+}
+
 @end
 
 @implementation RouteChatViewController
 
-- (void)viewDidLoad {
-  [super viewDidLoad];
-
+- (void)execRequest {
   NSArray *notes = @[[RTGRouteNote noteWithMessage:@"First message" latitude:0 longitude:0],
                      [RTGRouteNote noteWithMessage:@"Second message" latitude:0 longitude:1],
                      [RTGRouteNote noteWithMessage:@"Third message" latitude:1 longitude:0],
@@ -219,8 +246,6 @@
     return note;
   }];
 
-  RTGRouteGuide *service = [[RTGRouteGuide alloc] initWithHost:kHostAddress];
-
   [service routeChatWithRequestsWriter:notesWriter
                           eventHandler:^(BOOL done, RTGRouteNote *note, NSError *error) {
     if (note) {
@@ -234,4 +259,14 @@
   }];
 }
 
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  service = [[RTGRouteGuide alloc] initWithHost:kHostAddress];
+}
+
+- (void)viewDidAppear:(BOOL)animated {
+  [self execRequest];
+}
+
 @end
diff --git a/examples/python/helloworld/helloworld_pb2.py b/examples/python/helloworld/helloworld_pb2.py
index 1b2674e..1ee80e4 100644
--- a/examples/python/helloworld/helloworld_pb2.py
+++ b/examples/python/helloworld/helloworld_pb2.py
@@ -1,6 +1,8 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: helloworld.proto
 
+import sys
+_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
@@ -17,7 +19,7 @@
   name='helloworld.proto',
   package='helloworld',
   syntax='proto3',
-  serialized_pb=b'\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x18\n\x10io.grpc.examples\xa2\x02\x03HLWb\x06proto3'
+  serialized_pb=_b('\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3')
 )
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
@@ -34,7 +36,7 @@
     _descriptor.FieldDescriptor(
       name='name', full_name='helloworld.HelloRequest.name', index=0,
       number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      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),
@@ -65,7 +67,7 @@
     _descriptor.FieldDescriptor(
       name='message', full_name='helloworld.HelloReply.message', index=0,
       number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      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),
@@ -104,69 +106,28 @@
 
 
 DESCRIPTOR.has_options = True
-DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), b'\n\020io.grpc.examples\242\002\003HLW')
+DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW'))
 import abc
+import six
 from grpc.beta import implementations as beta_implementations
-from grpc.early_adopter import implementations as early_adopter_implementations
-from grpc.framework.alpha import utilities as alpha_utilities
+from grpc.beta import interfaces as beta_interfaces
 from grpc.framework.common import cardinality
 from grpc.framework.interfaces.face import utilities as face_utilities
-class EarlyAdopterGreeterServicer(object):
-  """<fill me in later!>"""
-  __metaclass__ = abc.ABCMeta
-  @abc.abstractmethod
-  def SayHello(self, request, context):
-    raise NotImplementedError()
-class EarlyAdopterGreeterServer(object):
-  """<fill me in later!>"""
-  __metaclass__ = abc.ABCMeta
-  @abc.abstractmethod
-  def start(self):
-    raise NotImplementedError()
-  @abc.abstractmethod
-  def stop(self):
-    raise NotImplementedError()
-class EarlyAdopterGreeterStub(object):
-  """<fill me in later!>"""
-  __metaclass__ = abc.ABCMeta
-  @abc.abstractmethod
-  def SayHello(self, request):
-    raise NotImplementedError()
-  SayHello.async = None
-def early_adopter_create_Greeter_server(servicer, port, private_key=None, certificate_chain=None):
-  import helloworld_pb2
-  import helloworld_pb2
-  method_service_descriptions = {
-    "SayHello": alpha_utilities.unary_unary_service_description(
-      servicer.SayHello,
-      helloworld_pb2.HelloRequest.FromString,
-      helloworld_pb2.HelloReply.SerializeToString,
-    ),
-  }
-  return early_adopter_implementations.server("helloworld.Greeter", method_service_descriptions, port, private_key=private_key, certificate_chain=certificate_chain)
-def early_adopter_create_Greeter_stub(host, port, metadata_transformer=None, secure=False, root_certificates=None, private_key=None, certificate_chain=None, server_host_override=None):
-  import helloworld_pb2
-  import helloworld_pb2
-  method_invocation_descriptions = {
-    "SayHello": alpha_utilities.unary_unary_invocation_description(
-      helloworld_pb2.HelloRequest.SerializeToString,
-      helloworld_pb2.HelloReply.FromString,
-    ),
-  }
-  return early_adopter_implementations.stub("helloworld.Greeter", method_invocation_descriptions, host, port, metadata_transformer=metadata_transformer, secure=secure, root_certificates=root_certificates, private_key=private_key, certificate_chain=certificate_chain, server_host_override=server_host_override)
 
 class BetaGreeterServicer(object):
-  """<fill me in later!>"""
-  __metaclass__ = abc.ABCMeta
-  @abc.abstractmethod
+  """The greeting service definition.
+  """
   def SayHello(self, request, context):
-    raise NotImplementedError()
+    """Sends a greeting
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
 
 class BetaGreeterStub(object):
-  """The interface to which stubs will conform."""
-  __metaclass__ = abc.ABCMeta
-  @abc.abstractmethod
+  """The greeting service definition.
+  """
   def SayHello(self, request, timeout):
+    """Sends a greeting
+    """
     raise NotImplementedError()
   SayHello.future = None
 
diff --git a/examples/python/route_guide/route_guide_pb2.py b/examples/python/route_guide/route_guide_pb2.py
index d4d9f8d..81d5d07 100644
--- a/examples/python/route_guide/route_guide_pb2.py
+++ b/examples/python/route_guide/route_guide_pb2.py
@@ -1,6 +1,8 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: route_guide.proto
 
+import sys
+_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
@@ -17,7 +19,7 @@
   name='route_guide.proto',
   package='routeguide',
   syntax='proto3',
-  serialized_pb=b'\n\x11route_guide.proto\x12\nrouteguide\",\n\x05Point\x12\x10\n\x08latitude\x18\x01 \x01(\x05\x12\x11\n\tlongitude\x18\x02 \x01(\x05\"I\n\tRectangle\x12\x1d\n\x02lo\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x1d\n\x02hi\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"<\n\x07\x46\x65\x61ture\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x08location\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"A\n\tRouteNote\x12#\n\x08location\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x0f\n\x07message\x18\x02 \x01(\t\"b\n\x0cRouteSummary\x12\x13\n\x0bpoint_count\x18\x01 \x01(\x05\x12\x15\n\rfeature_count\x18\x02 \x01(\x05\x12\x10\n\x08\x64istance\x18\x03 \x01(\x05\x12\x14\n\x0c\x65lapsed_time\x18\x04 \x01(\x05\x32\x85\x02\n\nRouteGuide\x12\x36\n\nGetFeature\x12\x11.routeguide.Point\x1a\x13.routeguide.Feature\"\x00\x12>\n\x0cListFeatures\x12\x15.routeguide.Rectangle\x1a\x13.routeguide.Feature\"\x00\x30\x01\x12>\n\x0bRecordRoute\x12\x11.routeguide.Point\x1a\x18.routeguide.RouteSummary\"\x00(\x01\x12?\n\tRouteChat\x12\x15.routeguide.RouteNote\x1a\x15.routeguide.RouteNote\"\x00(\x01\x30\x01\x42\x0f\n\x07\x65x.grpc\xa2\x02\x03RTGb\x06proto3'
+  serialized_pb=_b('\n\x11route_guide.proto\x12\nrouteguide\",\n\x05Point\x12\x10\n\x08latitude\x18\x01 \x01(\x05\x12\x11\n\tlongitude\x18\x02 \x01(\x05\"I\n\tRectangle\x12\x1d\n\x02lo\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x1d\n\x02hi\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"<\n\x07\x46\x65\x61ture\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x08location\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"A\n\tRouteNote\x12#\n\x08location\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x0f\n\x07message\x18\x02 \x01(\t\"b\n\x0cRouteSummary\x12\x13\n\x0bpoint_count\x18\x01 \x01(\x05\x12\x15\n\rfeature_count\x18\x02 \x01(\x05\x12\x10\n\x08\x64istance\x18\x03 \x01(\x05\x12\x14\n\x0c\x65lapsed_time\x18\x04 \x01(\x05\x32\x85\x02\n\nRouteGuide\x12\x36\n\nGetFeature\x12\x11.routeguide.Point\x1a\x13.routeguide.Feature\"\x00\x12>\n\x0cListFeatures\x12\x15.routeguide.Rectangle\x1a\x13.routeguide.Feature\"\x00\x30\x01\x12>\n\x0bRecordRoute\x12\x11.routeguide.Point\x1a\x18.routeguide.RouteSummary\"\x00(\x01\x12?\n\tRouteChat\x12\x15.routeguide.RouteNote\x1a\x15.routeguide.RouteNote\"\x00(\x01\x30\x01\x42\x36\n\x1bio.grpc.examples.routeguideB\x0fRouteGuideProtoP\x01\xa2\x02\x03RTGb\x06proto3')
 )
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
@@ -110,7 +112,7 @@
     _descriptor.FieldDescriptor(
       name='name', full_name='routeguide.Feature.name', index=0,
       number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      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),
@@ -155,7 +157,7 @@
     _descriptor.FieldDescriptor(
       name='message', full_name='routeguide.RouteNote.message', index=1,
       number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      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),
@@ -274,149 +276,86 @@
 
 
 DESCRIPTOR.has_options = True
-DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), b'\n\007ex.grpc\242\002\003RTG')
+DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.routeguideB\017RouteGuideProtoP\001\242\002\003RTG'))
 import abc
+import six
 from grpc.beta import implementations as beta_implementations
-from grpc.early_adopter import implementations as early_adopter_implementations
-from grpc.framework.alpha import utilities as alpha_utilities
+from grpc.beta import interfaces as beta_interfaces
 from grpc.framework.common import cardinality
 from grpc.framework.interfaces.face import utilities as face_utilities
-class EarlyAdopterRouteGuideServicer(object):
-  """<fill me in later!>"""
-  __metaclass__ = abc.ABCMeta
-  @abc.abstractmethod
-  def GetFeature(self, request, context):
-    raise NotImplementedError()
-  @abc.abstractmethod
-  def ListFeatures(self, request, context):
-    raise NotImplementedError()
-  @abc.abstractmethod
-  def RecordRoute(self, request_iterator, context):
-    raise NotImplementedError()
-  @abc.abstractmethod
-  def RouteChat(self, request_iterator, context):
-    raise NotImplementedError()
-class EarlyAdopterRouteGuideServer(object):
-  """<fill me in later!>"""
-  __metaclass__ = abc.ABCMeta
-  @abc.abstractmethod
-  def start(self):
-    raise NotImplementedError()
-  @abc.abstractmethod
-  def stop(self):
-    raise NotImplementedError()
-class EarlyAdopterRouteGuideStub(object):
-  """<fill me in later!>"""
-  __metaclass__ = abc.ABCMeta
-  @abc.abstractmethod
-  def GetFeature(self, request):
-    raise NotImplementedError()
-  GetFeature.async = None
-  @abc.abstractmethod
-  def ListFeatures(self, request):
-    raise NotImplementedError()
-  ListFeatures.async = None
-  @abc.abstractmethod
-  def RecordRoute(self, request_iterator):
-    raise NotImplementedError()
-  RecordRoute.async = None
-  @abc.abstractmethod
-  def RouteChat(self, request_iterator):
-    raise NotImplementedError()
-  RouteChat.async = None
-def early_adopter_create_RouteGuide_server(servicer, port, private_key=None, certificate_chain=None):
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  method_service_descriptions = {
-    "GetFeature": alpha_utilities.unary_unary_service_description(
-      servicer.GetFeature,
-      route_guide_pb2.Point.FromString,
-      route_guide_pb2.Feature.SerializeToString,
-    ),
-    "ListFeatures": alpha_utilities.unary_stream_service_description(
-      servicer.ListFeatures,
-      route_guide_pb2.Rectangle.FromString,
-      route_guide_pb2.Feature.SerializeToString,
-    ),
-    "RecordRoute": alpha_utilities.stream_unary_service_description(
-      servicer.RecordRoute,
-      route_guide_pb2.Point.FromString,
-      route_guide_pb2.RouteSummary.SerializeToString,
-    ),
-    "RouteChat": alpha_utilities.stream_stream_service_description(
-      servicer.RouteChat,
-      route_guide_pb2.RouteNote.FromString,
-      route_guide_pb2.RouteNote.SerializeToString,
-    ),
-  }
-  return early_adopter_implementations.server("routeguide.RouteGuide", method_service_descriptions, port, private_key=private_key, certificate_chain=certificate_chain)
-def early_adopter_create_RouteGuide_stub(host, port, metadata_transformer=None, secure=False, root_certificates=None, private_key=None, certificate_chain=None, server_host_override=None):
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  import route_guide_pb2
-  method_invocation_descriptions = {
-    "GetFeature": alpha_utilities.unary_unary_invocation_description(
-      route_guide_pb2.Point.SerializeToString,
-      route_guide_pb2.Feature.FromString,
-    ),
-    "ListFeatures": alpha_utilities.unary_stream_invocation_description(
-      route_guide_pb2.Rectangle.SerializeToString,
-      route_guide_pb2.Feature.FromString,
-    ),
-    "RecordRoute": alpha_utilities.stream_unary_invocation_description(
-      route_guide_pb2.Point.SerializeToString,
-      route_guide_pb2.RouteSummary.FromString,
-    ),
-    "RouteChat": alpha_utilities.stream_stream_invocation_description(
-      route_guide_pb2.RouteNote.SerializeToString,
-      route_guide_pb2.RouteNote.FromString,
-    ),
-  }
-  return early_adopter_implementations.stub("routeguide.RouteGuide", method_invocation_descriptions, host, port, metadata_transformer=metadata_transformer, secure=secure, root_certificates=root_certificates, private_key=private_key, certificate_chain=certificate_chain, server_host_override=server_host_override)
 
 class BetaRouteGuideServicer(object):
-  """<fill me in later!>"""
-  __metaclass__ = abc.ABCMeta
-  @abc.abstractmethod
+  """Interface exported by the server.
+  """
   def GetFeature(self, request, context):
-    raise NotImplementedError()
-  @abc.abstractmethod
+    """A simple RPC.
+
+    Obtains the feature at a given position.
+
+    A feature with an empty name is returned if there's no feature at the given
+    position.
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
   def ListFeatures(self, request, context):
-    raise NotImplementedError()
-  @abc.abstractmethod
+    """A server-to-client streaming RPC.
+
+    Obtains the Features available within the given Rectangle.  Results are
+    streamed rather than returned at once (e.g. in a response message with a
+    repeated field), as the rectangle may cover a large area and contain a
+    huge number of features.
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
   def RecordRoute(self, request_iterator, context):
-    raise NotImplementedError()
-  @abc.abstractmethod
+    """A client-to-server streaming RPC.
+
+    Accepts a stream of Points on a route being traversed, returning a
+    RouteSummary when traversal is completed.
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
   def RouteChat(self, request_iterator, context):
-    raise NotImplementedError()
+    """A Bidirectional streaming RPC.
+
+    Accepts a stream of RouteNotes sent while a route is being traversed,
+    while receiving other RouteNotes (e.g. from other users).
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
 
 class BetaRouteGuideStub(object):
-  """The interface to which stubs will conform."""
-  __metaclass__ = abc.ABCMeta
-  @abc.abstractmethod
+  """Interface exported by the server.
+  """
   def GetFeature(self, request, timeout):
+    """A simple RPC.
+
+    Obtains the feature at a given position.
+
+    A feature with an empty name is returned if there's no feature at the given
+    position.
+    """
     raise NotImplementedError()
   GetFeature.future = None
-  @abc.abstractmethod
   def ListFeatures(self, request, timeout):
+    """A server-to-client streaming RPC.
+
+    Obtains the Features available within the given Rectangle.  Results are
+    streamed rather than returned at once (e.g. in a response message with a
+    repeated field), as the rectangle may cover a large area and contain a
+    huge number of features.
+    """
     raise NotImplementedError()
-  @abc.abstractmethod
   def RecordRoute(self, request_iterator, timeout):
+    """A client-to-server streaming RPC.
+
+    Accepts a stream of Points on a route being traversed, returning a
+    RouteSummary when traversal is completed.
+    """
     raise NotImplementedError()
   RecordRoute.future = None
-  @abc.abstractmethod
   def RouteChat(self, request_iterator, timeout):
+    """A Bidirectional streaming RPC.
+
+    Accepts a stream of RouteNotes sent while a route is being traversed,
+    while receiving other RouteNotes (e.g. from other users).
+    """
     raise NotImplementedError()
 
 def beta_create_RouteGuide_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
diff --git a/gRPC.podspec b/gRPC.podspec
index 77d35bd..67e7a81 100644
--- a/gRPC.podspec
+++ b/gRPC.podspec
@@ -36,7 +36,7 @@
 
 Pod::Spec.new do |s|
   s.name     = 'gRPC'
-  version = '0.12.0'
+  version = '0.14.0'
   s.version  = version
   s.summary  = 'gRPC client library for iOS/OSX'
   s.homepage = 'http://www.grpc.io'
@@ -44,7 +44,8 @@
   s.authors  = { 'The gRPC contributors' => 'grpc-packages@google.com' }
 
   s.source = { :git => 'https://github.com/grpc/grpc.git',
-               :tag => "release-#{version.gsub(/\./, '_')}-objectivec-#{version}" }
+               :tag => "release-#{version.gsub(/\./, '_')}-objectivec-#{version}",
+               :submodules => true }
 
 
   s.ios.deployment_target = '7.1'
@@ -181,6 +182,7 @@
                       'src/core/lib/iomgr/endpoint.h',
                       'src/core/lib/iomgr/endpoint_pair.h',
                       'src/core/lib/iomgr/ev_poll_and_epoll_posix.h',
+                      'src/core/lib/iomgr/ev_poll_posix.h',
                       'src/core/lib/iomgr/ev_posix.h',
                       'src/core/lib/iomgr/exec_ctx.h',
                       'src/core/lib/iomgr/executor.h',
@@ -287,8 +289,9 @@
                       'src/core/ext/client_config/subchannel_call_holder.h',
                       'src/core/ext/client_config/subchannel_index.h',
                       'src/core/ext/client_config/uri_parser.h',
+                      'third_party/objective_c/Cronet/cronet_c_for_grpc.h',
                       'src/core/ext/lb_policy/grpclb/load_balancer_api.h',
-                      'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h',
+                      'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h',
                       'third_party/nanopb/pb.h',
                       'third_party/nanopb/pb_common.h',
                       'third_party/nanopb/pb_decode.h',
@@ -305,6 +308,7 @@
                       'include/grpc/grpc.h',
                       'include/grpc/status.h',
                       'include/grpc/impl/codegen/byte_buffer.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/grpc_types.h',
@@ -324,6 +328,7 @@
                       'include/grpc/impl/codegen/sync_posix.h',
                       'include/grpc/impl/codegen/sync_win32.h',
                       'include/grpc/impl/codegen/time.h',
+                      'include/grpc/grpc_cronet.h',
                       'include/grpc/grpc_security.h',
                       'include/grpc/grpc_security_constants.h',
                       'include/grpc/census.h',
@@ -346,6 +351,7 @@
                       'src/core/lib/iomgr/endpoint_pair_posix.c',
                       'src/core/lib/iomgr/endpoint_pair_windows.c',
                       'src/core/lib/iomgr/ev_poll_and_epoll_posix.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',
@@ -473,8 +479,11 @@
                       'src/core/ext/client_config/uri_parser.c',
                       'src/core/ext/transport/chttp2/server/insecure/server_chttp2.c',
                       'src/core/ext/transport/chttp2/client/insecure/channel_create.c',
+                      'src/core/ext/transport/cronet/client/secure/cronet_channel_create.c',
+                      'src/core/ext/transport/cronet/transport/cronet_api_dummy.c',
+                      'src/core/ext/transport/cronet/transport/cronet_transport.c',
                       'src/core/ext/lb_policy/grpclb/load_balancer_api.c',
-                      'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c',
+                      'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c',
                       'third_party/nanopb/pb_common.c',
                       'third_party/nanopb/pb_decode.c',
                       'third_party/nanopb/pb_encode.c',
@@ -523,6 +532,7 @@
                               'src/core/lib/iomgr/endpoint.h',
                               'src/core/lib/iomgr/endpoint_pair.h',
                               'src/core/lib/iomgr/ev_poll_and_epoll_posix.h',
+                              'src/core/lib/iomgr/ev_poll_posix.h',
                               'src/core/lib/iomgr/ev_posix.h',
                               'src/core/lib/iomgr/exec_ctx.h',
                               'src/core/lib/iomgr/executor.h',
@@ -629,8 +639,9 @@
                               'src/core/ext/client_config/subchannel_call_holder.h',
                               'src/core/ext/client_config/subchannel_index.h',
                               'src/core/ext/client_config/uri_parser.h',
+                              'third_party/objective_c/Cronet/cronet_c_for_grpc.h',
                               'src/core/ext/lb_policy/grpclb/load_balancer_api.h',
-                              'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h',
+                              'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h',
                               'third_party/nanopb/pb.h',
                               'third_party/nanopb/pb_common.h',
                               'third_party/nanopb/pb_decode.h',
@@ -654,7 +665,7 @@
 
     ss.requires_arc = false
     ss.libraries = 'z'
-    ss.dependency 'BoringSSL', '~> 2.0'
+    ss.dependency 'BoringSSL', '~> 3.0'
 
     # ss.compiler_flags = '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w'
   end
diff --git a/grpc.def b/grpc.def
index 61948ed..09a94a6 100644
--- a/grpc.def
+++ b/grpc.def
@@ -87,6 +87,7 @@
     grpc_header_nonbin_value_is_legal
     grpc_is_binary_header
     grpc_call_error_to_string
+    grpc_cronet_secure_channel_create
     grpc_auth_property_iterator_next
     grpc_auth_context_property_iterator
     grpc_auth_context_peer_identity
diff --git a/grpc.gemspec b/grpc.gemspec
index e68cd81..13aed6b 100755
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -149,6 +149,7 @@
   s.files += %w( include/grpc/grpc.h )
   s.files += %w( include/grpc/status.h )
   s.files += %w( include/grpc/impl/codegen/byte_buffer.h )
+  s.files += %w( include/grpc/impl/codegen/byte_buffer_reader.h )
   s.files += %w( include/grpc/impl/codegen/compression_types.h )
   s.files += %w( include/grpc/impl/codegen/connectivity_state.h )
   s.files += %w( include/grpc/impl/codegen/grpc_types.h )
@@ -168,6 +169,7 @@
   s.files += %w( include/grpc/impl/codegen/sync_posix.h )
   s.files += %w( include/grpc/impl/codegen/sync_win32.h )
   s.files += %w( include/grpc/impl/codegen/time.h )
+  s.files += %w( include/grpc/grpc_cronet.h )
   s.files += %w( include/grpc/grpc_security.h )
   s.files += %w( include/grpc/grpc_security_constants.h )
   s.files += %w( include/grpc/census.h )
@@ -189,6 +191,7 @@
   s.files += %w( src/core/lib/iomgr/endpoint.h )
   s.files += %w( src/core/lib/iomgr/endpoint_pair.h )
   s.files += %w( src/core/lib/iomgr/ev_poll_and_epoll_posix.h )
+  s.files += %w( src/core/lib/iomgr/ev_poll_posix.h )
   s.files += %w( src/core/lib/iomgr/ev_posix.h )
   s.files += %w( src/core/lib/iomgr/exec_ctx.h )
   s.files += %w( src/core/lib/iomgr/executor.h )
@@ -295,8 +298,9 @@
   s.files += %w( src/core/ext/client_config/subchannel_call_holder.h )
   s.files += %w( src/core/ext/client_config/subchannel_index.h )
   s.files += %w( src/core/ext/client_config/uri_parser.h )
+  s.files += %w( third_party/objective_c/Cronet/cronet_c_for_grpc.h )
   s.files += %w( src/core/ext/lb_policy/grpclb/load_balancer_api.h )
-  s.files += %w( src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h )
+  s.files += %w( src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h )
   s.files += %w( third_party/nanopb/pb.h )
   s.files += %w( third_party/nanopb/pb_common.h )
   s.files += %w( third_party/nanopb/pb_decode.h )
@@ -326,6 +330,7 @@
   s.files += %w( src/core/lib/iomgr/endpoint_pair_posix.c )
   s.files += %w( src/core/lib/iomgr/endpoint_pair_windows.c )
   s.files += %w( src/core/lib/iomgr/ev_poll_and_epoll_posix.c )
+  s.files += %w( src/core/lib/iomgr/ev_poll_posix.c )
   s.files += %w( src/core/lib/iomgr/ev_posix.c )
   s.files += %w( src/core/lib/iomgr/exec_ctx.c )
   s.files += %w( src/core/lib/iomgr/executor.c )
@@ -453,8 +458,11 @@
   s.files += %w( src/core/ext/client_config/uri_parser.c )
   s.files += %w( src/core/ext/transport/chttp2/server/insecure/server_chttp2.c )
   s.files += %w( src/core/ext/transport/chttp2/client/insecure/channel_create.c )
+  s.files += %w( src/core/ext/transport/cronet/client/secure/cronet_channel_create.c )
+  s.files += %w( src/core/ext/transport/cronet/transport/cronet_api_dummy.c )
+  s.files += %w( src/core/ext/transport/cronet/transport/cronet_transport.c )
   s.files += %w( src/core/ext/lb_policy/grpclb/load_balancer_api.c )
-  s.files += %w( src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c )
+  s.files += %w( src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c )
   s.files += %w( third_party/nanopb/pb_common.c )
   s.files += %w( third_party/nanopb/pb_decode.c )
   s.files += %w( third_party/nanopb/pb_encode.c )
diff --git a/include/grpc++/impl/codegen/call.h b/include/grpc++/impl/codegen/call.h
index aea1a6a..d081b7d 100644
--- a/include/grpc++/impl/codegen/call.h
+++ b/include/grpc++/impl/codegen/call.h
@@ -281,10 +281,9 @@
     if (message_ == nullptr) return;
     if (recv_buf_) {
       if (*status) {
-        got_message = true;
-        *status = SerializationTraits<R>::Deserialize(recv_buf_, message_,
-                                                      max_message_size)
-                      .ok();
+        got_message = *status = SerializationTraits<R>::Deserialize(
+                                    recv_buf_, message_, max_message_size)
+                                    .ok();
       } else {
         got_message = false;
         g_core_codegen_interface->grpc_byte_buffer_destroy(recv_buf_);
diff --git a/include/grpc++/impl/codegen/core_codegen_interface.h b/include/grpc++/impl/codegen/core_codegen_interface.h
index 16424ba..aa9013c 100644
--- a/include/grpc++/impl/codegen/core_codegen_interface.h
+++ b/include/grpc++/impl/codegen/core_codegen_interface.h
@@ -49,18 +49,6 @@
 /// \warning This interface should be considered internal and private.
 class CoreCodegenInterface {
  public:
-  // Serialize the msg into a buffer created inside the function. The caller
-  // should destroy the returned buffer when done with it. If serialization
-  // fails,
-  // false is returned and buffer is left unchanged.
-  virtual Status SerializeProto(const grpc::protobuf::Message& msg,
-                                grpc_byte_buffer** buffer) = 0;
-
-  // The caller keeps ownership of buffer and msg.
-  virtual Status DeserializeProto(grpc_byte_buffer* buffer,
-                                  grpc::protobuf::Message* msg,
-                                  int max_message_size) = 0;
-
   /// Upon a failed assertion, log the error.
   virtual void assert_fail(const char* failed_assertion) = 0;
 
@@ -76,9 +64,29 @@
   virtual void gpr_free(void* p) = 0;
 
   virtual void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) = 0;
+
+  virtual void grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader,
+                                            grpc_byte_buffer* buffer) = 0;
+  virtual void grpc_byte_buffer_reader_destroy(
+      grpc_byte_buffer_reader* reader) = 0;
+  virtual int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader,
+                                           gpr_slice* slice) = 0;
+
+  virtual grpc_byte_buffer* grpc_raw_byte_buffer_create(gpr_slice* slice,
+                                                        size_t nslices) = 0;
+
+  virtual gpr_slice gpr_slice_malloc(size_t length) = 0;
+  virtual void gpr_slice_unref(gpr_slice slice) = 0;
+  virtual gpr_slice gpr_slice_split_tail(gpr_slice* s, size_t split) = 0;
+  virtual void gpr_slice_buffer_add(gpr_slice_buffer* sb, gpr_slice slice) = 0;
+  virtual void gpr_slice_buffer_pop(gpr_slice_buffer* sb) = 0;
+
   virtual void grpc_metadata_array_init(grpc_metadata_array* array) = 0;
   virtual void grpc_metadata_array_destroy(grpc_metadata_array* array) = 0;
 
+  virtual const Status& ok() = 0;
+  virtual const Status& cancelled() = 0;
+
   virtual gpr_timespec gpr_inf_future(gpr_clock_type type) = 0;
 };
 
diff --git a/include/grpc++/impl/codegen/method_handler_impl.h b/include/grpc++/impl/codegen/method_handler_impl.h
index ad74efa..21ac6c4 100644
--- a/include/grpc++/impl/codegen/method_handler_impl.h
+++ b/include/grpc++/impl/codegen/method_handler_impl.h
@@ -44,10 +44,10 @@
 template <class ServiceType, class RequestType, class ResponseType>
 class RpcMethodHandler : public MethodHandler {
  public:
-  RpcMethodHandler(
-      std::function<Status(ServiceType*, ServerContext*, const RequestType*,
-                           ResponseType*)> func,
-      ServiceType* service)
+  RpcMethodHandler(std::function<Status(ServiceType*, ServerContext*,
+                                        const RequestType*, ResponseType*)>
+                       func,
+                   ServiceType* service)
       : func_(func), service_(service) {}
 
   void RunHandler(const HandlerParameter& param) GRPC_FINAL {
@@ -88,7 +88,8 @@
  public:
   ClientStreamingHandler(
       std::function<Status(ServiceType*, ServerContext*,
-                           ServerReader<RequestType>*, ResponseType*)> func,
+                           ServerReader<RequestType>*, ResponseType*)>
+          func,
       ServiceType* service)
       : func_(func), service_(service) {}
 
@@ -124,7 +125,8 @@
  public:
   ServerStreamingHandler(
       std::function<Status(ServiceType*, ServerContext*, const RequestType*,
-                           ServerWriter<ResponseType>*)> func,
+                           ServerWriter<ResponseType>*)>
+          func,
       ServiceType* service)
       : func_(func), service_(service) {}
 
diff --git a/include/grpc++/impl/codegen/proto_utils.h b/include/grpc++/impl/codegen/proto_utils.h
index 2aaa3c3..d044ddc 100644
--- a/include/grpc++/impl/codegen/proto_utils.h
+++ b/include/grpc++/impl/codegen/proto_utils.h
@@ -41,26 +41,179 @@
 #include <grpc++/impl/codegen/serialization_traits.h>
 #include <grpc++/impl/codegen/status.h>
 #include <grpc/impl/codegen/byte_buffer.h>
+#include <grpc/impl/codegen/byte_buffer_reader.h>
 #include <grpc/impl/codegen/log.h>
+#include <grpc/impl/codegen/slice.h>
 
 namespace grpc {
 
 extern CoreCodegenInterface* g_core_codegen_interface;
 
+namespace {
+
+const int kGrpcBufferWriterMaxBufferLength = 8192;
+
+class GrpcBufferWriter GRPC_FINAL
+    : public ::grpc::protobuf::io::ZeroCopyOutputStream {
+ public:
+  explicit GrpcBufferWriter(grpc_byte_buffer** bp, int block_size)
+      : block_size_(block_size), byte_count_(0), have_backup_(false) {
+    *bp = g_core_codegen_interface->grpc_raw_byte_buffer_create(NULL, 0);
+    slice_buffer_ = &(*bp)->data.raw.slice_buffer;
+  }
+
+  ~GrpcBufferWriter() GRPC_OVERRIDE {
+    if (have_backup_) {
+      g_core_codegen_interface->gpr_slice_unref(backup_slice_);
+    }
+  }
+
+  bool Next(void** data, int* size) GRPC_OVERRIDE {
+    if (have_backup_) {
+      slice_ = backup_slice_;
+      have_backup_ = false;
+    } else {
+      slice_ = g_core_codegen_interface->gpr_slice_malloc(block_size_);
+    }
+    *data = GPR_SLICE_START_PTR(slice_);
+    // On win x64, int is only 32bit
+    GPR_CODEGEN_ASSERT(GPR_SLICE_LENGTH(slice_) <= INT_MAX);
+    byte_count_ += * size = (int)GPR_SLICE_LENGTH(slice_);
+    g_core_codegen_interface->gpr_slice_buffer_add(slice_buffer_, slice_);
+    return true;
+  }
+
+  void BackUp(int count) GRPC_OVERRIDE {
+    g_core_codegen_interface->gpr_slice_buffer_pop(slice_buffer_);
+    if (count == block_size_) {
+      backup_slice_ = slice_;
+    } else {
+      backup_slice_ = g_core_codegen_interface->gpr_slice_split_tail(
+          &slice_, GPR_SLICE_LENGTH(slice_) - count);
+      g_core_codegen_interface->gpr_slice_buffer_add(slice_buffer_, slice_);
+    }
+    have_backup_ = true;
+    byte_count_ -= count;
+  }
+
+  grpc::protobuf::int64 ByteCount() const GRPC_OVERRIDE { return byte_count_; }
+
+ private:
+  const int block_size_;
+  int64_t byte_count_;
+  gpr_slice_buffer* slice_buffer_;
+  bool have_backup_;
+  gpr_slice backup_slice_;
+  gpr_slice slice_;
+};
+
+class GrpcBufferReader GRPC_FINAL
+    : public ::grpc::protobuf::io::ZeroCopyInputStream {
+ public:
+  explicit GrpcBufferReader(grpc_byte_buffer* buffer)
+      : byte_count_(0), backup_count_(0) {
+    g_core_codegen_interface->grpc_byte_buffer_reader_init(&reader_, buffer);
+  }
+  ~GrpcBufferReader() GRPC_OVERRIDE {
+    g_core_codegen_interface->grpc_byte_buffer_reader_destroy(&reader_);
+  }
+
+  bool Next(const void** data, int* size) GRPC_OVERRIDE {
+    if (backup_count_ > 0) {
+      *data = GPR_SLICE_START_PTR(slice_) + GPR_SLICE_LENGTH(slice_) -
+              backup_count_;
+      GPR_CODEGEN_ASSERT(backup_count_ <= INT_MAX);
+      *size = (int)backup_count_;
+      backup_count_ = 0;
+      return true;
+    }
+    if (!g_core_codegen_interface->grpc_byte_buffer_reader_next(&reader_,
+                                                                &slice_)) {
+      return false;
+    }
+    g_core_codegen_interface->gpr_slice_unref(slice_);
+    *data = GPR_SLICE_START_PTR(slice_);
+    // On win x64, int is only 32bit
+    GPR_CODEGEN_ASSERT(GPR_SLICE_LENGTH(slice_) <= INT_MAX);
+    byte_count_ += * size = (int)GPR_SLICE_LENGTH(slice_);
+    return true;
+  }
+
+  void BackUp(int count) GRPC_OVERRIDE { backup_count_ = count; }
+
+  bool Skip(int count) GRPC_OVERRIDE {
+    const void* data;
+    int size;
+    while (Next(&data, &size)) {
+      if (size >= count) {
+        BackUp(size - count);
+        return true;
+      }
+      // size < count;
+      count -= size;
+    }
+    // error or we have too large count;
+    return false;
+  }
+
+  grpc::protobuf::int64 ByteCount() const GRPC_OVERRIDE {
+    return byte_count_ - backup_count_;
+  }
+
+ private:
+  int64_t byte_count_;
+  int64_t backup_count_;
+  grpc_byte_buffer_reader reader_;
+  gpr_slice slice_;
+};
+}  // namespace
+
 template <class T>
 class SerializationTraits<T, typename std::enable_if<std::is_base_of<
                                  grpc::protobuf::Message, T>::value>::type> {
  public:
   static Status Serialize(const grpc::protobuf::Message& msg,
-                          grpc_byte_buffer** buffer, bool* own_buffer) {
+                          grpc_byte_buffer** bp, bool* own_buffer) {
     *own_buffer = true;
-    return g_core_codegen_interface->SerializeProto(msg, buffer);
+    int byte_size = msg.ByteSize();
+    if (byte_size <= kGrpcBufferWriterMaxBufferLength) {
+      gpr_slice slice = g_core_codegen_interface->gpr_slice_malloc(byte_size);
+      GPR_CODEGEN_ASSERT(
+          GPR_SLICE_END_PTR(slice) ==
+          msg.SerializeWithCachedSizesToArray(GPR_SLICE_START_PTR(slice)));
+      *bp = g_core_codegen_interface->grpc_raw_byte_buffer_create(&slice, 1);
+      g_core_codegen_interface->gpr_slice_unref(slice);
+      return g_core_codegen_interface->ok();
+    } else {
+      GrpcBufferWriter writer(bp, kGrpcBufferWriterMaxBufferLength);
+      return msg.SerializeToZeroCopyStream(&writer)
+                 ? g_core_codegen_interface->ok()
+                 : Status(StatusCode::INTERNAL, "Failed to serialize message");
+    }
   }
+
   static Status Deserialize(grpc_byte_buffer* buffer,
                             grpc::protobuf::Message* msg,
                             int max_message_size) {
-    return g_core_codegen_interface->DeserializeProto(buffer, msg,
-                                                      max_message_size);
+    if (buffer == nullptr) {
+      return Status(StatusCode::INTERNAL, "No payload");
+    }
+    Status result = g_core_codegen_interface->ok();
+    {
+      GrpcBufferReader reader(buffer);
+      ::grpc::protobuf::io::CodedInputStream decoder(&reader);
+      if (max_message_size > 0) {
+        decoder.SetTotalBytesLimit(max_message_size, max_message_size);
+      }
+      if (!msg->ParseFromCodedStream(&decoder)) {
+        result = Status(StatusCode::INTERNAL, msg->InitializationErrorString());
+      }
+      if (!decoder.ConsumedEntireMessage()) {
+        result = Status(StatusCode::INTERNAL, "Did not read entire message");
+      }
+    }
+    g_core_codegen_interface->grpc_byte_buffer_destroy(buffer);
+    return result;
   }
 };
 
diff --git a/include/grpc++/impl/server_builder_option.h b/include/grpc++/impl/server_builder_option.h
index bcb1982..2b7e89f 100644
--- a/include/grpc++/impl/server_builder_option.h
+++ b/include/grpc++/impl/server_builder_option.h
@@ -34,6 +34,10 @@
 #ifndef GRPCXX_IMPL_SERVER_BUILDER_OPTION_H
 #define GRPCXX_IMPL_SERVER_BUILDER_OPTION_H
 
+#include <map>
+#include <memory>
+
+#include <grpc++/impl/server_builder_plugin.h>
 #include <grpc++/support/channel_arguments.h>
 
 namespace grpc {
@@ -44,6 +48,10 @@
   virtual ~ServerBuilderOption() {}
   /// Alter the \a ChannelArguments used to create the gRPC server.
   virtual void UpdateArguments(ChannelArguments* args) = 0;
+  /// Alter the ServerBuilderPlugin map that will be added into ServerBuilder.
+  virtual void UpdatePlugins(
+      std::map<grpc::string, std::unique_ptr<ServerBuilderPlugin> >*
+          plugins) = 0;
 };
 
 }  // namespace grpc
diff --git a/examples/node/greeter_client.js b/include/grpc++/impl/server_builder_plugin.h
similarity index 60%
copy from examples/node/greeter_client.js
copy to include/grpc++/impl/server_builder_plugin.h
index 2820acb..1e157ef 100644
--- a/examples/node/greeter_client.js
+++ b/include/grpc++/impl/server_builder_plugin.h
@@ -1,6 +1,6 @@
 /*
  *
- * Copyright 2015, Google Inc.
+ * Copyright 2016, Google Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,23 +31,37 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+#ifndef GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H
+#define GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H
 
-var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
+#include <memory>
 
-function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
-                                       grpc.credentials.createInsecure());
-  var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
-  } else {
-    user = 'world';
-  }
-  client.sayHello({name: user}, function(err, response) {
-    console.log('Greeting:', response.message);
-  });
-}
+#include <grpc++/support/config.h>
 
-main();
+namespace grpc {
+
+class ServerInitializer;
+
+class ServerBuilderPlugin {
+ public:
+  virtual ~ServerBuilderPlugin() {}
+  virtual grpc::string name() = 0;
+
+  // InitServer will be called in ServerBuilder::BuildAndStart(), after the
+  // Server instance is created.
+  virtual void InitServer(ServerInitializer* si) = 0;
+
+  // Finish will be called at the end of ServerBuilder::BuildAndStart().
+  virtual void Finish(ServerInitializer* si) = 0;
+
+  // ChangeArguments is an interface that can be used in
+  // ServerBuilderOption::UpdatePlugins
+  virtual void ChangeArguments(const grpc::string& name, void* value) = 0;
+
+  virtual bool has_sync_methods() const { return false; }
+  virtual bool has_async_methods() const { return false; }
+};
+
+}  // namespace grpc
+
+#endif  // GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H
diff --git a/examples/node/greeter_client.js b/include/grpc++/impl/server_initializer.h
similarity index 66%
copy from examples/node/greeter_client.js
copy to include/grpc++/impl/server_initializer.h
index 2820acb..dbcecc7 100644
--- a/examples/node/greeter_client.js
+++ b/include/grpc++/impl/server_initializer.h
@@ -1,6 +1,6 @@
 /*
  *
- * Copyright 2015, Google Inc.
+ * Copyright 2016, Google Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,23 +31,40 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+#ifndef GRPCXX_IMPL_SERVER_INITIALIZER_H
+#define GRPCXX_IMPL_SERVER_INITIALIZER_H
 
-var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
+#include <memory>
+#include <vector>
 
-function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
-                                       grpc.credentials.createInsecure());
-  var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
-  } else {
-    user = 'world';
+#include <grpc++/server.h>
+
+namespace grpc {
+
+class Server;
+class Service;
+
+class ServerInitializer {
+ public:
+  ServerInitializer(Server* server) : server_(server) {}
+
+  bool RegisterService(std::shared_ptr<Service> service) {
+    if (!server_->RegisterService(nullptr, service.get())) {
+      return false;
+    }
+    default_services_.push_back(service);
+    return true;
   }
-  client.sayHello({name: user}, function(err, response) {
-    console.log('Greeting:', response.message);
-  });
-}
 
-main();
+  const std::vector<grpc::string>* GetServiceList() {
+    return &server_->services_;
+  }
+
+ private:
+  Server* server_;
+  std::vector<std::shared_ptr<Service> > default_services_;
+};
+
+}  // namespace grpc
+
+#endif  // GRPCXX_IMPL_SERVER_INITIALIZER_H
diff --git a/include/grpc++/server.h b/include/grpc++/server.h
index 729a514..a0ee0e9 100644
--- a/include/grpc++/server.h
+++ b/include/grpc++/server.h
@@ -36,6 +36,7 @@
 
 #include <list>
 #include <memory>
+#include <vector>
 
 #include <grpc++/completion_queue.h>
 #include <grpc++/impl/call.h>
@@ -57,6 +58,7 @@
 class AsyncGenericService;
 class ServerAsyncStreamingInterface;
 class ServerContext;
+class ServerInitializer;
 class ThreadPoolInterface;
 
 /// Models a gRPC server.
@@ -94,6 +96,7 @@
  private:
   friend class AsyncGenericService;
   friend class ServerBuilder;
+  friend class ServerInitializer;
 
   class SyncRequest;
   class AsyncRequest;
@@ -159,6 +162,8 @@
 
   grpc_server* server() GRPC_OVERRIDE { return server_; };
 
+  ServerInitializer* initializer();
+
   const int max_message_size_;
 
   // Completion queue.
@@ -175,6 +180,7 @@
   std::shared_ptr<GlobalCallbacks> global_callbacks_;
 
   std::list<SyncRequest>* sync_methods_;
+  std::vector<grpc::string> services_;
   std::unique_ptr<RpcServiceMethod> unknown_method_;
   bool has_generic_service_;
 
@@ -184,6 +190,8 @@
   ThreadPoolInterface* thread_pool_;
   // Whether the thread pool is created and owned by the server.
   bool thread_pool_owned_;
+
+  std::unique_ptr<ServerInitializer> server_initializer_;
 };
 
 }  // namespace grpc
diff --git a/include/grpc++/server_builder.h b/include/grpc++/server_builder.h
index 86c7fec..ad62952 100644
--- a/include/grpc++/server_builder.h
+++ b/include/grpc++/server_builder.h
@@ -34,10 +34,12 @@
 #ifndef GRPCXX_SERVER_BUILDER_H
 #define GRPCXX_SERVER_BUILDER_H
 
+#include <map>
 #include <memory>
 #include <vector>
 
 #include <grpc++/impl/server_builder_option.h>
+#include <grpc++/impl/server_builder_plugin.h>
 #include <grpc++/support/config.h>
 #include <grpc/compression.h>
 
@@ -51,6 +53,10 @@
 class ServerCredentials;
 class Service;
 
+namespace testing {
+class ServerBuilderPluginTest;
+}  // namespace testing
+
 /// A builder class for the creation and startup of \a grpc::Server instances.
 class ServerBuilder {
  public:
@@ -107,7 +113,13 @@
   /// Return a running server which is ready for processing calls.
   std::unique_ptr<Server> BuildAndStart();
 
+  /// For internal use only: Register a ServerBuilderPlugin factory function.
+  static void InternalAddPluginFactory(
+      std::unique_ptr<ServerBuilderPlugin> (*CreatePlugin)());
+
  private:
+  friend class ::grpc::testing::ServerBuilderPluginTest;
+
   struct Port {
     grpc::string addr;
     std::shared_ptr<ServerCredentials> creds;
@@ -130,6 +142,7 @@
   std::vector<Port> ports_;
   std::vector<ServerCompletionQueue*> cqs_;
   std::shared_ptr<ServerCredentials> creds_;
+  std::map<grpc::string, std::unique_ptr<ServerBuilderPlugin>> plugins_;
   AsyncGenericService* generic_service_;
 };
 
diff --git a/include/grpc/byte_buffer_reader.h b/include/grpc/byte_buffer_reader.h
index 9a1c617..e95bf2f 100644
--- a/include/grpc/byte_buffer_reader.h
+++ b/include/grpc/byte_buffer_reader.h
@@ -34,25 +34,6 @@
 #ifndef GRPC_BYTE_BUFFER_READER_H
 #define GRPC_BYTE_BUFFER_READER_H
 
-#include <grpc/byte_buffer.h>
-#include <grpc/grpc.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct grpc_byte_buffer_reader {
-  grpc_byte_buffer *buffer_in;
-  grpc_byte_buffer *buffer_out;
-  /* Different current objects correspond to different types of byte buffers */
-  union {
-    /* Index into a slice buffer's array of slices */
-    unsigned index;
-  } current;
-};
-
-#ifdef __cplusplus
-}
-#endif
+#include <grpc/impl/codegen/byte_buffer_reader.h>
 
 #endif /* GRPC_BYTE_BUFFER_READER_H */
diff --git a/examples/node/greeter_client.js b/include/grpc/grpc_cronet.h
similarity index 72%
copy from examples/node/greeter_client.js
copy to include/grpc/grpc_cronet.h
index 2820acb..295e0f5 100644
--- a/examples/node/greeter_client.js
+++ b/include/grpc/grpc_cronet.h
@@ -1,6 +1,6 @@
 /*
  *
- * Copyright 2015, Google Inc.
+ * Copyright 2016, Google Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,23 +31,21 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+#ifndef GRPC_GRPC_CRONET_H
+#define GRPC_GRPC_CRONET_H
 
-var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
+#include <grpc/grpc.h>
 
-function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
-                                       grpc.credentials.createInsecure());
-  var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
-  } else {
-    user = 'world';
-  }
-  client.sayHello({name: user}, function(err, response) {
-    console.log('Greeting:', response.message);
-  });
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+GRPCAPI grpc_channel *grpc_cronet_secure_channel_create(
+    void *engine, const char *target, const grpc_channel_args *args,
+    void *reserved);
+
+#ifdef __cplusplus
 }
+#endif
 
-main();
+#endif /* GRPC_GRPC_CRONET_H */
diff --git a/examples/node/greeter_client.js b/include/grpc/impl/codegen/byte_buffer_reader.h
similarity index 74%
copy from examples/node/greeter_client.js
copy to include/grpc/impl/codegen/byte_buffer_reader.h
index 2820acb..10c3829 100644
--- a/examples/node/greeter_client.js
+++ b/include/grpc/impl/codegen/byte_buffer_reader.h
@@ -31,23 +31,27 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+#ifndef GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H
+#define GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H
 
-var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
+#include <grpc/impl/codegen/byte_buffer.h>
 
-function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
-                                       grpc.credentials.createInsecure());
-  var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
-  } else {
-    user = 'world';
-  }
-  client.sayHello({name: user}, function(err, response) {
-    console.log('Greeting:', response.message);
-  });
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct grpc_byte_buffer_reader {
+  grpc_byte_buffer *buffer_in;
+  grpc_byte_buffer *buffer_out;
+  /* Different current objects correspond to different types of byte buffers */
+  union {
+    /* Index into a slice buffer's array of slices */
+    unsigned index;
+  } current;
+};
+
+#ifdef __cplusplus
 }
+#endif
 
-main();
+#endif /* GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H */
diff --git a/include/grpc/impl/codegen/compression_types.h b/include/grpc/impl/codegen/compression_types.h
index 0daccd9..8d2ec3b 100644
--- a/include/grpc/impl/codegen/compression_types.h
+++ b/include/grpc/impl/codegen/compression_types.h
@@ -41,10 +41,13 @@
 #endif
 
 /** To be used in channel arguments */
-#define GRPC_COMPRESSION_ALGORITHM_ARG "grpc.compression_algorithm"
-#define GRPC_COMPRESSION_ALGORITHM_STATE_ARG "grpc.compression_algorithm_state"
+#define GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM \
+  "grpc.default_compression_algorithm"
+#define GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL "grpc.default_compression_level"
+#define GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET \
+  "grpc.compression_enabled_algorithms_bitset"
 
-/* The various compression algorithms supported by GRPC */
+/* The various compression algorithms supported by gRPC */
 typedef enum {
   GRPC_COMPRESS_NONE = 0,
   GRPC_COMPRESS_DEFLATE,
@@ -53,6 +56,10 @@
   GRPC_COMPRESS_ALGORITHMS_COUNT
 } grpc_compression_algorithm;
 
+/** Compression levels allow a party with knowledge of its peer's accepted
+ * encodings to request compression in an abstract way. The level-algorithm
+ * mapping is performed internally and depends on the peer's supported
+ * compression algorithms. */
 typedef enum {
   GRPC_COMPRESS_LEVEL_NONE = 0,
   GRPC_COMPRESS_LEVEL_LOW,
@@ -62,8 +69,20 @@
 } grpc_compression_level;
 
 typedef struct grpc_compression_options {
-  uint32_t enabled_algorithms_bitset; /**< All algs are enabled by default */
-  grpc_compression_algorithm default_compression_algorithm; /**< for channel */
+  /** All algs are enabled by default. This option corresponds to the channel
+   * argument key behind \a GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET
+   */
+  uint32_t enabled_algorithms_bitset;
+
+  /** The default channel compression algorithm. It'll be used in the absence of
+   * call specific settings. This option corresponds to the channel argument key
+   * behind \a GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM */
+  grpc_compression_algorithm default_compression_algorithm;
+
+  /** The default channel compression level. It'll be used in the absence of
+   * call specific settings. This option corresponds to the channel argument key
+   * behind \a GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL */
+  grpc_compression_algorithm default_compression_level;
 } grpc_compression_options;
 
 #ifdef __cplusplus
diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h
index 4c73730..af3d0c2 100644
--- a/include/grpc/impl/codegen/grpc_types.h
+++ b/include/grpc/impl/codegen/grpc_types.h
@@ -152,6 +152,8 @@
    channel). If this parameter is specified and the underlying is not an SSL
    channel, it will just be ignored. */
 #define GRPC_SSL_TARGET_NAME_OVERRIDE_ARG "grpc.ssl_target_name_override"
+/* Maximum metadata size */
+#define GRPC_ARG_MAX_METADATA_SIZE "grpc.max_metadata_size"
 
 /** Result of a grpc call. If the caller satisfies the prerequisites of a
     particular operation, the grpc_call_error returned will be GRPC_CALL_OK.
@@ -307,7 +309,9 @@
   GRPC_OP_RECV_STATUS_ON_CLIENT,
   /** Receive close on the server: one and only one must be made on the
       server.
-      This op completes after the close has been received by the server. */
+      This op completes after the close has been received by the server.
+      This operation always succeeds, meaning ops paired with this operation
+      will also appear to succeed, even though they may not have. */
   GRPC_OP_RECV_CLOSE_ON_SERVER
 } grpc_op_type;
 
diff --git a/include/grpc/impl/codegen/port_platform.h b/include/grpc/impl/codegen/port_platform.h
index 1229d48..d2d9ac7 100644
--- a/include/grpc/impl/codegen/port_platform.h
+++ b/include/grpc/impl/codegen/port_platform.h
@@ -114,6 +114,38 @@
 #define GPR_WIN32_ATOMIC 1
 #define GPR_MSVC_TLS 1
 #endif
+#elif defined(GPR_MANYLINUX1)
+// TODO(atash): manylinux1 is just another __linux__ but with ancient
+// libraries; it should be integrated with the `__linux__` definitions below.
+#define GPR_PLATFORM_STRING "manylinux"
+#define GPR_POSIX_CRASH_HANDLER 1
+#define GPR_CPU_LINUX 1
+#define GPR_GCC_ATOMIC 1
+#define GPR_GCC_TLS 1
+#define GPR_LINUX 1
+#define GPR_LINUX_LOG 1
+#define GPR_POSIX_SOCKET 1
+#define GPR_POSIX_WAKEUP_FD 1
+#define GPR_POSIX_SOCKETADDR 1
+#define GPR_POSIX_NO_SPECIAL_WAKEUP_FD 1
+#define GPR_POSIX_SOCKETUTILS 1
+#define GPR_HAVE_UNIX_SOCKET 1
+#define GPR_HAVE_IP_PKTINFO 1
+#define GPR_HAVE_IPV6_RECVPKTINFO 1
+#define GPR_LINUX_ENV 1
+#define GPR_POSIX_FILE 1
+#define GPR_POSIX_TMPFILE 1
+#define GPR_POSIX_STRING 1
+#define GPR_POSIX_SUBPROCESS 1
+#define GPR_POSIX_SYNC 1
+#define GPR_POSIX_TIME 1
+#define GPR_GETPID_IN_UNISTD_H 1
+#define GPR_HAVE_MSG_NOSIGNAL 1
+#ifdef _LP64
+#define GPR_ARCH_64 1
+#else /* _LP64 */
+#define GPR_ARCH_32 1
+#endif /* _LP64 */
 #elif defined(ANDROID) || defined(__ANDROID__)
 #define GPR_PLATFORM_STRING "android"
 #define GPR_ANDROID 1
diff --git a/include/grpc/impl/codegen/slice_buffer.h b/include/grpc/impl/codegen/slice_buffer.h
index 8ca51ba..7858021 100644
--- a/include/grpc/impl/codegen/slice_buffer.h
+++ b/include/grpc/impl/codegen/slice_buffer.h
@@ -42,9 +42,8 @@
 
 #define GRPC_SLICE_BUFFER_INLINE_ELEMENTS 8
 
-/* Represents an expandable array of slices, to be interpreted as a single item
-   TODO(ctiller): inline some small number of elements into the struct, to
-                  avoid per-call allocations */
+/* Represents an expandable array of slices, to be interpreted as a
+   single item. */
 typedef struct {
   /* slices in the array */
   gpr_slice *slices;
diff --git a/package.json b/package.json
index 5ed7f36..5bdaa76 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "grpc",
-  "version": "0.14.0-dev",
+  "version": "0.15.0-dev",
   "author": "Google Inc.",
   "description": "gRPC Library for Node",
   "homepage": "http://www.grpc.io/",
@@ -67,6 +67,8 @@
     "src/node/ext",
     "include/grpc",
     "src/core",
+    "src/boringssl",
+    "src/zlib",
     "third_party/nanopb",
     "third_party/zlib",
     "third_party/boringssl",
diff --git a/package.xml b/package.xml
index ffb1c56..33a769a 100644
--- a/package.xml
+++ b/package.xml
@@ -13,8 +13,8 @@
  <date>2016-04-19</date>
  <time>16:06:07</time>
  <version>
-  <release>0.14.0</release>
-  <api>0.14.0</api>
+  <release>0.15.0</release>
+  <api>0.15.0</api>
  </version>
  <stability>
   <release>beta</release>
@@ -156,6 +156,7 @@
     <file baseinstalldir="/" name="include/grpc/grpc.h" role="src" />
     <file baseinstalldir="/" name="include/grpc/status.h" role="src" />
     <file baseinstalldir="/" name="include/grpc/impl/codegen/byte_buffer.h" role="src" />
+    <file baseinstalldir="/" name="include/grpc/impl/codegen/byte_buffer_reader.h" role="src" />
     <file baseinstalldir="/" name="include/grpc/impl/codegen/compression_types.h" role="src" />
     <file baseinstalldir="/" name="include/grpc/impl/codegen/connectivity_state.h" role="src" />
     <file baseinstalldir="/" name="include/grpc/impl/codegen/grpc_types.h" role="src" />
@@ -175,6 +176,7 @@
     <file baseinstalldir="/" name="include/grpc/impl/codegen/sync_posix.h" role="src" />
     <file baseinstalldir="/" name="include/grpc/impl/codegen/sync_win32.h" role="src" />
     <file baseinstalldir="/" name="include/grpc/impl/codegen/time.h" role="src" />
+    <file baseinstalldir="/" name="include/grpc/grpc_cronet.h" role="src" />
     <file baseinstalldir="/" name="include/grpc/grpc_security.h" role="src" />
     <file baseinstalldir="/" name="include/grpc/grpc_security_constants.h" role="src" />
     <file baseinstalldir="/" name="include/grpc/census.h" role="src" />
@@ -196,6 +198,7 @@
     <file baseinstalldir="/" name="src/core/lib/iomgr/endpoint.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/iomgr/endpoint_pair.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/iomgr/ev_poll_and_epoll_posix.h" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/iomgr/ev_poll_posix.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/iomgr/ev_posix.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/iomgr/exec_ctx.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/iomgr/executor.h" role="src" />
@@ -302,8 +305,9 @@
     <file baseinstalldir="/" name="src/core/ext/client_config/subchannel_call_holder.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_config/subchannel_index.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_config/uri_parser.h" role="src" />
+    <file baseinstalldir="/" name="third_party/objective_c/Cronet/cronet_c_for_grpc.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/lb_policy/grpclb/load_balancer_api.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h" role="src" />
     <file baseinstalldir="/" name="third_party/nanopb/pb.h" role="src" />
     <file baseinstalldir="/" name="third_party/nanopb/pb_common.h" role="src" />
     <file baseinstalldir="/" name="third_party/nanopb/pb_decode.h" role="src" />
@@ -333,6 +337,7 @@
     <file baseinstalldir="/" name="src/core/lib/iomgr/endpoint_pair_posix.c" role="src" />
     <file baseinstalldir="/" name="src/core/lib/iomgr/endpoint_pair_windows.c" role="src" />
     <file baseinstalldir="/" name="src/core/lib/iomgr/ev_poll_and_epoll_posix.c" role="src" />
+    <file baseinstalldir="/" name="src/core/lib/iomgr/ev_poll_posix.c" role="src" />
     <file baseinstalldir="/" name="src/core/lib/iomgr/ev_posix.c" role="src" />
     <file baseinstalldir="/" name="src/core/lib/iomgr/exec_ctx.c" role="src" />
     <file baseinstalldir="/" name="src/core/lib/iomgr/executor.c" role="src" />
@@ -460,8 +465,11 @@
     <file baseinstalldir="/" name="src/core/ext/client_config/uri_parser.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/server/insecure/server_chttp2.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/insecure/channel_create.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/transport/cronet/client/secure/cronet_channel_create.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/transport/cronet/transport/cronet_api_dummy.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/transport/cronet/transport/cronet_transport.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/lb_policy/grpclb/load_balancer_api.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c" role="src" />
     <file baseinstalldir="/" name="third_party/nanopb/pb_common.c" role="src" />
     <file baseinstalldir="/" name="third_party/nanopb/pb_decode.c" role="src" />
     <file baseinstalldir="/" name="third_party/nanopb/pb_encode.c" role="src" />
@@ -1013,8 +1021,8 @@
   </release>
   <release>
    <version>
-    <release>0.14.0</release>
-    <api>0.14.0</api>
+    <release>0.15.0</release>
+    <api>0.15.0</api>
    </version>
    <stability>
     <release>beta</release>
diff --git a/setup.py b/setup.py
index cd0d3a1..f96824f 100644
--- a/setup.py
+++ b/setup.py
@@ -54,7 +54,6 @@
 
 # Break import-style to ensure we can actually find our in-repo dependencies.
 import commands
-import precompiled
 import grpc_core_dependencies
 import grpc_version
 
@@ -173,7 +172,6 @@
     'build_project_metadata': commands.BuildProjectMetadata,
     'build_py': commands.BuildPy,
     'build_ext': commands.BuildExt,
-    'build_tagged_ext': precompiled.BuildTaggedExt,
     'gather': commands.Gather,
     'run_interop': commands.RunInterop,
     'test_lite': commands.TestLite
@@ -229,23 +227,21 @@
   PACKAGES = setuptools.find_packages(
       PYTHON_STEM, exclude=['tests', 'tests.*'])
 
-setup_arguments = {
-    'name': 'grpcio',
-    'version': grpc_version.VERSION,
-    'license': LICENSE,
-    'ext_modules': CYTHON_EXTENSION_MODULES,
-    'packages': list(PACKAGES),
-    'package_dir': PACKAGE_DIRECTORIES,
-    'package_data': PACKAGE_DATA,
-    'install_requires': INSTALL_REQUIRES,
-    'setup_requires': SETUP_REQUIRES,
-    'cmdclass': COMMAND_CLASS,
-    'tests_require': TESTS_REQUIRE,
-    'test_suite': TEST_SUITE,
-    'test_loader': TEST_LOADER,
-    'test_runner': TEST_RUNNER,
-}
-
-precompiled.update_setup_arguments(setup_arguments)
-
-setuptools.setup(**setup_arguments)
+setuptools.setup(
+  name='grpcio',
+  version=grpc_version.VERSION,
+  license=LICENSE,
+  ext_modules=CYTHON_EXTENSION_MODULES,
+  packages=list(PACKAGES),
+  package_dir=PACKAGE_DIRECTORIES,
+  # TODO(atash): Figure out why auditwheel doesn't like namespace packages.
+  #namespace_packages=['grpc'],
+  package_data=PACKAGE_DATA,
+  install_requires=INSTALL_REQUIRES,
+  setup_requires=SETUP_REQUIRES,
+  cmdclass=COMMAND_CLASS,
+  tests_require=TESTS_REQUIRE,
+  test_suite=TEST_SUITE,
+  test_loader=TEST_LOADER,
+  test_runner=TEST_RUNNER,
+)
diff --git a/src/compiler/csharp_generator.cc b/src/compiler/csharp_generator.cc
index ac0fee1..29c359c 100644
--- a/src/compiler/csharp_generator.cc
+++ b/src/compiler/csharp_generator.cc
@@ -214,10 +214,10 @@
   switch (GetMethodType(method)) {
     case METHODTYPE_NO_STREAMING:
     case METHODTYPE_CLIENT_STREAMING:
-      return "Task<" + GetClassName(method->output_type()) + ">";
+      return "global::System.Threading.Tasks.Task<" + GetClassName(method->output_type()) + ">";
     case METHODTYPE_SERVER_STREAMING:
     case METHODTYPE_BIDI_STREAMING:
-      return "Task";
+      return "global::System.Threading.Tasks.Task";
   }
   GOOGLE_LOG(FATAL)<< "Can't get here.";
   return "";
diff --git a/src/compiler/python_generator.cc b/src/compiler/python_generator.cc
index 59137e1..cd5ddd8 100644
--- a/src/compiler/python_generator.cc
+++ b/src/compiler/python_generator.cc
@@ -147,7 +147,8 @@
 // END FORMATTING BOILERPLATE //
 ////////////////////////////////
 
-// TODO(protobuf team): Export `ModuleName` from protobuf's
+// TODO(https://github.com/google/protobuf/issues/888):
+// Export `ModuleName` from protobuf's
 // `src/google/protobuf/compiler/python/python_generator.cc` file.
 grpc::string ModuleName(const grpc::string& filename) {
   grpc::string basename = StripProto(filename);
@@ -156,8 +157,23 @@
   return basename + "_pb2";
 }
 
+// TODO(https://github.com/google/protobuf/issues/888):
+// Export `ModuleAlias` from protobuf's
+// `src/google/protobuf/compiler/python/python_generator.cc` file.
+grpc::string ModuleAlias(const grpc::string& filename) {
+  grpc::string module_name = ModuleName(filename);
+  // We can't have dots in the module name, so we replace each with _dot_.
+  // But that could lead to a collision between a.b and a_dot_b, so we also
+  // duplicate each underscore.
+  module_name = StringReplace(module_name, "_", "__");
+  module_name = StringReplace(module_name, ".", "_dot_");
+  return module_name;
+}
+
+
 bool GetModuleAndMessagePath(const Descriptor* type,
-                             pair<grpc::string, grpc::string>* out) {
+                             const ServiceDescriptor* service,
+                             grpc::string* out) {
   const Descriptor* path_elem_type = type;
   vector<const Descriptor*> message_path;
   do {
@@ -170,7 +186,9 @@
         file_name.find_last_of(".proto") == file_name.size() - 1)) {
     return false;
   }
-  grpc::string module = ModuleName(file_name);
+  grpc::string service_file_name = service->file()->name();
+  grpc::string module = service_file_name == file_name ?
+          "" : ModuleAlias(file_name) + ".";
   grpc::string message_type;
   for (auto path_iter = message_path.rbegin();
        path_iter != message_path.rend(); ++path_iter) {
@@ -178,22 +196,44 @@
   }
   // no pop_back prior to C++11
   message_type.resize(message_type.size() - 1);
-  *out = make_pair(module, message_type);
+  *out = module + message_type;
   return true;
 }
 
+// Get all comments (leading, leading_detached, trailing) and print them as a
+// docstring. Any leading space of a line will be removed, but the line wrapping
+// will not be changed.
+template <typename DescriptorType>
+static void PrintAllComments(const DescriptorType* desc, Printer* printer) {
+  std::vector<grpc::string> comments;
+  grpc_generator::GetComment(desc, grpc_generator::COMMENTTYPE_LEADING_DETACHED,
+                             &comments);
+  grpc_generator::GetComment(desc, grpc_generator::COMMENTTYPE_LEADING,
+                             &comments);
+  grpc_generator::GetComment(desc, grpc_generator::COMMENTTYPE_TRAILING,
+                             &comments);
+  if (comments.empty()) {
+    return;
+  }
+  printer->Print("\"\"\"");
+  for (auto it = comments.begin(); it != comments.end(); ++it) {
+    size_t start_pos = it->find_first_not_of(' ');
+    if (start_pos != grpc::string::npos) {
+      printer->Print(it->c_str() + start_pos);
+    }
+    printer->Print("\n");
+  }
+  printer->Print("\"\"\"\n");
+}
+
 bool PrintBetaServicer(const ServiceDescriptor* service,
                        Printer* out) {
-  grpc::string doc = "<fill me in later!>";
-  map<grpc::string, grpc::string> dict = ListToDict({
-        "Service", service->name(),
-        "Documentation", doc,
-      });
-  out->Print("\n");
-  out->Print(dict, "class Beta$Service$Servicer(object):\n");
+  out->Print("\n\n");
+  out->Print("class Beta$Service$Servicer(object):\n", "Service",
+             service->name());
   {
     IndentScope raii_class_indent(out);
-    out->Print(dict, "\"\"\"$Documentation$\"\"\"\n");
+    PrintAllComments(service, out);
     for (int i = 0; i < service->method_count(); ++i) {
       auto meth = service->method(i);
       grpc::string arg_name = meth->client_streaming() ?
@@ -202,6 +242,7 @@
                  "Method", meth->name(), "ArgName", arg_name);
       {
         IndentScope raii_method_indent(out);
+        PrintAllComments(meth, out);
         out->Print("context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)\n");
       }
     }
@@ -211,24 +252,20 @@
 
 bool PrintBetaStub(const ServiceDescriptor* service,
                    Printer* out) {
-  grpc::string doc = "The interface to which stubs will conform.";
-  map<grpc::string, grpc::string> dict = ListToDict({
-        "Service", service->name(),
-        "Documentation", doc,
-      });
-  out->Print("\n");
-  out->Print(dict, "class Beta$Service$Stub(object):\n");
+  out->Print("\n\n");
+  out->Print("class Beta$Service$Stub(object):\n", "Service", service->name());
   {
     IndentScope raii_class_indent(out);
-    out->Print(dict, "\"\"\"$Documentation$\"\"\"\n");
+    PrintAllComments(service, out);
     for (int i = 0; i < service->method_count(); ++i) {
       const MethodDescriptor* meth = service->method(i);
       grpc::string arg_name = meth->client_streaming() ?
           "request_iterator" : "request";
       auto methdict = ListToDict({"Method", meth->name(), "ArgName", arg_name});
-      out->Print(methdict, "def $Method$(self, $ArgName$, timeout):\n");
+      out->Print(methdict, "def $Method$(self, $ArgName$, timeout, metadata=None, with_call=False, protocol_options=None):\n");
       {
         IndentScope raii_method_indent(out);
+        PrintAllComments(meth, out);
         out->Print("raise NotImplementedError()\n");
       }
       if (!meth->server_streaming()) {
@@ -241,38 +278,31 @@
 
 bool PrintBetaServerFactory(const grpc::string& package_qualified_service_name,
                             const ServiceDescriptor* service, Printer* out) {
-  out->Print("\n");
+  out->Print("\n\n");
   out->Print("def beta_create_$Service$_server(servicer, pool=None, "
              "pool_size=None, default_timeout=None, maximum_timeout=None):\n",
              "Service", service->name());
   {
     IndentScope raii_create_server_indent(out);
     map<grpc::string, grpc::string> method_implementation_constructors;
-    map<grpc::string, pair<grpc::string, grpc::string>>
-        input_message_modules_and_classes;
-    map<grpc::string, pair<grpc::string, grpc::string>>
-        output_message_modules_and_classes;
+    map<grpc::string, grpc::string> input_message_modules_and_classes;
+    map<grpc::string, grpc::string> output_message_modules_and_classes;
     for (int i = 0; i < service->method_count(); ++i) {
       const MethodDescriptor* method = service->method(i);
       const grpc::string method_implementation_constructor =
           grpc::string(method->client_streaming() ? "stream_" : "unary_") +
           grpc::string(method->server_streaming() ? "stream_" : "unary_") +
           "inline";
-      pair<grpc::string, grpc::string> input_message_module_and_class;
-      if (!GetModuleAndMessagePath(method->input_type(),
+      grpc::string input_message_module_and_class;
+      if (!GetModuleAndMessagePath(method->input_type(), service,
                                    &input_message_module_and_class)) {
         return false;
       }
-      pair<grpc::string, grpc::string> output_message_module_and_class;
-      if (!GetModuleAndMessagePath(method->output_type(),
+      grpc::string output_message_module_and_class;
+      if (!GetModuleAndMessagePath(method->output_type(), service,
                                    &output_message_module_and_class)) {
         return false;
       }
-      // Import the modules that define the messages used in RPCs.
-      out->Print("import $Module$\n", "Module",
-                 input_message_module_and_class.first);
-      out->Print("import $Module$\n", "Module",
-                 output_message_module_and_class.first);
       method_implementation_constructors.insert(
           make_pair(method->name(), method_implementation_constructor));
       input_message_modules_and_classes.insert(
@@ -288,13 +318,11 @@
          name_and_input_module_class_pair++) {
       IndentScope raii_indent(out);
       out->Print("(\'$PackageQualifiedServiceName$\', \'$MethodName$\'): "
-                 "$InputTypeModule$.$InputTypeClass$.FromString,\n",
+                 "$InputTypeModuleAndClass$.FromString,\n",
                  "PackageQualifiedServiceName", package_qualified_service_name,
                  "MethodName", name_and_input_module_class_pair->first,
-                 "InputTypeModule",
-                 name_and_input_module_class_pair->second.first,
-                 "InputTypeClass",
-                 name_and_input_module_class_pair->second.second);
+                 "InputTypeModuleAndClass",
+                 name_and_input_module_class_pair->second);
     }
     out->Print("}\n");
     out->Print("response_serializers = {\n");
@@ -305,13 +333,11 @@
          name_and_output_module_class_pair++) {
       IndentScope raii_indent(out);
       out->Print("(\'$PackageQualifiedServiceName$\', \'$MethodName$\'): "
-                 "$OutputTypeModule$.$OutputTypeClass$.SerializeToString,\n",
+                 "$OutputTypeModuleAndClass$.SerializeToString,\n",
                  "PackageQualifiedServiceName", package_qualified_service_name,
                  "MethodName", name_and_output_module_class_pair->first,
-                 "OutputTypeModule",
-                 name_and_output_module_class_pair->second.first,
-                 "OutputTypeClass",
-                 name_and_output_module_class_pair->second.second);
+                 "OutputTypeModuleAndClass",
+                 name_and_output_module_class_pair->second);
     }
     out->Print("}\n");
     out->Print("method_implementations = {\n");
@@ -347,37 +373,30 @@
   map<grpc::string, grpc::string> dict = ListToDict({
         "Service", service->name(),
       });
-  out->Print("\n");
+  out->Print("\n\n");
   out->Print(dict, "def beta_create_$Service$_stub(channel, host=None,"
              " metadata_transformer=None, pool=None, pool_size=None):\n");
   {
     IndentScope raii_create_server_indent(out);
     map<grpc::string, grpc::string> method_cardinalities;
-    map<grpc::string, pair<grpc::string, grpc::string>>
-        input_message_modules_and_classes;
-    map<grpc::string, pair<grpc::string, grpc::string>>
-        output_message_modules_and_classes;
+    map<grpc::string, grpc::string> input_message_modules_and_classes;
+    map<grpc::string, grpc::string> output_message_modules_and_classes;
     for (int i = 0; i < service->method_count(); ++i) {
       const MethodDescriptor* method = service->method(i);
       const grpc::string method_cardinality =
           grpc::string(method->client_streaming() ? "STREAM" : "UNARY") +
           "_" +
-	  grpc::string(method->server_streaming() ? "STREAM" : "UNARY");
-      pair<grpc::string, grpc::string> input_message_module_and_class;
-      if (!GetModuleAndMessagePath(method->input_type(),
+          grpc::string(method->server_streaming() ? "STREAM" : "UNARY");
+      grpc::string input_message_module_and_class;
+      if (!GetModuleAndMessagePath(method->input_type(), service,
                                    &input_message_module_and_class)) {
         return false;
       }
-      pair<grpc::string, grpc::string> output_message_module_and_class;
-      if (!GetModuleAndMessagePath(method->output_type(),
+      grpc::string output_message_module_and_class;
+      if (!GetModuleAndMessagePath(method->output_type(), service,
                                    &output_message_module_and_class)) {
         return false;
       }
-      // Import the modules that define the messages used in RPCs.
-      out->Print("import $Module$\n", "Module",
-                 input_message_module_and_class.first);
-      out->Print("import $Module$\n", "Module",
-                 output_message_module_and_class.first);
       method_cardinalities.insert(
           make_pair(method->name(), method_cardinality));
       input_message_modules_and_classes.insert(
@@ -393,13 +412,11 @@
          name_and_input_module_class_pair++) {
       IndentScope raii_indent(out);
       out->Print("(\'$PackageQualifiedServiceName$\', \'$MethodName$\'): "
-                 "$InputTypeModule$.$InputTypeClass$.SerializeToString,\n",
+                 "$InputTypeModuleAndClass$.SerializeToString,\n",
                  "PackageQualifiedServiceName", package_qualified_service_name,
                  "MethodName", name_and_input_module_class_pair->first,
-                 "InputTypeModule",
-                 name_and_input_module_class_pair->second.first,
-                 "InputTypeClass",
-                 name_and_input_module_class_pair->second.second);
+                 "InputTypeModuleAndClass",
+                 name_and_input_module_class_pair->second);
     }
     out->Print("}\n");
     out->Print("response_deserializers = {\n");
@@ -410,13 +427,11 @@
          name_and_output_module_class_pair++) {
       IndentScope raii_indent(out);
       out->Print("(\'$PackageQualifiedServiceName$\', \'$MethodName$\'): "
-                 "$OutputTypeModule$.$OutputTypeClass$.FromString,\n",
+                 "$OutputTypeModuleAndClass$.FromString,\n",
                  "PackageQualifiedServiceName", package_qualified_service_name,
                  "MethodName", name_and_output_module_class_pair->first,
-                 "OutputTypeModule",
-                 name_and_output_module_class_pair->second.first,
-                 "OutputTypeClass",
-                 name_and_output_module_class_pair->second.second);
+                 "OutputTypeModuleAndClass",
+                 name_and_output_module_class_pair->second);
     }
     out->Print("}\n");
     out->Print("cardinalities = {\n");
@@ -444,8 +459,6 @@
 
 bool PrintPreamble(const FileDescriptor* file,
                    const GeneratorConfiguration& config, Printer* out) {
-  out->Print("import abc\n");
-  out->Print("import six\n");
   out->Print("from $Package$ import implementations as beta_implementations\n",
              "Package", config.beta_package_root);
   out->Print("from $Package$ import interfaces as beta_interfaces\n",
diff --git a/src/compiler/ruby_generator.cc b/src/compiler/ruby_generator.cc
index 5ac56ad..936a186 100644
--- a/src/compiler/ruby_generator.cc
+++ b/src/compiler/ruby_generator.cc
@@ -98,8 +98,8 @@
   out->Print("self.marshal_class_method = :encode\n");
   out->Print("self.unmarshal_class_method = :decode\n");
   std::map<grpc::string, grpc::string> pkg_vars =
-      ListToDict({"service.name", service->name(), "pkg.name", package, });
-  out->Print(pkg_vars, "self.service_name = '$pkg.name$.$service.name$'\n");
+      ListToDict({"service_full_name", service->full_name()});
+  out->Print(pkg_vars, "self.service_name = '$service_full_name$'\n");
   out->Print("\n");
   for (int i = 0; i < service->method_count(); ++i) {
     PrintMethod(service->method(i), package, out);
diff --git a/src/core/ext/client_config/resolver_registry.c b/src/core/ext/client_config/resolver_registry.c
index 07f29bc..e7a4abd 100644
--- a/src/core/ext/client_config/resolver_registry.c
+++ b/src/core/ext/client_config/resolver_registry.c
@@ -47,7 +47,6 @@
 static char *g_default_resolver_prefix;
 
 void grpc_resolver_registry_init(const char *default_resolver_prefix) {
-  g_number_of_resolvers = 0;
   g_default_resolver_prefix = gpr_strdup(default_resolver_prefix);
 }
 
@@ -57,6 +56,13 @@
     grpc_resolver_factory_unref(g_all_of_the_resolvers[i]);
   }
   gpr_free(g_default_resolver_prefix);
+  // FIXME(ctiller): this should live in grpc_resolver_registry_init,
+  // however that would have the client_config plugin call this AFTER we start
+  // registering resolvers from third party plugins, and so they'd never show
+  // up.
+  // We likely need some kind of dependency system for plugins.... what form
+  // that takes is TBD.
+  g_number_of_resolvers = 0;
 }
 
 void grpc_register_resolver_type(grpc_resolver_factory *factory) {
diff --git a/src/core/ext/client_config/subchannel.c b/src/core/ext/client_config/subchannel.c
index 3a5af9f..bd45d38 100644
--- a/src/core/ext/client_config/subchannel.c
+++ b/src/core/ext/client_config/subchannel.c
@@ -268,7 +268,7 @@
   con = GET_CONNECTED_SUBCHANNEL(c, no_barrier);
   if (con != NULL) {
     GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, con, "connection");
-    gpr_atm_no_barrier_store(&c->connected_subchannel, 0xdeadbeef);
+    gpr_atm_no_barrier_store(&c->connected_subchannel, (gpr_atm)0xdeadbeef);
   }
   gpr_mu_unlock(&c->mu);
 }
diff --git a/src/core/ext/client_config/subchannel_call_holder.c b/src/core/ext/client_config/subchannel_call_holder.c
index 9918fbd..91fa917 100644
--- a/src/core/ext/client_config/subchannel_call_holder.c
+++ b/src/core/ext/client_config/subchannel_call_holder.c
@@ -174,6 +174,7 @@
              GRPC_SUBCHANNEL_CALL_HOLDER_PICKING_SUBCHANNEL);
   holder->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING;
   if (holder->connected_subchannel == NULL) {
+    gpr_atm_no_barrier_store(&holder->subchannel_call, 1);
     fail_locked(exec_ctx, holder);
   } else if (1 == gpr_atm_acq_load(&holder->subchannel_call)) {
     /* already cancelled before subchannel became ready */
diff --git a/src/core/ext/lb_policy/grpclb/load_balancer_api.c b/src/core/ext/lb_policy/grpclb/load_balancer_api.c
index 459d6d9..59b8999 100644
--- a/src/core/ext/lb_policy/grpclb/load_balancer_api.c
+++ b/src/core/ext/lb_policy/grpclb/load_balancer_api.c
@@ -50,7 +50,7 @@
   decode_serverlist_arg *dec_arg = *arg;
   if (dec_arg->first_pass != 0) { /* first pass */
     grpc_grpclb_server server;
-    if (!pb_decode(stream, grpc_lb_v0_Server_fields, &server)) {
+    if (!pb_decode(stream, grpc_lb_v1_Server_fields, &server)) {
       return false;
     }
     dec_arg->num_servers++;
@@ -61,7 +61,7 @@
       dec_arg->servers =
           gpr_malloc(sizeof(grpc_grpclb_server *) * dec_arg->num_servers);
     }
-    if (!pb_decode(stream, grpc_lb_v0_Server_fields, server)) {
+    if (!pb_decode(stream, grpc_lb_v1_Server_fields, server)) {
       return false;
     }
     dec_arg->servers[dec_arg->i++] = server;
@@ -87,13 +87,13 @@
   pb_ostream_t outputstream;
   gpr_slice slice;
   memset(&sizestream, 0, sizeof(pb_ostream_t));
-  pb_encode(&sizestream, grpc_lb_v0_LoadBalanceRequest_fields, request);
+  pb_encode(&sizestream, grpc_lb_v1_LoadBalanceRequest_fields, request);
   encoded_length = sizestream.bytes_written;
 
   slice = gpr_slice_malloc(encoded_length);
   outputstream =
       pb_ostream_from_buffer(GPR_SLICE_START_PTR(slice), encoded_length);
-  GPR_ASSERT(pb_encode(&outputstream, grpc_lb_v0_LoadBalanceRequest_fields,
+  GPR_ASSERT(pb_encode(&outputstream, grpc_lb_v1_LoadBalanceRequest_fields,
                        request) != 0);
   return slice;
 }
@@ -109,7 +109,7 @@
                              GPR_SLICE_LENGTH(encoded_response));
   grpc_grpclb_response *res = gpr_malloc(sizeof(grpc_grpclb_response));
   memset(res, 0, sizeof(*res));
-  status = pb_decode(&stream, grpc_lb_v0_LoadBalanceResponse_fields, res);
+  status = pb_decode(&stream, grpc_lb_v1_LoadBalanceResponse_fields, res);
   if (!status) {
     grpc_grpclb_response_destroy(res);
     return NULL;
@@ -132,7 +132,7 @@
   res->server_list.servers.funcs.decode = decode_serverlist;
   res->server_list.servers.arg = &arg;
   arg.first_pass = 1;
-  status = pb_decode(&stream, grpc_lb_v0_LoadBalanceResponse_fields, res);
+  status = pb_decode(&stream, grpc_lb_v1_LoadBalanceResponse_fields, res);
   if (!status) {
     grpc_grpclb_response_destroy(res);
     return NULL;
@@ -140,7 +140,7 @@
 
   arg.first_pass = 0;
   status =
-      pb_decode(&stream_at_start, grpc_lb_v0_LoadBalanceResponse_fields, res);
+      pb_decode(&stream_at_start, grpc_lb_v1_LoadBalanceResponse_fields, res);
   if (!status) {
     grpc_grpclb_response_destroy(res);
     return NULL;
diff --git a/src/core/ext/lb_policy/grpclb/load_balancer_api.h b/src/core/ext/lb_policy/grpclb/load_balancer_api.h
index 968f7d2..71b5616 100644
--- a/src/core/ext/lb_policy/grpclb/load_balancer_api.h
+++ b/src/core/ext/lb_policy/grpclb/load_balancer_api.h
@@ -37,7 +37,7 @@
 #include <grpc/support/slice_buffer.h>
 
 #include "src/core/ext/client_config/lb_policy_factory.h"
-#include "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h"
+#include "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -45,10 +45,10 @@
 
 #define GRPC_GRPCLB_SERVICE_NAME_MAX_LENGTH 128
 
-typedef grpc_lb_v0_LoadBalanceRequest grpc_grpclb_request;
-typedef grpc_lb_v0_LoadBalanceResponse grpc_grpclb_response;
-typedef grpc_lb_v0_Server grpc_grpclb_server;
-typedef grpc_lb_v0_Duration grpc_grpclb_duration;
+typedef grpc_lb_v1_LoadBalanceRequest grpc_grpclb_request;
+typedef grpc_lb_v1_LoadBalanceResponse grpc_grpclb_response;
+typedef grpc_lb_v1_Server grpc_grpclb_server;
+typedef grpc_lb_v1_Duration grpc_grpclb_duration;
 typedef struct grpc_grpclb_serverlist {
   grpc_grpclb_server **servers;
   size_t num_servers;
diff --git a/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c b/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c
deleted file mode 100644
index 9719673..0000000
--- a/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c
+++ /dev/null
@@ -1,119 +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.
- *
- */
-/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.3.5-dev */
-
-#include "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h"
-
-#if PB_PROTO_HEADER_VERSION != 30
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-
-
-const pb_field_t grpc_lb_v0_Duration_fields[3] = {
-    PB_FIELD(  1, INT64   , OPTIONAL, STATIC  , FIRST, grpc_lb_v0_Duration, seconds, seconds, 0),
-    PB_FIELD(  2, INT32   , OPTIONAL, STATIC  , OTHER, grpc_lb_v0_Duration, nanos, seconds, 0),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_lb_v0_LoadBalanceRequest_fields[3] = {
-    PB_FIELD(  1, MESSAGE , OPTIONAL, STATIC  , FIRST, grpc_lb_v0_LoadBalanceRequest, initial_request, initial_request, &grpc_lb_v0_InitialLoadBalanceRequest_fields),
-    PB_FIELD(  2, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_lb_v0_LoadBalanceRequest, client_stats, initial_request, &grpc_lb_v0_ClientStats_fields),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_lb_v0_InitialLoadBalanceRequest_fields[2] = {
-    PB_FIELD(  1, STRING  , OPTIONAL, STATIC  , FIRST, grpc_lb_v0_InitialLoadBalanceRequest, name, name, 0),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_lb_v0_ClientStats_fields[4] = {
-    PB_FIELD(  1, INT64   , OPTIONAL, STATIC  , FIRST, grpc_lb_v0_ClientStats, total_requests, total_requests, 0),
-    PB_FIELD(  2, INT64   , OPTIONAL, STATIC  , OTHER, grpc_lb_v0_ClientStats, client_rpc_errors, total_requests, 0),
-    PB_FIELD(  3, INT64   , OPTIONAL, STATIC  , OTHER, grpc_lb_v0_ClientStats, dropped_requests, client_rpc_errors, 0),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_lb_v0_LoadBalanceResponse_fields[3] = {
-    PB_FIELD(  1, MESSAGE , OPTIONAL, STATIC  , FIRST, grpc_lb_v0_LoadBalanceResponse, initial_response, initial_response, &grpc_lb_v0_InitialLoadBalanceResponse_fields),
-    PB_FIELD(  2, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_lb_v0_LoadBalanceResponse, server_list, initial_response, &grpc_lb_v0_ServerList_fields),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_lb_v0_InitialLoadBalanceResponse_fields[4] = {
-    PB_FIELD(  1, STRING  , OPTIONAL, STATIC  , FIRST, grpc_lb_v0_InitialLoadBalanceResponse, client_config, client_config, 0),
-    PB_FIELD(  2, STRING  , OPTIONAL, STATIC  , OTHER, grpc_lb_v0_InitialLoadBalanceResponse, load_balancer_delegate, client_config, 0),
-    PB_FIELD(  3, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_lb_v0_InitialLoadBalanceResponse, client_stats_report_interval, load_balancer_delegate, &grpc_lb_v0_Duration_fields),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_lb_v0_ServerList_fields[3] = {
-    PB_FIELD(  1, MESSAGE , REPEATED, CALLBACK, FIRST, grpc_lb_v0_ServerList, servers, servers, &grpc_lb_v0_Server_fields),
-    PB_FIELD(  3, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_lb_v0_ServerList, expiration_interval, servers, &grpc_lb_v0_Duration_fields),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_lb_v0_Server_fields[5] = {
-    PB_FIELD(  1, STRING  , OPTIONAL, STATIC  , FIRST, grpc_lb_v0_Server, ip_address, ip_address, 0),
-    PB_FIELD(  2, INT32   , OPTIONAL, STATIC  , OTHER, grpc_lb_v0_Server, port, ip_address, 0),
-    PB_FIELD(  3, BYTES   , OPTIONAL, STATIC  , OTHER, grpc_lb_v0_Server, load_balance_token, port, 0),
-    PB_FIELD(  4, BOOL    , OPTIONAL, STATIC  , OTHER, grpc_lb_v0_Server, drop_request, load_balance_token, 0),
-    PB_LAST_FIELD
-};
-
-
-/* Check that field information fits in pb_field_t */
-#if !defined(PB_FIELD_32BIT)
-/* If you get an error here, it means that you need to define PB_FIELD_32BIT
- * compile-time option. You can do that in pb.h or on compiler command line.
- * 
- * The reason you need to do this is that some of your messages contain tag
- * numbers or field sizes that are larger than what can fit in 8 or 16 bit
- * field descriptors.
- */
-PB_STATIC_ASSERT((pb_membersize(grpc_lb_v0_LoadBalanceRequest, initial_request) < 65536 && pb_membersize(grpc_lb_v0_LoadBalanceRequest, client_stats) < 65536 && pb_membersize(grpc_lb_v0_LoadBalanceResponse, initial_response) < 65536 && pb_membersize(grpc_lb_v0_LoadBalanceResponse, server_list) < 65536 && pb_membersize(grpc_lb_v0_InitialLoadBalanceResponse, client_stats_report_interval) < 65536 && pb_membersize(grpc_lb_v0_ServerList, servers) < 65536 && pb_membersize(grpc_lb_v0_ServerList, expiration_interval) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_lb_v0_Duration_grpc_lb_v0_LoadBalanceRequest_grpc_lb_v0_InitialLoadBalanceRequest_grpc_lb_v0_ClientStats_grpc_lb_v0_LoadBalanceResponse_grpc_lb_v0_InitialLoadBalanceResponse_grpc_lb_v0_ServerList_grpc_lb_v0_Server)
-#endif
-
-#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
-/* If you get an error here, it means that you need to define PB_FIELD_16BIT
- * compile-time option. You can do that in pb.h or on compiler command line.
- * 
- * The reason you need to do this is that some of your messages contain tag
- * numbers or field sizes that are larger than what can fit in the default
- * 8 bit descriptors.
- */
-PB_STATIC_ASSERT((pb_membersize(grpc_lb_v0_LoadBalanceRequest, initial_request) < 256 && pb_membersize(grpc_lb_v0_LoadBalanceRequest, client_stats) < 256 && pb_membersize(grpc_lb_v0_LoadBalanceResponse, initial_response) < 256 && pb_membersize(grpc_lb_v0_LoadBalanceResponse, server_list) < 256 && pb_membersize(grpc_lb_v0_InitialLoadBalanceResponse, client_stats_report_interval) < 256 && pb_membersize(grpc_lb_v0_ServerList, servers) < 256 && pb_membersize(grpc_lb_v0_ServerList, expiration_interval) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_lb_v0_Duration_grpc_lb_v0_LoadBalanceRequest_grpc_lb_v0_InitialLoadBalanceRequest_grpc_lb_v0_ClientStats_grpc_lb_v0_LoadBalanceResponse_grpc_lb_v0_InitialLoadBalanceResponse_grpc_lb_v0_ServerList_grpc_lb_v0_Server)
-#endif
-
-
diff --git a/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h b/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h
deleted file mode 100644
index 3599f88..0000000
--- a/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h
+++ /dev/null
@@ -1,182 +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.
- *
- */
-/* Automatically generated nanopb header */
-/* Generated by nanopb-0.3.5-dev */
-
-#ifndef PB_LOAD_BALANCER_PB_H_INCLUDED
-#define PB_LOAD_BALANCER_PB_H_INCLUDED
-#include "third_party/nanopb/pb.h"
-#if PB_PROTO_HEADER_VERSION != 30
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Struct definitions */
-typedef struct _grpc_lb_v0_ClientStats {
-    bool has_total_requests;
-    int64_t total_requests;
-    bool has_client_rpc_errors;
-    int64_t client_rpc_errors;
-    bool has_dropped_requests;
-    int64_t dropped_requests;
-} grpc_lb_v0_ClientStats;
-
-typedef struct _grpc_lb_v0_Duration {
-    bool has_seconds;
-    int64_t seconds;
-    bool has_nanos;
-    int32_t nanos;
-} grpc_lb_v0_Duration;
-
-typedef struct _grpc_lb_v0_InitialLoadBalanceRequest {
-    bool has_name;
-    char name[128];
-} grpc_lb_v0_InitialLoadBalanceRequest;
-
-typedef PB_BYTES_ARRAY_T(64) grpc_lb_v0_Server_load_balance_token_t;
-typedef struct _grpc_lb_v0_Server {
-    bool has_ip_address;
-    char ip_address[46];
-    bool has_port;
-    int32_t port;
-    bool has_load_balance_token;
-    grpc_lb_v0_Server_load_balance_token_t load_balance_token;
-    bool has_drop_request;
-    bool drop_request;
-} grpc_lb_v0_Server;
-
-typedef struct _grpc_lb_v0_InitialLoadBalanceResponse {
-    bool has_client_config;
-    char client_config[64];
-    bool has_load_balancer_delegate;
-    char load_balancer_delegate[64];
-    bool has_client_stats_report_interval;
-    grpc_lb_v0_Duration client_stats_report_interval;
-} grpc_lb_v0_InitialLoadBalanceResponse;
-
-typedef struct _grpc_lb_v0_LoadBalanceRequest {
-    bool has_initial_request;
-    grpc_lb_v0_InitialLoadBalanceRequest initial_request;
-    bool has_client_stats;
-    grpc_lb_v0_ClientStats client_stats;
-} grpc_lb_v0_LoadBalanceRequest;
-
-typedef struct _grpc_lb_v0_ServerList {
-    pb_callback_t servers;
-    bool has_expiration_interval;
-    grpc_lb_v0_Duration expiration_interval;
-} grpc_lb_v0_ServerList;
-
-typedef struct _grpc_lb_v0_LoadBalanceResponse {
-    bool has_initial_response;
-    grpc_lb_v0_InitialLoadBalanceResponse initial_response;
-    bool has_server_list;
-    grpc_lb_v0_ServerList server_list;
-} grpc_lb_v0_LoadBalanceResponse;
-
-/* Default values for struct fields */
-
-/* Initializer values for message structs */
-#define grpc_lb_v0_Duration_init_default         {false, 0, false, 0}
-#define grpc_lb_v0_LoadBalanceRequest_init_default {false, grpc_lb_v0_InitialLoadBalanceRequest_init_default, false, grpc_lb_v0_ClientStats_init_default}
-#define grpc_lb_v0_InitialLoadBalanceRequest_init_default {false, ""}
-#define grpc_lb_v0_ClientStats_init_default      {false, 0, false, 0, false, 0}
-#define grpc_lb_v0_LoadBalanceResponse_init_default {false, grpc_lb_v0_InitialLoadBalanceResponse_init_default, false, grpc_lb_v0_ServerList_init_default}
-#define grpc_lb_v0_InitialLoadBalanceResponse_init_default {false, "", false, "", false, grpc_lb_v0_Duration_init_default}
-#define grpc_lb_v0_ServerList_init_default       {{{NULL}, NULL}, false, grpc_lb_v0_Duration_init_default}
-#define grpc_lb_v0_Server_init_default           {false, "", false, 0, false, {0, {0}}, false, 0}
-#define grpc_lb_v0_Duration_init_zero            {false, 0, false, 0}
-#define grpc_lb_v0_LoadBalanceRequest_init_zero  {false, grpc_lb_v0_InitialLoadBalanceRequest_init_zero, false, grpc_lb_v0_ClientStats_init_zero}
-#define grpc_lb_v0_InitialLoadBalanceRequest_init_zero {false, ""}
-#define grpc_lb_v0_ClientStats_init_zero         {false, 0, false, 0, false, 0}
-#define grpc_lb_v0_LoadBalanceResponse_init_zero {false, grpc_lb_v0_InitialLoadBalanceResponse_init_zero, false, grpc_lb_v0_ServerList_init_zero}
-#define grpc_lb_v0_InitialLoadBalanceResponse_init_zero {false, "", false, "", false, grpc_lb_v0_Duration_init_zero}
-#define grpc_lb_v0_ServerList_init_zero          {{{NULL}, NULL}, false, grpc_lb_v0_Duration_init_zero}
-#define grpc_lb_v0_Server_init_zero              {false, "", false, 0, false, {0, {0}}, false, 0}
-
-/* Field tags (for use in manual encoding/decoding) */
-#define grpc_lb_v0_ClientStats_total_requests_tag 1
-#define grpc_lb_v0_ClientStats_client_rpc_errors_tag 2
-#define grpc_lb_v0_ClientStats_dropped_requests_tag 3
-#define grpc_lb_v0_Duration_seconds_tag          1
-#define grpc_lb_v0_Duration_nanos_tag            2
-#define grpc_lb_v0_InitialLoadBalanceRequest_name_tag 1
-#define grpc_lb_v0_Server_ip_address_tag         1
-#define grpc_lb_v0_Server_port_tag               2
-#define grpc_lb_v0_Server_load_balance_token_tag 3
-#define grpc_lb_v0_Server_drop_request_tag       4
-#define grpc_lb_v0_InitialLoadBalanceResponse_client_config_tag 1
-#define grpc_lb_v0_InitialLoadBalanceResponse_load_balancer_delegate_tag 2
-#define grpc_lb_v0_InitialLoadBalanceResponse_client_stats_report_interval_tag 3
-#define grpc_lb_v0_LoadBalanceRequest_initial_request_tag 1
-#define grpc_lb_v0_LoadBalanceRequest_client_stats_tag 2
-#define grpc_lb_v0_ServerList_servers_tag        1
-#define grpc_lb_v0_ServerList_expiration_interval_tag 3
-#define grpc_lb_v0_LoadBalanceResponse_initial_response_tag 1
-#define grpc_lb_v0_LoadBalanceResponse_server_list_tag 2
-
-/* Struct field encoding specification for nanopb */
-extern const pb_field_t grpc_lb_v0_Duration_fields[3];
-extern const pb_field_t grpc_lb_v0_LoadBalanceRequest_fields[3];
-extern const pb_field_t grpc_lb_v0_InitialLoadBalanceRequest_fields[2];
-extern const pb_field_t grpc_lb_v0_ClientStats_fields[4];
-extern const pb_field_t grpc_lb_v0_LoadBalanceResponse_fields[3];
-extern const pb_field_t grpc_lb_v0_InitialLoadBalanceResponse_fields[4];
-extern const pb_field_t grpc_lb_v0_ServerList_fields[3];
-extern const pb_field_t grpc_lb_v0_Server_fields[5];
-
-/* Maximum encoded size of messages (where known) */
-#define grpc_lb_v0_Duration_size                 22
-#define grpc_lb_v0_LoadBalanceRequest_size       169
-#define grpc_lb_v0_InitialLoadBalanceRequest_size 131
-#define grpc_lb_v0_ClientStats_size              33
-#define grpc_lb_v0_LoadBalanceResponse_size      (165 + grpc_lb_v0_ServerList_size)
-#define grpc_lb_v0_InitialLoadBalanceResponse_size 156
-#define grpc_lb_v0_Server_size                   127
-
-/* Message IDs (where set with "msgid" option) */
-#ifdef PB_MSGID
-
-#define LOAD_BALANCER_MESSAGES \
-
-
-#endif
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif
diff --git a/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c b/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c
new file mode 100644
index 0000000..52e11c4
--- /dev/null
+++ b/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c
@@ -0,0 +1,118 @@
+/*
+ *
+ * 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.
+ *
+ */
+/* Automatically generated nanopb constant definitions */
+/* Generated by nanopb-0.3.5-dev */
+
+#include "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h"
+
+#if PB_PROTO_HEADER_VERSION != 30
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+
+
+const pb_field_t grpc_lb_v1_Duration_fields[3] = {
+    PB_FIELD(  1, INT64   , OPTIONAL, STATIC  , FIRST, grpc_lb_v1_Duration, seconds, seconds, 0),
+    PB_FIELD(  2, INT32   , OPTIONAL, STATIC  , OTHER, grpc_lb_v1_Duration, nanos, seconds, 0),
+    PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v1_LoadBalanceRequest_fields[3] = {
+    PB_FIELD(  1, MESSAGE , OPTIONAL, STATIC  , FIRST, grpc_lb_v1_LoadBalanceRequest, initial_request, initial_request, &grpc_lb_v1_InitialLoadBalanceRequest_fields),
+    PB_FIELD(  2, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_lb_v1_LoadBalanceRequest, client_stats, initial_request, &grpc_lb_v1_ClientStats_fields),
+    PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v1_InitialLoadBalanceRequest_fields[2] = {
+    PB_FIELD(  1, STRING  , OPTIONAL, STATIC  , FIRST, grpc_lb_v1_InitialLoadBalanceRequest, name, name, 0),
+    PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v1_ClientStats_fields[4] = {
+    PB_FIELD(  1, INT64   , OPTIONAL, STATIC  , FIRST, grpc_lb_v1_ClientStats, total_requests, total_requests, 0),
+    PB_FIELD(  2, INT64   , OPTIONAL, STATIC  , OTHER, grpc_lb_v1_ClientStats, client_rpc_errors, total_requests, 0),
+    PB_FIELD(  3, INT64   , OPTIONAL, STATIC  , OTHER, grpc_lb_v1_ClientStats, dropped_requests, client_rpc_errors, 0),
+    PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v1_LoadBalanceResponse_fields[3] = {
+    PB_FIELD(  1, MESSAGE , OPTIONAL, STATIC  , FIRST, grpc_lb_v1_LoadBalanceResponse, initial_response, initial_response, &grpc_lb_v1_InitialLoadBalanceResponse_fields),
+    PB_FIELD(  2, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_lb_v1_LoadBalanceResponse, server_list, initial_response, &grpc_lb_v1_ServerList_fields),
+    PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v1_InitialLoadBalanceResponse_fields[3] = {
+    PB_FIELD(  2, STRING  , OPTIONAL, STATIC  , FIRST, grpc_lb_v1_InitialLoadBalanceResponse, load_balancer_delegate, load_balancer_delegate, 0),
+    PB_FIELD(  3, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval, load_balancer_delegate, &grpc_lb_v1_Duration_fields),
+    PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v1_ServerList_fields[3] = {
+    PB_FIELD(  1, MESSAGE , REPEATED, CALLBACK, FIRST, grpc_lb_v1_ServerList, servers, servers, &grpc_lb_v1_Server_fields),
+    PB_FIELD(  3, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_lb_v1_ServerList, expiration_interval, servers, &grpc_lb_v1_Duration_fields),
+    PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v1_Server_fields[5] = {
+    PB_FIELD(  1, STRING  , OPTIONAL, STATIC  , FIRST, grpc_lb_v1_Server, ip_address, ip_address, 0),
+    PB_FIELD(  2, INT32   , OPTIONAL, STATIC  , OTHER, grpc_lb_v1_Server, port, ip_address, 0),
+    PB_FIELD(  3, STRING  , OPTIONAL, STATIC  , OTHER, grpc_lb_v1_Server, load_balance_token, port, 0),
+    PB_FIELD(  4, BOOL    , OPTIONAL, STATIC  , OTHER, grpc_lb_v1_Server, drop_request, load_balance_token, 0),
+    PB_LAST_FIELD
+};
+
+
+/* Check that field information fits in pb_field_t */
+#if !defined(PB_FIELD_32BIT)
+/* If you get an error here, it means that you need to define PB_FIELD_32BIT
+ * compile-time option. You can do that in pb.h or on compiler command line.
+ * 
+ * The reason you need to do this is that some of your messages contain tag
+ * numbers or field sizes that are larger than what can fit in 8 or 16 bit
+ * field descriptors.
+ */
+PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 65536 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 65536 && pb_membersize(grpc_lb_v1_ServerList, servers) < 65536 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
+#endif
+
+#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
+/* If you get an error here, it means that you need to define PB_FIELD_16BIT
+ * compile-time option. You can do that in pb.h or on compiler command line.
+ * 
+ * The reason you need to do this is that some of your messages contain tag
+ * numbers or field sizes that are larger than what can fit in the default
+ * 8 bit descriptors.
+ */
+PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 256 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 256 && pb_membersize(grpc_lb_v1_ServerList, servers) < 256 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
+#endif
+
+
diff --git a/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h b/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h
new file mode 100644
index 0000000..d5dc39a
--- /dev/null
+++ b/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h
@@ -0,0 +1,178 @@
+/*
+ *
+ * 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.
+ *
+ */
+/* Automatically generated nanopb header */
+/* Generated by nanopb-0.3.5-dev */
+
+#ifndef PB_LOAD_BALANCER_PB_H_INCLUDED
+#define PB_LOAD_BALANCER_PB_H_INCLUDED
+#include "third_party/nanopb/pb.h"
+#if PB_PROTO_HEADER_VERSION != 30
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Struct definitions */
+typedef struct _grpc_lb_v1_ClientStats {
+    bool has_total_requests;
+    int64_t total_requests;
+    bool has_client_rpc_errors;
+    int64_t client_rpc_errors;
+    bool has_dropped_requests;
+    int64_t dropped_requests;
+} grpc_lb_v1_ClientStats;
+
+typedef struct _grpc_lb_v1_Duration {
+    bool has_seconds;
+    int64_t seconds;
+    bool has_nanos;
+    int32_t nanos;
+} grpc_lb_v1_Duration;
+
+typedef struct _grpc_lb_v1_InitialLoadBalanceRequest {
+    bool has_name;
+    char name[128];
+} grpc_lb_v1_InitialLoadBalanceRequest;
+
+typedef struct _grpc_lb_v1_Server {
+    bool has_ip_address;
+    char ip_address[46];
+    bool has_port;
+    int32_t port;
+    bool has_load_balance_token;
+    char load_balance_token[64];
+    bool has_drop_request;
+    bool drop_request;
+} grpc_lb_v1_Server;
+
+typedef struct _grpc_lb_v1_InitialLoadBalanceResponse {
+    bool has_load_balancer_delegate;
+    char load_balancer_delegate[64];
+    bool has_client_stats_report_interval;
+    grpc_lb_v1_Duration client_stats_report_interval;
+} grpc_lb_v1_InitialLoadBalanceResponse;
+
+typedef struct _grpc_lb_v1_LoadBalanceRequest {
+    bool has_initial_request;
+    grpc_lb_v1_InitialLoadBalanceRequest initial_request;
+    bool has_client_stats;
+    grpc_lb_v1_ClientStats client_stats;
+} grpc_lb_v1_LoadBalanceRequest;
+
+typedef struct _grpc_lb_v1_ServerList {
+    pb_callback_t servers;
+    bool has_expiration_interval;
+    grpc_lb_v1_Duration expiration_interval;
+} grpc_lb_v1_ServerList;
+
+typedef struct _grpc_lb_v1_LoadBalanceResponse {
+    bool has_initial_response;
+    grpc_lb_v1_InitialLoadBalanceResponse initial_response;
+    bool has_server_list;
+    grpc_lb_v1_ServerList server_list;
+} grpc_lb_v1_LoadBalanceResponse;
+
+/* Default values for struct fields */
+
+/* Initializer values for message structs */
+#define grpc_lb_v1_Duration_init_default         {false, 0, false, 0}
+#define grpc_lb_v1_LoadBalanceRequest_init_default {false, grpc_lb_v1_InitialLoadBalanceRequest_init_default, false, grpc_lb_v1_ClientStats_init_default}
+#define grpc_lb_v1_InitialLoadBalanceRequest_init_default {false, ""}
+#define grpc_lb_v1_ClientStats_init_default      {false, 0, false, 0, false, 0}
+#define grpc_lb_v1_LoadBalanceResponse_init_default {false, grpc_lb_v1_InitialLoadBalanceResponse_init_default, false, grpc_lb_v1_ServerList_init_default}
+#define grpc_lb_v1_InitialLoadBalanceResponse_init_default {false, "", false, grpc_lb_v1_Duration_init_default}
+#define grpc_lb_v1_ServerList_init_default       {{{NULL}, NULL}, false, grpc_lb_v1_Duration_init_default}
+#define grpc_lb_v1_Server_init_default           {false, "", false, 0, false, "", false, 0}
+#define grpc_lb_v1_Duration_init_zero            {false, 0, false, 0}
+#define grpc_lb_v1_LoadBalanceRequest_init_zero  {false, grpc_lb_v1_InitialLoadBalanceRequest_init_zero, false, grpc_lb_v1_ClientStats_init_zero}
+#define grpc_lb_v1_InitialLoadBalanceRequest_init_zero {false, ""}
+#define grpc_lb_v1_ClientStats_init_zero         {false, 0, false, 0, false, 0}
+#define grpc_lb_v1_LoadBalanceResponse_init_zero {false, grpc_lb_v1_InitialLoadBalanceResponse_init_zero, false, grpc_lb_v1_ServerList_init_zero}
+#define grpc_lb_v1_InitialLoadBalanceResponse_init_zero {false, "", false, grpc_lb_v1_Duration_init_zero}
+#define grpc_lb_v1_ServerList_init_zero          {{{NULL}, NULL}, false, grpc_lb_v1_Duration_init_zero}
+#define grpc_lb_v1_Server_init_zero              {false, "", false, 0, false, "", false, 0}
+
+/* Field tags (for use in manual encoding/decoding) */
+#define grpc_lb_v1_ClientStats_total_requests_tag 1
+#define grpc_lb_v1_ClientStats_client_rpc_errors_tag 2
+#define grpc_lb_v1_ClientStats_dropped_requests_tag 3
+#define grpc_lb_v1_Duration_seconds_tag          1
+#define grpc_lb_v1_Duration_nanos_tag            2
+#define grpc_lb_v1_InitialLoadBalanceRequest_name_tag 1
+#define grpc_lb_v1_Server_ip_address_tag         1
+#define grpc_lb_v1_Server_port_tag               2
+#define grpc_lb_v1_Server_load_balance_token_tag 3
+#define grpc_lb_v1_Server_drop_request_tag       4
+#define grpc_lb_v1_InitialLoadBalanceResponse_load_balancer_delegate_tag 2
+#define grpc_lb_v1_InitialLoadBalanceResponse_client_stats_report_interval_tag 3
+#define grpc_lb_v1_LoadBalanceRequest_initial_request_tag 1
+#define grpc_lb_v1_LoadBalanceRequest_client_stats_tag 2
+#define grpc_lb_v1_ServerList_servers_tag        1
+#define grpc_lb_v1_ServerList_expiration_interval_tag 3
+#define grpc_lb_v1_LoadBalanceResponse_initial_response_tag 1
+#define grpc_lb_v1_LoadBalanceResponse_server_list_tag 2
+
+/* Struct field encoding specification for nanopb */
+extern const pb_field_t grpc_lb_v1_Duration_fields[3];
+extern const pb_field_t grpc_lb_v1_LoadBalanceRequest_fields[3];
+extern const pb_field_t grpc_lb_v1_InitialLoadBalanceRequest_fields[2];
+extern const pb_field_t grpc_lb_v1_ClientStats_fields[4];
+extern const pb_field_t grpc_lb_v1_LoadBalanceResponse_fields[3];
+extern const pb_field_t grpc_lb_v1_InitialLoadBalanceResponse_fields[3];
+extern const pb_field_t grpc_lb_v1_ServerList_fields[3];
+extern const pb_field_t grpc_lb_v1_Server_fields[5];
+
+/* Maximum encoded size of messages (where known) */
+#define grpc_lb_v1_Duration_size                 22
+#define grpc_lb_v1_LoadBalanceRequest_size       169
+#define grpc_lb_v1_InitialLoadBalanceRequest_size 131
+#define grpc_lb_v1_ClientStats_size              33
+#define grpc_lb_v1_LoadBalanceResponse_size      (98 + grpc_lb_v1_ServerList_size)
+#define grpc_lb_v1_InitialLoadBalanceResponse_size 90
+#define grpc_lb_v1_Server_size                   127
+
+/* Message IDs (where set with "msgid" option) */
+#ifdef PB_MSGID
+
+#define LOAD_BALANCER_MESSAGES \
+
+
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
diff --git a/src/core/ext/lb_policy/round_robin/round_robin.c b/src/core/ext/lb_policy/round_robin/round_robin.c
index 3f6051b..dcdc0c6 100644
--- a/src/core/ext/lb_policy/round_robin/round_robin.c
+++ b/src/core/ext/lb_policy/round_robin/round_robin.c
@@ -306,8 +306,10 @@
   size_t i;
   p->started_picking = 1;
 
-  gpr_log(GPR_DEBUG, "LB_POLICY: p=%p num_subchannels=%d", p,
-          p->num_subchannels);
+  if (grpc_lb_round_robin_trace) {
+    gpr_log(GPR_DEBUG, "LB_POLICY: p=%p num_subchannels=%d", p,
+            p->num_subchannels);
+  }
 
   for (i = 0; i < p->num_subchannels; i++) {
     subchannel_data *sd = p->subchannels[i];
diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c
index fcf2abf..b6886a2 100644
--- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c
+++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c
@@ -56,6 +56,8 @@
 #define DEFAULT_CONNECTION_WINDOW_TARGET (1024 * 1024)
 #define MAX_WINDOW 0x7fffffffu
 
+#define DEFAULT_MAX_HEADER_LIST_SIZE (16 * 1024)
+
 #define MAX_CLIENT_STREAM_ID 0x7fffffffu
 
 int grpc_http_trace = 0;
@@ -65,8 +67,8 @@
   ((grpc_chttp2_transport *)((char *)(tw)-offsetof(grpc_chttp2_transport, \
                                                    writing)))
 
-#define TRANSPORT_FROM_PARSING(tw)                                        \
-  ((grpc_chttp2_transport *)((char *)(tw)-offsetof(grpc_chttp2_transport, \
+#define TRANSPORT_FROM_PARSING(tp)                                        \
+  ((grpc_chttp2_transport *)((char *)(tp)-offsetof(grpc_chttp2_transport, \
                                                    parsing)))
 
 #define TRANSPORT_FROM_GLOBAL(tg)                                         \
@@ -311,6 +313,8 @@
     push_setting(t, GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 0);
   }
   push_setting(t, GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, DEFAULT_WINDOW);
+  push_setting(t, GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE,
+               DEFAULT_MAX_HEADER_LIST_SIZE);
 
   if (channel_args) {
     for (i = 0; i < channel_args->num_args; i++) {
@@ -378,6 +382,18 @@
               &t->writing.hpack_compressor,
               (uint32_t)channel_args->args[i].value.integer);
         }
+      } else if (0 == strcmp(channel_args->args[i].key,
+                             GRPC_ARG_MAX_METADATA_SIZE)) {
+        if (channel_args->args[i].type != GRPC_ARG_INTEGER) {
+          gpr_log(GPR_ERROR, "%s: must be an integer",
+                  GRPC_ARG_MAX_METADATA_SIZE);
+        } else if (channel_args->args[i].value.integer < 0) {
+          gpr_log(GPR_ERROR, "%s: must be non-negative",
+                  GRPC_ARG_MAX_METADATA_SIZE);
+        } else {
+          push_setting(t, GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE,
+                       (uint32_t)channel_args->args[i].value.integer);
+        }
       }
     }
   }
@@ -510,7 +526,7 @@
                           [GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE];
     *t->accepting_stream = s;
     grpc_chttp2_stream_map_add(&t->parsing_stream_map, s->global.id, s);
-    s->global.in_stream_map = 1;
+    s->global.in_stream_map = true;
   }
 
   grpc_chttp2_run_with_global_lock(exec_ctx, t, s, finish_init_stream_locked,
@@ -629,9 +645,10 @@
     check_read_ops(exec_ctx, &t->global);
 
     gpr_mu_lock(&t->executor.mu);
-    if (t->executor.pending_actions != NULL) {
-      hdr = t->executor.pending_actions;
-      t->executor.pending_actions = NULL;
+    if (t->executor.pending_actions_head != NULL) {
+      hdr = t->executor.pending_actions_head;
+      t->executor.pending_actions_head = t->executor.pending_actions_tail =
+          NULL;
       gpr_mu_unlock(&t->executor.mu);
       while (hdr != NULL) {
         hdr->action(exec_ctx, t, hdr->stream, hdr->arg);
@@ -686,8 +703,14 @@
         gpr_free(hdr);
         continue;
       }
-      hdr->next = t->executor.pending_actions;
-      t->executor.pending_actions = hdr;
+      hdr->next = NULL;
+      if (t->executor.pending_actions_head != NULL) {
+        t->executor.pending_actions_tail =
+            t->executor.pending_actions_tail->next = hdr;
+      } else {
+        t->executor.pending_actions_tail = t->executor.pending_actions_head =
+            hdr;
+      }
       REF_TRANSPORT(t, "pending_action");
       gpr_mu_unlock(&t->executor.mu);
     }
@@ -776,7 +799,8 @@
     grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
     uint32_t goaway_error, gpr_slice goaway_text) {
   char *msg = gpr_dump_slice(goaway_text, GPR_DUMP_HEX | GPR_DUMP_ASCII);
-  gpr_log(GPR_DEBUG, "got goaway [%d]: %s", goaway_error, msg);
+  GRPC_CHTTP2_IF_TRACING(
+      gpr_log(GPR_DEBUG, "got goaway [%d]: %s", goaway_error, msg));
   gpr_free(msg);
   gpr_slice_unref(goaway_text);
   transport_global->seen_goaway = 1;
@@ -826,7 +850,7 @@
     grpc_chttp2_stream_map_add(
         &TRANSPORT_FROM_GLOBAL(transport_global)->new_stream_map,
         stream_global->id, STREAM_FROM_GLOBAL(stream_global));
-    stream_global->in_stream_map = 1;
+    stream_global->in_stream_map = true;
     transport_global->concurrent_stream_count++;
     grpc_chttp2_become_writable(transport_global, stream_global);
   }
@@ -925,24 +949,38 @@
     stream_global->send_initial_metadata_finished =
         add_closure_barrier(on_complete);
     stream_global->send_initial_metadata = op->send_initial_metadata;
-    if (contains_non_ok_status(transport_global, op->send_initial_metadata)) {
-      stream_global->seen_error = 1;
-      grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
-    }
-    if (!stream_global->write_closed) {
-      if (transport_global->is_client) {
-        GPR_ASSERT(stream_global->id == 0);
-        grpc_chttp2_list_add_waiting_for_concurrency(transport_global,
-                                                     stream_global);
-        maybe_start_some_streams(exec_ctx, transport_global);
-      } else {
-        GPR_ASSERT(stream_global->id != 0);
-        grpc_chttp2_become_writable(transport_global, stream_global);
-      }
+    const size_t metadata_size =
+        grpc_metadata_batch_size(op->send_initial_metadata);
+    const size_t metadata_peer_limit =
+        transport_global->settings[GRPC_PEER_SETTINGS]
+                                  [GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE];
+    if (metadata_size > metadata_peer_limit) {
+      gpr_log(GPR_DEBUG,
+              "to-be-sent initial metadata size exceeds peer limit "
+              "(%lu vs. %lu)",
+              metadata_size, metadata_peer_limit);
+      cancel_from_api(exec_ctx, transport_global, stream_global,
+                      GRPC_STATUS_RESOURCE_EXHAUSTED);
     } else {
-      grpc_chttp2_complete_closure_step(
-          exec_ctx, stream_global,
-          &stream_global->send_initial_metadata_finished, 0);
+      if (contains_non_ok_status(transport_global, op->send_initial_metadata)) {
+        stream_global->seen_error = true;
+        grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
+      }
+      if (!stream_global->write_closed) {
+        if (transport_global->is_client) {
+          GPR_ASSERT(stream_global->id == 0);
+          grpc_chttp2_list_add_waiting_for_concurrency(transport_global,
+                                                       stream_global);
+          maybe_start_some_streams(exec_ctx, transport_global);
+        } else {
+          GPR_ASSERT(stream_global->id != 0);
+          grpc_chttp2_become_writable(transport_global, stream_global);
+        }
+      } else {
+        grpc_chttp2_complete_closure_step(
+            exec_ctx, stream_global,
+            &stream_global->send_initial_metadata_finished, 0);
+      }
     }
   }
 
@@ -966,19 +1004,34 @@
     stream_global->send_trailing_metadata_finished =
         add_closure_barrier(on_complete);
     stream_global->send_trailing_metadata = op->send_trailing_metadata;
-    if (contains_non_ok_status(transport_global, op->send_trailing_metadata)) {
-      stream_global->seen_error = 1;
-      grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
-    }
-    if (stream_global->write_closed) {
-      grpc_chttp2_complete_closure_step(
-          exec_ctx, stream_global,
-          &stream_global->send_trailing_metadata_finished,
-          grpc_metadata_batch_is_empty(op->send_trailing_metadata));
-    } else if (stream_global->id != 0) {
-      /* TODO(ctiller): check if there's flow control for any outstanding
-         bytes before going writable */
-      grpc_chttp2_become_writable(transport_global, stream_global);
+    const size_t metadata_size =
+        grpc_metadata_batch_size(op->send_trailing_metadata);
+    const size_t metadata_peer_limit =
+        transport_global->settings[GRPC_PEER_SETTINGS]
+                                  [GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE];
+    if (metadata_size > metadata_peer_limit) {
+      gpr_log(GPR_DEBUG,
+              "to-be-sent trailing metadata size exceeds peer limit "
+              "(%lu vs. %lu)",
+              metadata_size, metadata_peer_limit);
+      cancel_from_api(exec_ctx, transport_global, stream_global,
+                      GRPC_STATUS_RESOURCE_EXHAUSTED);
+    } else {
+      if (contains_non_ok_status(transport_global,
+                                 op->send_trailing_metadata)) {
+        stream_global->seen_error = true;
+        grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
+      }
+      if (stream_global->write_closed) {
+        grpc_chttp2_complete_closure_step(
+            exec_ctx, stream_global,
+            &stream_global->send_trailing_metadata_finished,
+            grpc_metadata_batch_is_empty(op->send_trailing_metadata));
+      } else if (stream_global->id != 0) {
+        /* TODO(ctiller): check if there's flow control for any outstanding
+           bytes before going writable */
+        grpc_chttp2_become_writable(transport_global, stream_global);
+      }
     }
   }
 
@@ -1141,6 +1194,16 @@
       grpc_chttp2_list_pop_check_read_ops(transport_global, &stream_global)) {
     if (stream_global->recv_initial_metadata_ready != NULL &&
         stream_global->published_initial_metadata) {
+      if (stream_global->seen_error) {
+        while ((bs = grpc_chttp2_incoming_frame_queue_pop(
+                    &stream_global->incoming_frames)) != NULL) {
+          incoming_byte_stream_destroy_locked(exec_ctx, NULL, NULL, bs);
+        }
+        if (stream_global->exceeded_metadata_size) {
+          cancel_from_api(exec_ctx, transport_global, stream_global,
+                          GRPC_STATUS_RESOURCE_EXHAUSTED);
+        }
+      }
       grpc_chttp2_incoming_metadata_buffer_publish(
           &stream_global->received_initial_metadata,
           stream_global->recv_initial_metadata);
@@ -1170,10 +1233,15 @@
     }
     if (stream_global->recv_trailing_metadata_finished != NULL &&
         stream_global->read_closed && stream_global->write_closed) {
-      while (stream_global->seen_error &&
-             (bs = grpc_chttp2_incoming_frame_queue_pop(
-                  &stream_global->incoming_frames)) != NULL) {
-        incoming_byte_stream_destroy_locked(exec_ctx, NULL, NULL, bs);
+      if (stream_global->seen_error) {
+        while ((bs = grpc_chttp2_incoming_frame_queue_pop(
+                    &stream_global->incoming_frames)) != NULL) {
+          incoming_byte_stream_destroy_locked(exec_ctx, NULL, NULL, bs);
+        }
+        if (stream_global->exceeded_metadata_size) {
+          cancel_from_api(exec_ctx, transport_global, stream_global,
+                          GRPC_STATUS_RESOURCE_EXHAUSTED);
+        }
       }
       if (stream_global->all_incoming_byte_streams_finished) {
         grpc_chttp2_incoming_metadata_buffer_publish(
@@ -1205,7 +1273,7 @@
     s = grpc_chttp2_stream_map_delete(&t->new_stream_map, id);
   }
   GPR_ASSERT(s);
-  s->global.in_stream_map = 0;
+  s->global.in_stream_map = false;
   if (t->parsing.incoming_stream == &s->parsing) {
     t->parsing.incoming_stream = NULL;
     grpc_chttp2_parsing_become_skip_parser(exec_ctx, &t->parsing);
@@ -1249,7 +1317,7 @@
                             NULL);
   }
   if (status != GRPC_STATUS_OK && !stream_global->seen_error) {
-    stream_global->seen_error = 1;
+    stream_global->seen_error = true;
     grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
   }
   grpc_chttp2_mark_stream_closed(exec_ctx, transport_global, stream_global, 1,
@@ -1261,7 +1329,7 @@
                              grpc_chttp2_stream_global *stream_global,
                              grpc_status_code status, gpr_slice *slice) {
   if (status != GRPC_STATUS_OK) {
-    stream_global->seen_error = 1;
+    stream_global->seen_error = true;
     grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
   }
   /* stream_global->recv_trailing_metadata_finished gives us a
@@ -1285,7 +1353,7 @@
               GRPC_MDSTR_GRPC_MESSAGE,
               grpc_mdstr_from_slice(gpr_slice_ref(*slice))));
     }
-    stream_global->published_trailing_metadata = 1;
+    stream_global->published_trailing_metadata = true;
     grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
   }
   if (slice) {
@@ -1315,13 +1383,13 @@
   }
   grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
   if (close_reads && !stream_global->read_closed) {
-    stream_global->read_closed = 1;
-    stream_global->published_initial_metadata = 1;
-    stream_global->published_trailing_metadata = 1;
+    stream_global->read_closed = true;
+    stream_global->published_initial_metadata = true;
+    stream_global->published_trailing_metadata = true;
     decrement_active_streams_locked(exec_ctx, transport_global, stream_global);
   }
   if (close_writes && !stream_global->write_closed) {
-    stream_global->write_closed = 1;
+    stream_global->write_closed = true;
     if (TRANSPORT_FROM_GLOBAL(transport_global)->executor.writing_active) {
       GRPC_CHTTP2_STREAM_REF(stream_global, "finish_writes");
       grpc_chttp2_list_add_closed_waiting_for_writing(transport_global,
diff --git a/src/core/ext/transport/chttp2/transport/frame_rst_stream.c b/src/core/ext/transport/chttp2/transport/frame_rst_stream.c
index 22467e9..7f01105 100644
--- a/src/core/ext/transport/chttp2/transport/frame_rst_stream.c
+++ b/src/core/ext/transport/chttp2/transport/frame_rst_stream.c
@@ -45,15 +45,20 @@
   stats->framing_bytes += frame_size;
   uint8_t *p = GPR_SLICE_START_PTR(slice);
 
+  // Frame size.
   *p++ = 0;
   *p++ = 0;
   *p++ = 4;
+  // Frame type.
   *p++ = GRPC_CHTTP2_FRAME_RST_STREAM;
+  // Flags.
   *p++ = 0;
+  // Stream ID.
   *p++ = (uint8_t)(id >> 24);
   *p++ = (uint8_t)(id >> 16);
   *p++ = (uint8_t)(id >> 8);
   *p++ = (uint8_t)(id);
+  // Error code.
   *p++ = (uint8_t)(code >> 24);
   *p++ = (uint8_t)(code >> 16);
   *p++ = (uint8_t)(code >> 8);
diff --git a/src/core/ext/transport/chttp2/transport/hpack_encoder.c b/src/core/ext/transport/chttp2/transport/hpack_encoder.c
index 555027c..ebeee37 100644
--- a/src/core/ext/transport/chttp2/transport/hpack_encoder.c
+++ b/src/core/ext/transport/chttp2/transport/hpack_encoder.c
@@ -63,6 +63,8 @@
 /* don't consider adding anything bigger than this to the hpack table */
 #define MAX_DECODER_SPACE_USAGE 512
 
+extern int grpc_http_trace;
+
 typedef struct {
   int is_first_frame;
   /* number of bytes in 'output' when we started the frame - used to calculate
@@ -532,7 +534,9 @@
     }
   }
   c->advertise_table_size_change = 1;
-  gpr_log(GPR_DEBUG, "set max table size from encoder to %d", max_table_size);
+  if (grpc_http_trace) {
+    gpr_log(GPR_DEBUG, "set max table size from encoder to %d", max_table_size);
+  }
 }
 
 void grpc_chttp2_encode_header(grpc_chttp2_hpack_compressor *c,
diff --git a/src/core/ext/transport/chttp2/transport/hpack_table.c b/src/core/ext/transport/chttp2/transport/hpack_table.c
index 4d64506..295f31c 100644
--- a/src/core/ext/transport/chttp2/transport/hpack_table.c
+++ b/src/core/ext/transport/chttp2/transport/hpack_table.c
@@ -253,7 +253,9 @@
   if (tbl->max_bytes == max_bytes) {
     return;
   }
-  gpr_log(GPR_DEBUG, "Update hpack parser max size to %d", max_bytes);
+  if (grpc_http_trace) {
+    gpr_log(GPR_DEBUG, "Update hpack parser max size to %d", max_bytes);
+  }
   while (tbl->mem_used > max_bytes) {
     evict1(tbl);
   }
diff --git a/src/core/ext/transport/chttp2/transport/incoming_metadata.c b/src/core/ext/transport/chttp2/transport/incoming_metadata.c
index db21744..3e463a7 100644
--- a/src/core/ext/transport/chttp2/transport/incoming_metadata.c
+++ b/src/core/ext/transport/chttp2/transport/incoming_metadata.c
@@ -65,6 +65,7 @@
         gpr_realloc(buffer->elems, sizeof(*buffer->elems) * buffer->capacity);
   }
   buffer->elems[buffer->count++].md = elem;
+  buffer->size += GRPC_MDELEM_LENGTH(elem);
 }
 
 void grpc_chttp2_incoming_metadata_buffer_set_deadline(
diff --git a/src/core/ext/transport/chttp2/transport/incoming_metadata.h b/src/core/ext/transport/chttp2/transport/incoming_metadata.h
index 17ecf8e..df4343b 100644
--- a/src/core/ext/transport/chttp2/transport/incoming_metadata.h
+++ b/src/core/ext/transport/chttp2/transport/incoming_metadata.h
@@ -42,6 +42,7 @@
   size_t capacity;
   gpr_timespec deadline;
   int published;
+  size_t size;  // total size of metadata
 } grpc_chttp2_incoming_metadata_buffer;
 
 /** assumes everything initially zeroed */
diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h
index 7a80846..5872fd8 100644
--- a/src/core/ext/transport/chttp2/transport/internal.h
+++ b/src/core/ext/transport/chttp2/transport/internal.h
@@ -236,9 +236,6 @@
   /** was a goaway frame received? */
   uint8_t goaway_received;
 
-  /** the last sent max_table_size setting */
-  uint32_t last_sent_max_table_size;
-
   /** initial window change */
   int64_t initial_window_update;
 
@@ -272,6 +269,9 @@
   uint32_t incoming_frame_size;
   uint32_t incoming_stream_id;
 
+  /* current max frame size */
+  uint32_t max_frame_size;
+
   /* active parser */
   void *parser_data;
   grpc_chttp2_stream_parsing *incoming_stream;
@@ -282,6 +282,8 @@
 
   /* received settings */
   uint32_t settings[GRPC_CHTTP2_NUM_SETTINGS];
+  /* last settings that were sent */
+  uint32_t last_sent_settings[GRPC_CHTTP2_NUM_SETTINGS];
 
   /* goaway data */
   grpc_status_code goaway_error;
@@ -321,7 +323,8 @@
     /** is a thread currently parsing */
     bool parsing_active;
 
-    grpc_chttp2_executor_action_header *pending_actions;
+    grpc_chttp2_executor_action_header *pending_actions_head;
+    grpc_chttp2_executor_action_header *pending_actions_tail;
   } executor;
 
   /** is the transport destroying itself? */
@@ -419,23 +422,21 @@
   /** number of streams that are currently being read */
   gpr_refcount active_streams;
 
-  /** when the application requests writes be closed, the write_closed is
-      'queued'; when the close is flow controlled into the send path, we are
-      'sending' it; when the write has been performed it is 'sent' */
+  /** Is this stream closed for writing. */
   bool write_closed;
-  /** is this stream reading half-closed (boolean) */
+  /** Is this stream reading half-closed. */
   bool read_closed;
-  /** are all published incoming byte streams closed */
+  /** Are all published incoming byte streams closed. */
   bool all_incoming_byte_streams_finished;
-  /** is this stream in the stream map? (boolean) */
+  /** Is this stream in the stream map. */
   bool in_stream_map;
-  /** has this stream seen an error? if 1, then pending incoming frames
-      can be thrown away */
+  /** Has this stream seen an error.
+      If true, then pending incoming frames can be thrown away. */
   bool seen_error;
+  bool exceeded_metadata_size;
 
   bool published_initial_metadata;
   bool published_trailing_metadata;
-  bool faked_trailing_metadata;
 
   grpc_chttp2_incoming_metadata_buffer received_initial_metadata;
   grpc_chttp2_incoming_metadata_buffer received_trailing_metadata;
@@ -478,7 +479,8 @@
   /** which metadata did we get (on this parse) */
   uint8_t got_metadata_on_parse[2];
   /** should we raise the seen_error flag in transport_global */
-  uint8_t seen_error;
+  bool seen_error;
+  bool exceeded_metadata_size;
   /** window available for peer to send to us */
   int64_t incoming_window;
   /** parsing state for data frames */
diff --git a/src/core/ext/transport/chttp2/transport/parsing.c b/src/core/ext/transport/chttp2/transport/parsing.c
index e827a43..4bd374b 100644
--- a/src/core/ext/transport/chttp2/transport/parsing.c
+++ b/src/core/ext/transport/chttp2/transport/parsing.c
@@ -45,6 +45,10 @@
 #include "src/core/lib/profiling/timers.h"
 #include "src/core/lib/transport/static_metadata.h"
 
+#define TRANSPORT_FROM_PARSING(tp)                                        \
+  ((grpc_chttp2_transport *)((char *)(tp)-offsetof(grpc_chttp2_transport, \
+                                                   parsing)))
+
 static int init_frame_parser(grpc_exec_ctx *exec_ctx,
                              grpc_chttp2_transport_parsing *transport_parsing);
 static int init_header_frame_parser(
@@ -79,9 +83,12 @@
   GPR_TIMER_BEGIN("grpc_chttp2_prepare_to_read", 0);
 
   transport_parsing->next_stream_id = transport_global->next_stream_id;
-  transport_parsing->last_sent_max_table_size =
-      transport_global->settings[GRPC_SENT_SETTINGS]
-                                [GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE];
+  memcpy(transport_parsing->last_sent_settings,
+         transport_global->settings[GRPC_SENT_SETTINGS],
+         sizeof(transport_parsing->last_sent_settings));
+  transport_parsing->max_frame_size =
+      transport_global->settings[GRPC_ACKED_SETTINGS]
+                                [GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE];
 
   /* update the parsing view of incoming window */
   while (grpc_chttp2_list_pop_unannounced_incoming_window_available(
@@ -167,7 +174,9 @@
   while (grpc_chttp2_list_pop_parsing_seen_stream(
       transport_global, transport_parsing, &stream_global, &stream_parsing)) {
     if (stream_parsing->seen_error) {
-      stream_global->seen_error = 1;
+      stream_global->seen_error = true;
+      stream_global->exceeded_metadata_size =
+          stream_parsing->exceeded_metadata_size;
       grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
     }
 
@@ -388,6 +397,12 @@
           return 1;
         }
         goto dts_fh_0; /* loop */
+      } else if (transport_parsing->incoming_frame_size >
+                 transport_parsing->max_frame_size) {
+        gpr_log(GPR_DEBUG, "Frame size %d is larger than max frame size %d",
+                transport_parsing->incoming_frame_size,
+                transport_parsing->max_frame_size);
+        return 0;
       }
       if (++cur == end) {
         return 1;
@@ -603,7 +618,7 @@
 
   if (md->key == GRPC_MDSTR_GRPC_STATUS && md != GRPC_MDELEM_GRPC_STATUS_0) {
     /* TODO(ctiller): check for a status like " 0" */
-    stream_parsing->seen_error = 1;
+    stream_parsing->seen_error = true;
   }
 
   if (md->key == GRPC_MDSTR_GRPC_TIMEOUT) {
@@ -624,8 +639,26 @@
         gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), *cached_timeout));
     GRPC_MDELEM_UNREF(md);
   } else {
-    grpc_chttp2_incoming_metadata_buffer_add(
-        &stream_parsing->metadata_buffer[0], md);
+    const size_t new_size =
+        stream_parsing->metadata_buffer[0].size + GRPC_MDELEM_LENGTH(md);
+    grpc_chttp2_transport_global *transport_global =
+        &TRANSPORT_FROM_PARSING(transport_parsing)->global;
+    const size_t metadata_size_limit =
+        transport_global->settings[GRPC_LOCAL_SETTINGS]
+                                  [GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE];
+    if (new_size > metadata_size_limit) {
+      if (!stream_parsing->exceeded_metadata_size) {
+        gpr_log(GPR_DEBUG,
+                "received initial metadata size exceeds limit (%lu vs. %lu)",
+                new_size, metadata_size_limit);
+        stream_parsing->seen_error = true;
+        stream_parsing->exceeded_metadata_size = true;
+      }
+      GRPC_MDELEM_UNREF(md);
+    } else {
+      grpc_chttp2_incoming_metadata_buffer_add(
+          &stream_parsing->metadata_buffer[0], md);
+    }
   }
 
   grpc_chttp2_list_add_parsing_seen_stream(transport_parsing, stream_parsing);
@@ -649,11 +682,29 @@
 
   if (md->key == GRPC_MDSTR_GRPC_STATUS && md != GRPC_MDELEM_GRPC_STATUS_0) {
     /* TODO(ctiller): check for a status like " 0" */
-    stream_parsing->seen_error = 1;
+    stream_parsing->seen_error = true;
   }
 
-  grpc_chttp2_incoming_metadata_buffer_add(&stream_parsing->metadata_buffer[1],
-                                           md);
+  const size_t new_size =
+      stream_parsing->metadata_buffer[1].size + GRPC_MDELEM_LENGTH(md);
+  grpc_chttp2_transport_global *transport_global =
+      &TRANSPORT_FROM_PARSING(transport_parsing)->global;
+  const size_t metadata_size_limit =
+      transport_global->settings[GRPC_LOCAL_SETTINGS]
+                                [GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE];
+  if (new_size > metadata_size_limit) {
+    if (!stream_parsing->exceeded_metadata_size) {
+      gpr_log(GPR_DEBUG,
+              "received trailing metadata size exceeds limit (%lu vs. %lu)",
+              new_size, metadata_size_limit);
+      stream_parsing->seen_error = true;
+      stream_parsing->exceeded_metadata_size = true;
+    }
+    GRPC_MDELEM_UNREF(md);
+  } else {
+    grpc_chttp2_incoming_metadata_buffer_add(
+        &stream_parsing->metadata_buffer[1], md);
+  }
 
   grpc_chttp2_list_add_parsing_seen_stream(transport_parsing, stream_parsing);
 
@@ -840,7 +891,11 @@
     transport_parsing->settings_ack_received = 1;
     grpc_chttp2_hptbl_set_max_bytes(
         &transport_parsing->hpack_parser.table,
-        transport_parsing->last_sent_max_table_size);
+        transport_parsing
+            ->last_sent_settings[GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE]);
+    transport_parsing->max_frame_size =
+        transport_parsing
+            ->last_sent_settings[GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE];
   }
   transport_parsing->parser = grpc_chttp2_settings_parser_parse;
   transport_parsing->parser_data = &transport_parsing->simple.settings;
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
new file mode 100644
index 0000000..df1acdd
--- /dev/null
+++ b/src/core/ext/transport/cronet/client/secure/cronet_channel_create.c
@@ -0,0 +1,69 @@
+/*
+ *
+ * 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 <grpc/impl/codegen/port_platform.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+
+#include "src/core/lib/surface/channel.h"
+#include "src/core/lib/transport/transport_impl.h"
+
+// Cronet transport object
+typedef struct cronet_transport {
+  grpc_transport base;  // must be first element in this structure
+  void *engine;
+  char *host;
+} cronet_transport;
+
+extern grpc_transport_vtable grpc_cronet_vtable;
+
+GRPCAPI grpc_channel *grpc_cronet_secure_channel_create(
+    void *engine, const char *target, const grpc_channel_args *args,
+    void *reserved) {
+  cronet_transport *ct = gpr_malloc(sizeof(cronet_transport));
+  ct->base.vtable = &grpc_cronet_vtable;
+  ct->engine = engine;
+  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,
+          ct->host);
+
+  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+  return grpc_channel_create(&exec_ctx, target, args,
+                             GRPC_CLIENT_DIRECT_CHANNEL, (grpc_transport *)ct);
+}
diff --git a/src/core/ext/transport/cronet/transport/cronet_api_dummy.c b/src/core/ext/transport/cronet/transport/cronet_api_dummy.c
new file mode 100644
index 0000000..687026c
--- /dev/null
+++ b/src/core/ext/transport/cronet/transport/cronet_api_dummy.c
@@ -0,0 +1,85 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+/* This file has empty implementation of all the functions exposed by the cronet
+library, so we can build it in all environments */
+
+#include <stdbool.h>
+
+#include <grpc/support/log.h>
+
+#include "third_party/objective_c/Cronet/cronet_c_for_grpc.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) {
+  GPR_ASSERT(0);
+  return NULL;
+}
+
+int cronet_bidirectional_stream_destroy(cronet_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) {
+  GPR_ASSERT(0);
+  return 0;
+}
+
+int cronet_bidirectional_stream_read(cronet_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) {
+  GPR_ASSERT(0);
+  return 0;
+}
+
+int cronet_bidirectional_stream_cancel(cronet_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
new file mode 100644
index 0000000..5bb0851
--- /dev/null
+++ b/src/core/ext/transport/cronet/transport/cronet_transport.c
@@ -0,0 +1,640 @@
+/*
+ *
+ * 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 <string.h>
+
+#include <grpc/impl/codegen/port_platform.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/host_port.h>
+#include <grpc/support/log.h>
+#include <grpc/support/slice_buffer.h>
+#include <grpc/support/string_util.h>
+#include <grpc/support/useful.h>
+
+#include "src/core/ext/transport/chttp2/transport/incoming_metadata.h"
+#include "src/core/lib/iomgr/exec_ctx.h"
+#include "src/core/lib/support/string.h"
+#include "src/core/lib/surface/channel.h"
+#include "src/core/lib/transport/metadata_batch.h"
+#include "src/core/lib/transport/transport_impl.h"
+#include "third_party/objective_c/Cronet/cronet_c_for_grpc.h"
+
+#define GRPC_HEADER_SIZE_IN_BYTES 5
+
+// Global flag that gets set with GRPC_TRACE env variable
+int grpc_cronet_trace = 1;
+
+// Cronet transport object
+struct grpc_cronet_transport {
+  grpc_transport base; /* must be first element in this structure */
+  cronet_engine *engine;
+  char *host;
+};
+
+typedef struct grpc_cronet_transport grpc_cronet_transport;
+
+enum send_state {
+  CRONET_SEND_IDLE = 0,
+  CRONET_REQ_STARTED,
+  CRONET_SEND_HEADER,
+  CRONET_WRITE,
+  CRONET_WRITE_COMPLETED,
+};
+
+enum recv_state {
+  CRONET_RECV_IDLE = 0,
+  CRONET_RECV_READ_LENGTH,
+  CRONET_RECV_READ_DATA,
+  CRONET_RECV_CLOSED,
+};
+
+static const char *recv_state_name[] = {
+    "CRONET_RECV_IDLE", "CRONET_RECV_READ_LENGTH", "CRONET_RECV_READ_DATA,",
+    "CRONET_RECV_CLOSED"};
+
+// Enum that identifies calling function.
+enum e_caller {
+  PERFORM_STREAM_OP,
+  ON_READ_COMPLETE,
+  ON_RESPONSE_HEADERS_RECEIVED,
+  ON_RESPONSE_TRAILERS_RECEIVED
+};
+
+enum callback_id {
+  CB_SEND_INITIAL_METADATA = 0,
+  CB_SEND_MESSAGE,
+  CB_SEND_TRAILING_METADATA,
+  CB_RECV_MESSAGE,
+  CB_RECV_INITIAL_METADATA,
+  CB_RECV_TRAILING_METADATA,
+  CB_NUM_CALLBACKS
+};
+
+struct stream_obj {
+  // we store received bytes here as they trickle in.
+  gpr_slice_buffer write_slice_buffer;
+  cronet_bidirectional_stream *cbs;
+  gpr_slice slice;
+  gpr_slice_buffer read_slice_buffer;
+  struct grpc_slice_buffer_stream sbs;
+  char *read_buffer;
+  int remaining_read_bytes;
+  int total_read_bytes;
+
+  char *write_buffer;
+  size_t write_buffer_size;
+
+  // Hold the URL
+  char *url;
+
+  bool response_headers_received;
+  bool read_requested;
+  bool response_trailers_received;
+  bool read_closed;
+
+  // Recv message stuff
+  grpc_byte_buffer **recv_message;
+  // Initial metadata stuff
+  grpc_metadata_batch *recv_initial_metadata;
+  // Trailing metadata stuff
+  grpc_metadata_batch *recv_trailing_metadata;
+  grpc_chttp2_incoming_metadata_buffer imb;
+
+  // This mutex protects receive state machine execution
+  gpr_mu recv_mu;
+  // we can queue up up to 2 callbacks for each OP
+  grpc_closure *callback_list[CB_NUM_CALLBACKS][2];
+
+  // storage for header
+  cronet_bidirectional_stream_header *headers;
+  uint32_t num_headers;
+  cronet_bidirectional_stream_header_array header_array;
+  // state tracking
+  enum recv_state cronet_recv_state;
+  enum send_state cronet_send_state;
+};
+
+typedef struct stream_obj stream_obj;
+
+static void next_send_step(stream_obj *s);
+static void next_recv_step(stream_obj *s, enum e_caller caller);
+
+static void set_pollset_do_nothing(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
+                                   grpc_stream *gs, grpc_pollset *pollset) {}
+
+static void enqueue_callbacks(grpc_closure *callback_list[]) {
+  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+  if (callback_list[0]) {
+    grpc_exec_ctx_enqueue(&exec_ctx, callback_list[0], true, NULL);
+    callback_list[0] = NULL;
+  }
+  if (callback_list[1]) {
+    grpc_exec_ctx_enqueue(&exec_ctx, callback_list[1], true, NULL);
+    callback_list[1] = NULL;
+  }
+  grpc_exec_ctx_finish(&exec_ctx);
+}
+
+static void on_canceled(cronet_bidirectional_stream *stream) {
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "on_canceled %p", stream);
+  }
+}
+
+static void on_failed(cronet_bidirectional_stream *stream, int net_error) {
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "on_failed %p, error = %d", stream, net_error);
+  }
+}
+
+static void on_succeeded(cronet_bidirectional_stream *stream) {
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "on_succeeded %p", stream);
+  }
+}
+
+static void on_response_trailers_received(
+    cronet_bidirectional_stream *stream,
+    const cronet_bidirectional_stream_header_array *trailers) {
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "R: on_response_trailers_received");
+  }
+  stream_obj *s = (stream_obj *)stream->annotation;
+
+  memset(&s->imb, 0, sizeof(s->imb));
+  grpc_chttp2_incoming_metadata_buffer_init(&s->imb);
+  unsigned int i = 0;
+  for (i = 0; i < trailers->count; i++) {
+    grpc_chttp2_incoming_metadata_buffer_add(
+        &s->imb, grpc_mdelem_from_metadata_strings(
+                     grpc_mdstr_from_string(trailers->headers[i].key),
+                     grpc_mdstr_from_string(trailers->headers[i].value)));
+  }
+  s->response_trailers_received = true;
+  next_recv_step(s, ON_RESPONSE_TRAILERS_RECEIVED);
+}
+
+static void on_write_completed(cronet_bidirectional_stream *stream,
+                               const char *data) {
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "W: on_write_completed");
+  }
+  stream_obj *s = (stream_obj *)stream->annotation;
+  enqueue_callbacks(s->callback_list[CB_SEND_MESSAGE]);
+  s->cronet_send_state = CRONET_WRITE_COMPLETED;
+  next_send_step(s);
+}
+
+static void process_recv_message(stream_obj *s, const uint8_t *recv_data) {
+  gpr_slice read_data_slice = gpr_slice_malloc((uint32_t)s->total_read_bytes);
+  uint8_t *dst_p = GPR_SLICE_START_PTR(read_data_slice);
+  memcpy(dst_p, recv_data, (size_t)s->total_read_bytes);
+  gpr_slice_buffer_add(&s->read_slice_buffer, read_data_slice);
+  grpc_slice_buffer_stream_init(&s->sbs, &s->read_slice_buffer, 0);
+  *s->recv_message = (grpc_byte_buffer *)&s->sbs;
+}
+
+static int parse_grpc_header(const uint8_t *data) {
+  const uint8_t *p = data + 1;
+  int length = 0;
+  length |= ((uint8_t)*p++) << 24;
+  length |= ((uint8_t)*p++) << 16;
+  length |= ((uint8_t)*p++) << 8;
+  length |= ((uint8_t)*p++);
+  return length;
+}
+
+static void on_read_completed(cronet_bidirectional_stream *stream, char *data,
+                              int count) {
+  stream_obj *s = (stream_obj *)stream->annotation;
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "R: on_read_completed count=%d, total=%d, remaining=%d",
+            count, s->total_read_bytes, s->remaining_read_bytes);
+  }
+  if (count > 0) {
+    GPR_ASSERT(s->recv_message);
+    s->remaining_read_bytes -= count;
+    next_recv_step(s, ON_READ_COMPLETE);
+  } else {
+    s->read_closed = true;
+    next_recv_step(s, ON_READ_COMPLETE);
+  }
+}
+
+static void on_response_headers_received(
+    cronet_bidirectional_stream *stream,
+    const cronet_bidirectional_stream_header_array *headers,
+    const char *negotiated_protocol) {
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "R: on_response_headers_received");
+  }
+  stream_obj *s = (stream_obj *)stream->annotation;
+  enqueue_callbacks(s->callback_list[CB_RECV_INITIAL_METADATA]);
+  s->response_headers_received = true;
+  next_recv_step(s, ON_RESPONSE_HEADERS_RECEIVED);
+}
+
+static void on_request_headers_sent(cronet_bidirectional_stream *stream) {
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "W: on_request_headers_sent");
+  }
+  stream_obj *s = (stream_obj *)stream->annotation;
+  enqueue_callbacks(s->callback_list[CB_SEND_INITIAL_METADATA]);
+  s->cronet_send_state = CRONET_SEND_HEADER;
+  next_send_step(s);
+}
+
+// Callback function pointers (invoked by cronet in response to events)
+static cronet_bidirectional_stream_callback callbacks = {
+    on_request_headers_sent,
+    on_response_headers_received,
+    on_read_completed,
+    on_write_completed,
+    on_response_trailers_received,
+    on_succeeded,
+    on_failed,
+    on_canceled};
+
+static void invoke_closing_callback(stream_obj *s) {
+  grpc_chttp2_incoming_metadata_buffer_publish(&s->imb,
+                                               s->recv_trailing_metadata);
+  if (s->callback_list[CB_RECV_TRAILING_METADATA]) {
+    enqueue_callbacks(s->callback_list[CB_RECV_TRAILING_METADATA]);
+  }
+}
+
+static void set_recv_state(stream_obj *s, enum recv_state state) {
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "next_state = %s", recv_state_name[state]);
+  }
+  s->cronet_recv_state = state;
+}
+
+// This is invoked from perform_stream_op, and all on_xxxx callbacks.
+static void next_recv_step(stream_obj *s, enum e_caller caller) {
+  gpr_mu_lock(&s->recv_mu);
+  switch (s->cronet_recv_state) {
+    case CRONET_RECV_IDLE:
+      if (grpc_cronet_trace) {
+        gpr_log(GPR_DEBUG, "cronet_recv_state = CRONET_RECV_IDLE");
+      }
+      if (caller == PERFORM_STREAM_OP ||
+          caller == ON_RESPONSE_HEADERS_RECEIVED) {
+        if (s->read_closed && s->response_trailers_received) {
+          invoke_closing_callback(s);
+          set_recv_state(s, CRONET_RECV_CLOSED);
+        } else if (s->response_headers_received == true &&
+                   s->read_requested == true) {
+          set_recv_state(s, CRONET_RECV_READ_LENGTH);
+          s->total_read_bytes = s->remaining_read_bytes =
+              GRPC_HEADER_SIZE_IN_BYTES;
+          GPR_ASSERT(s->read_buffer);
+          if (grpc_cronet_trace) {
+            gpr_log(GPR_DEBUG, "R: cronet_bidirectional_stream_read()");
+          }
+          cronet_bidirectional_stream_read(s->cbs, s->read_buffer,
+                                           s->remaining_read_bytes);
+        }
+      }
+      break;
+    case CRONET_RECV_READ_LENGTH:
+      if (grpc_cronet_trace) {
+        gpr_log(GPR_DEBUG, "cronet_recv_state = CRONET_RECV_READ_LENGTH");
+      }
+      if (caller == ON_READ_COMPLETE) {
+        if (s->read_closed) {
+          invoke_closing_callback(s);
+          enqueue_callbacks(s->callback_list[CB_RECV_MESSAGE]);
+          set_recv_state(s, CRONET_RECV_CLOSED);
+        } else {
+          GPR_ASSERT(s->remaining_read_bytes == 0);
+          set_recv_state(s, CRONET_RECV_READ_DATA);
+          s->total_read_bytes = s->remaining_read_bytes =
+              parse_grpc_header((const uint8_t *)s->read_buffer);
+          s->read_buffer =
+              gpr_realloc(s->read_buffer, (uint32_t)s->remaining_read_bytes);
+          GPR_ASSERT(s->read_buffer);
+          if (grpc_cronet_trace) {
+            gpr_log(GPR_DEBUG, "R: cronet_bidirectional_stream_read()");
+          }
+          cronet_bidirectional_stream_read(s->cbs, (char *)s->read_buffer,
+                                           s->remaining_read_bytes);
+        }
+      }
+      break;
+    case CRONET_RECV_READ_DATA:
+      if (grpc_cronet_trace) {
+        gpr_log(GPR_DEBUG, "cronet_recv_state = CRONET_RECV_READ_DATA");
+      }
+      if (caller == ON_READ_COMPLETE) {
+        if (s->remaining_read_bytes > 0) {
+          int offset = s->total_read_bytes - s->remaining_read_bytes;
+          GPR_ASSERT(s->read_buffer);
+          if (grpc_cronet_trace) {
+            gpr_log(GPR_DEBUG, "R: cronet_bidirectional_stream_read()");
+          }
+          cronet_bidirectional_stream_read(
+              s->cbs, (char *)s->read_buffer + offset, s->remaining_read_bytes);
+        } else {
+          gpr_slice_buffer_init(&s->read_slice_buffer);
+          uint8_t *p = (uint8_t *)s->read_buffer;
+          process_recv_message(s, p);
+          set_recv_state(s, CRONET_RECV_IDLE);
+          enqueue_callbacks(s->callback_list[CB_RECV_MESSAGE]);
+        }
+      }
+      break;
+    case CRONET_RECV_CLOSED:
+      break;
+    default:
+      GPR_ASSERT(0);  // Should not reach here
+      break;
+  }
+  gpr_mu_unlock(&s->recv_mu);
+}
+
+// This function takes the data from s->write_slice_buffer and assembles into
+// a contiguous byte stream with 5 byte gRPC header prepended.
+static void create_grpc_frame(stream_obj *s) {
+  gpr_slice slice = gpr_slice_buffer_take_first(&s->write_slice_buffer);
+  uint8_t *raw_data = GPR_SLICE_START_PTR(slice);
+  size_t length = GPR_SLICE_LENGTH(slice);
+  s->write_buffer_size = length + GRPC_HEADER_SIZE_IN_BYTES;
+  s->write_buffer = gpr_realloc(s->write_buffer, s->write_buffer_size);
+  uint8_t *p = (uint8_t *)s->write_buffer;
+  // Append 5 byte header
+  *p++ = 0;
+  *p++ = (uint8_t)(length >> 24);
+  *p++ = (uint8_t)(length >> 16);
+  *p++ = (uint8_t)(length >> 8);
+  *p++ = (uint8_t)(length);
+  // append actual data
+  memcpy(p, raw_data, length);
+}
+
+static void do_write(stream_obj *s) {
+  gpr_slice_buffer *sb = &s->write_slice_buffer;
+  GPR_ASSERT(sb->count <= 1);
+  if (sb->count > 0) {
+    create_grpc_frame(s);
+    if (grpc_cronet_trace) {
+      gpr_log(GPR_DEBUG, "W: cronet_bidirectional_stream_write");
+    }
+    cronet_bidirectional_stream_write(s->cbs, s->write_buffer,
+                                      (int)s->write_buffer_size, false);
+  }
+}
+
+//
+static void next_send_step(stream_obj *s) {
+  switch (s->cronet_send_state) {
+    case CRONET_SEND_IDLE:
+      GPR_ASSERT(
+          s->cbs);  // cronet_bidirectional_stream is not initialized yet.
+      s->cronet_send_state = CRONET_REQ_STARTED;
+      if (grpc_cronet_trace) {
+        gpr_log(GPR_DEBUG, "cronet_bidirectional_stream_start to %s", s->url);
+      }
+      cronet_bidirectional_stream_start(s->cbs, s->url, 0, "POST",
+                                        &s->header_array, false);
+      // we no longer need the memory that was allocated earlier.
+      gpr_free(s->header_array.headers);
+      break;
+    case CRONET_SEND_HEADER:
+      do_write(s);
+      s->cronet_send_state = CRONET_WRITE;
+      break;
+    case CRONET_WRITE_COMPLETED:
+      do_write(s);
+      break;
+    default:
+      GPR_ASSERT(0);
+      break;
+  }
+}
+
+static void convert_metadata_to_cronet_headers(grpc_linked_mdelem *head,
+                                               const char *host,
+                                               stream_obj *s) {
+  grpc_linked_mdelem *curr = head;
+  // Walk the linked list and get number of header fields
+  uint32_t num_headers_available = 0;
+  while (curr != NULL) {
+    curr = curr->next;
+    num_headers_available++;
+  }
+  // Allocate enough memory
+  s->headers = (cronet_bidirectional_stream_header *)gpr_malloc(
+      sizeof(cronet_bidirectional_stream_header) * num_headers_available);
+
+  // Walk the linked list again, this time copying the header fields.
+  // s->num_headers
+  // can be less than num_headers_available, as some headers are not used for
+  // cronet
+  curr = head;
+  s->num_headers = 0;
+  while (s->num_headers < num_headers_available) {
+    grpc_mdelem *mdelem = curr->md;
+    curr = curr->next;
+    const char *key = grpc_mdstr_as_c_string(mdelem->key);
+    const char *value = grpc_mdstr_as_c_string(mdelem->value);
+    if (strcmp(key, ":scheme") == 0 || strcmp(key, ":method") == 0 ||
+        strcmp(key, ":authority") == 0) {
+      // Cronet populates these fields on its own.
+      continue;
+    }
+    if (strcmp(key, ":path") == 0) {
+      // Create URL by appending :path value to the hostname
+      gpr_asprintf(&s->url, "https://%s%s", host, value);
+      if (grpc_cronet_trace) {
+        gpr_log(GPR_DEBUG, "extracted URL = %s", s->url);
+      }
+      continue;
+    }
+    s->headers[s->num_headers].key = key;
+    s->headers[s->num_headers].value = value;
+    s->num_headers++;
+    if (curr == NULL) {
+      break;
+    }
+  }
+}
+
+static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
+                              grpc_stream *gs, grpc_transport_stream_op *op) {
+  grpc_cronet_transport *ct = (grpc_cronet_transport *)gt;
+  GPR_ASSERT(ct->engine);
+  stream_obj *s = (stream_obj *)gs;
+  if (op->recv_trailing_metadata) {
+    if (grpc_cronet_trace) {
+      gpr_log(GPR_DEBUG,
+              "perform_stream_op - recv_trailing_metadata: on_complete=%p",
+              op->on_complete);
+    }
+    s->recv_trailing_metadata = op->recv_trailing_metadata;
+    GPR_ASSERT(!s->callback_list[CB_RECV_TRAILING_METADATA][0]);
+    s->callback_list[CB_RECV_TRAILING_METADATA][0] = op->on_complete;
+  }
+  if (op->recv_message) {
+    if (grpc_cronet_trace) {
+      gpr_log(GPR_DEBUG, "perform_stream_op - recv_message: on_complete=%p",
+              op->on_complete);
+    }
+    s->recv_message = (grpc_byte_buffer **)op->recv_message;
+    GPR_ASSERT(!s->callback_list[CB_RECV_MESSAGE][0]);
+    GPR_ASSERT(!s->callback_list[CB_RECV_MESSAGE][1]);
+    s->callback_list[CB_RECV_MESSAGE][0] = op->recv_message_ready;
+    s->callback_list[CB_RECV_MESSAGE][1] = op->on_complete;
+    s->read_requested = true;
+    next_recv_step(s, PERFORM_STREAM_OP);
+  }
+  if (op->recv_initial_metadata) {
+    if (grpc_cronet_trace) {
+      gpr_log(GPR_DEBUG, "perform_stream_op - recv_initial_metadata:=%p",
+              op->on_complete);
+    }
+    s->recv_initial_metadata = op->recv_initial_metadata;
+    GPR_ASSERT(!s->callback_list[CB_RECV_INITIAL_METADATA][0]);
+    GPR_ASSERT(!s->callback_list[CB_RECV_INITIAL_METADATA][1]);
+    s->callback_list[CB_RECV_INITIAL_METADATA][0] =
+        op->recv_initial_metadata_ready;
+    s->callback_list[CB_RECV_INITIAL_METADATA][1] = op->on_complete;
+  }
+  if (op->send_initial_metadata) {
+    if (grpc_cronet_trace) {
+      gpr_log(GPR_DEBUG,
+              "perform_stream_op - send_initial_metadata: on_complete=%p",
+              op->on_complete);
+    }
+    s->num_headers = 0;
+    convert_metadata_to_cronet_headers(op->send_initial_metadata->list.head,
+                                       ct->host, s);
+    s->header_array.count = s->num_headers;
+    s->header_array.capacity = s->num_headers;
+    s->header_array.headers = s->headers;
+    GPR_ASSERT(!s->callback_list[CB_SEND_INITIAL_METADATA][0]);
+    s->callback_list[CB_SEND_INITIAL_METADATA][0] = op->on_complete;
+  }
+  if (op->send_message) {
+    if (grpc_cronet_trace) {
+      gpr_log(GPR_DEBUG, "perform_stream_op - send_message: on_complete=%p",
+              op->on_complete);
+    }
+    grpc_byte_stream_next(exec_ctx, op->send_message, &s->slice,
+                          op->send_message->length, NULL);
+    // Check that compression flag is not ON. We don't support compression yet.
+    // TODO (makdharma): add compression support
+    GPR_ASSERT(op->send_message->flags == 0);
+    gpr_slice_buffer_add(&s->write_slice_buffer, s->slice);
+    if (s->cbs == NULL) {
+      if (grpc_cronet_trace) {
+        gpr_log(GPR_DEBUG, "cronet_bidirectional_stream_create");
+      }
+      s->cbs = cronet_bidirectional_stream_create(ct->engine, s, &callbacks);
+      GPR_ASSERT(s->cbs);
+      s->read_closed = false;
+      s->response_trailers_received = false;
+      s->response_headers_received = false;
+      s->cronet_send_state = CRONET_SEND_IDLE;
+      s->cronet_recv_state = CRONET_RECV_IDLE;
+    }
+    GPR_ASSERT(!s->callback_list[CB_SEND_MESSAGE][0]);
+    s->callback_list[CB_SEND_MESSAGE][0] = op->on_complete;
+    next_send_step(s);
+  }
+  if (op->send_trailing_metadata) {
+    if (grpc_cronet_trace) {
+      gpr_log(GPR_DEBUG,
+              "perform_stream_op - send_trailing_metadata: on_complete=%p",
+              op->on_complete);
+    }
+    GPR_ASSERT(!s->callback_list[CB_SEND_TRAILING_METADATA][0]);
+    s->callback_list[CB_SEND_TRAILING_METADATA][0] = op->on_complete;
+    if (s->cbs) {
+      // Send an "empty" write to the far end to signal that we're done.
+      // This will induce the server to send down trailers.
+      if (grpc_cronet_trace) {
+        gpr_log(GPR_DEBUG, "W: cronet_bidirectional_stream_write");
+      }
+      cronet_bidirectional_stream_write(s->cbs, "abc", 0, true);
+    } else {
+      // We never created a stream. This was probably an empty request.
+      invoke_closing_callback(s);
+    }
+  }
+}
+
+static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
+                       grpc_stream *gs, grpc_stream_refcount *refcount,
+                       const void *server_data) {
+  stream_obj *s = (stream_obj *)gs;
+  memset(s->callback_list, 0, sizeof(s->callback_list));
+  s->cbs = NULL;
+  gpr_mu_init(&s->recv_mu);
+  s->read_buffer = gpr_malloc(GRPC_HEADER_SIZE_IN_BYTES);
+  s->write_buffer = gpr_malloc(GRPC_HEADER_SIZE_IN_BYTES);
+  gpr_slice_buffer_init(&s->write_slice_buffer);
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "cronet_transport - init_stream");
+  }
+  return 0;
+}
+
+static void destroy_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
+                           grpc_stream *gs, void *and_free_memory) {
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "Destroy stream");
+  }
+  stream_obj *s = (stream_obj *)gs;
+  s->cbs = NULL;
+  gpr_free(s->read_buffer);
+  gpr_free(s->write_buffer);
+  gpr_free(s->url);
+  gpr_mu_destroy(&s->recv_mu);
+  if (and_free_memory) {
+    gpr_free(and_free_memory);
+  }
+}
+
+static void destroy_transport(grpc_exec_ctx *exec_ctx, grpc_transport *gt) {
+  grpc_cronet_transport *ct = (grpc_cronet_transport *)gt;
+  gpr_free(ct->host);
+  if (grpc_cronet_trace) {
+    gpr_log(GPR_DEBUG, "Destroy transport");
+  }
+}
+
+const grpc_transport_vtable grpc_cronet_vtable = {
+    sizeof(stream_obj),     "cronet_http",     init_stream,
+    set_pollset_do_nothing, perform_stream_op, NULL,
+    destroy_stream,         destroy_transport, NULL};
diff --git a/src/core/lib/channel/channel_args.c b/src/core/lib/channel/channel_args.c
index 28d2d78..893cf07 100644
--- a/src/core/lib/channel/channel_args.c
+++ b/src/core/lib/channel/channel_args.c
@@ -170,7 +170,7 @@
   if (a == NULL) return 0;
   for (i = 0; i < a->num_args; ++i) {
     if (a->args[i].type == GRPC_ARG_INTEGER &&
-        !strcmp(GRPC_COMPRESSION_ALGORITHM_ARG, a->args[i].key)) {
+        !strcmp(GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM, a->args[i].key)) {
       return (grpc_compression_algorithm)a->args[i].value.integer;
       break;
     }
@@ -182,7 +182,7 @@
     grpc_channel_args *a, grpc_compression_algorithm algorithm) {
   grpc_arg tmp;
   tmp.type = GRPC_ARG_INTEGER;
-  tmp.key = GRPC_COMPRESSION_ALGORITHM_ARG;
+  tmp.key = GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM;
   tmp.value.integer = algorithm;
   return grpc_channel_args_copy_and_add(a, &tmp, 1);
 }
@@ -196,7 +196,8 @@
     size_t i;
     for (i = 0; i < a->num_args; ++i) {
       if (a->args[i].type == GRPC_ARG_INTEGER &&
-          !strcmp(GRPC_COMPRESSION_ALGORITHM_STATE_ARG, a->args[i].key)) {
+          !strcmp(GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET,
+                  a->args[i].key)) {
         *states_arg = &a->args[i].value.integer;
         return 1; /* GPR_TRUE */
       }
@@ -222,7 +223,7 @@
     /* create a new arg */
     grpc_arg tmp;
     tmp.type = GRPC_ARG_INTEGER;
-    tmp.key = GRPC_COMPRESSION_ALGORITHM_STATE_ARG;
+    tmp.key = GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET;
     /* all enabled by default */
     tmp.value.integer = (1u << GRPC_COMPRESS_ALGORITHMS_COUNT) - 1;
     if (state != 0) {
diff --git a/src/core/lib/channel/channel_args.h b/src/core/lib/channel/channel_args.h
index 0a51780..23c7b7b 100644
--- a/src/core/lib/channel/channel_args.h
+++ b/src/core/lib/channel/channel_args.h
@@ -56,10 +56,6 @@
 /** Destroy arguments created by \a grpc_channel_args_copy */
 void grpc_channel_args_destroy(grpc_channel_args *a);
 
-/** Reads census_enabled settings from channel args. Returns 1 if census_enabled
- * is specified in channel args, otherwise returns 0. */
-int grpc_channel_args_is_census_enabled(const grpc_channel_args *a);
-
 /** Returns the compression algorithm set in \a a. */
 grpc_compression_algorithm grpc_channel_args_get_compression_algorithm(
     const grpc_channel_args *a);
diff --git a/src/core/lib/http/parser.c b/src/core/lib/http/parser.c
index a7efb5e..09b2ed4 100644
--- a/src/core/lib/http/parser.c
+++ b/src/core/lib/http/parser.c
@@ -161,8 +161,9 @@
     cur++;
   }
   if (cur == end) {
-    if (grpc_http1_trace)
+    if (grpc_http1_trace) {
       gpr_log(GPR_ERROR, "Didn't find ':' in header string");
+    }
     goto error;
   }
   GPR_ASSERT(cur >= beg);
diff --git a/src/core/lib/iomgr/ev_poll_and_epoll_posix.c b/src/core/lib/iomgr/ev_poll_and_epoll_posix.c
index 3c8127e..aeb6e28 100644
--- a/src/core/lib/iomgr/ev_poll_and_epoll_posix.c
+++ b/src/core/lib/iomgr/ev_poll_and_epoll_posix.c
@@ -790,7 +790,6 @@
 static void pollset_global_init(void) {
   gpr_tls_init(&g_current_thread_poller);
   gpr_tls_init(&g_current_thread_worker);
-  grpc_wakeup_fd_global_init();
   grpc_wakeup_fd_init(&grpc_global_wakeup_fd);
 }
 
@@ -798,7 +797,6 @@
   grpc_wakeup_fd_destroy(&grpc_global_wakeup_fd);
   gpr_tls_destroy(&g_current_thread_poller);
   gpr_tls_destroy(&g_current_thread_worker);
-  grpc_wakeup_fd_global_destroy();
 }
 
 static void kick_poller(void) { grpc_wakeup_fd_wakeup(&grpc_global_wakeup_fd); }
diff --git a/src/core/lib/iomgr/ev_poll_posix.c b/src/core/lib/iomgr/ev_poll_posix.c
new file mode 100644
index 0000000..d175232
--- /dev/null
+++ b/src/core/lib/iomgr/ev_poll_posix.c
@@ -0,0 +1,1212 @@
+/*
+ *
+ * Copyright 2015-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 <grpc/support/port_platform.h>
+
+#ifdef GPR_POSIX_SOCKET
+
+#include "src/core/lib/iomgr/ev_poll_posix.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <poll.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <unistd.h>
+
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
+#include <grpc/support/tls.h>
+#include <grpc/support/useful.h>
+
+#include "src/core/lib/iomgr/iomgr_internal.h"
+#include "src/core/lib/iomgr/wakeup_fd_posix.h"
+#include "src/core/lib/profiling/timers.h"
+#include "src/core/lib/support/block_annotate.h"
+
+/*******************************************************************************
+ * FD declarations
+ */
+
+typedef struct grpc_fd_watcher {
+  struct grpc_fd_watcher *next;
+  struct grpc_fd_watcher *prev;
+  grpc_pollset *pollset;
+  grpc_pollset_worker *worker;
+  grpc_fd *fd;
+} grpc_fd_watcher;
+
+struct grpc_fd {
+  int fd;
+  /* refst format:
+     bit0:   1=active/0=orphaned
+     bit1-n: refcount
+     meaning that mostly we ref by two to avoid altering the orphaned bit,
+     and just unref by 1 when we're ready to flag the object as orphaned */
+  gpr_atm refst;
+
+  gpr_mu mu;
+  int shutdown;
+  int closed;
+  int released;
+
+  /* The watcher list.
+
+     The following watcher related fields are protected by watcher_mu.
+
+     An fd_watcher is an ephemeral object created when an fd wants to
+     begin polling, and destroyed after the poll.
+
+     It denotes the fd's interest in whether to read poll or write poll
+     or both or neither on this fd.
+
+     If a watcher is asked to poll for reads or writes, the read_watcher
+     or write_watcher fields are set respectively. A watcher may be asked
+     to poll for both, in which case both fields will be set.
+
+     read_watcher and write_watcher may be NULL if no watcher has been
+     asked to poll for reads or writes.
+
+     If an fd_watcher is not asked to poll for reads or writes, it's added
+     to a linked list of inactive watchers, rooted at inactive_watcher_root.
+     If at a later time there becomes need of a poller to poll, one of
+     the inactive pollers may be kicked out of their poll loops to take
+     that responsibility. */
+  grpc_fd_watcher inactive_watcher_root;
+  grpc_fd_watcher *read_watcher;
+  grpc_fd_watcher *write_watcher;
+
+  grpc_closure *read_closure;
+  grpc_closure *write_closure;
+
+  grpc_closure *on_done_closure;
+
+  grpc_iomgr_object iomgr_object;
+};
+
+/* Begin polling on an fd.
+   Registers that the given pollset is interested in this fd - so that if read
+   or writability interest changes, the pollset can be kicked to pick up that
+   new interest.
+   Return value is:
+     (fd_needs_read? read_mask : 0) | (fd_needs_write? write_mask : 0)
+   i.e. a combination of read_mask and write_mask determined by the fd's current
+   interest in said events.
+   Polling strategies that do not need to alter their behavior depending on the
+   fd's current interest (such as epoll) do not need to call this function.
+   MUST NOT be called with a pollset lock taken */
+static uint32_t fd_begin_poll(grpc_fd *fd, grpc_pollset *pollset,
+                              grpc_pollset_worker *worker, uint32_t read_mask,
+                              uint32_t write_mask, grpc_fd_watcher *rec);
+/* Complete polling previously started with fd_begin_poll
+   MUST NOT be called with a pollset lock taken
+   if got_read or got_write are 1, also does the become_{readable,writable} as
+   appropriate. */
+static void fd_end_poll(grpc_exec_ctx *exec_ctx, grpc_fd_watcher *rec,
+                        int got_read, int got_write);
+
+/* Return 1 if this fd is orphaned, 0 otherwise */
+static bool fd_is_orphaned(grpc_fd *fd);
+
+/* Reference counting for fds */
+/*#define GRPC_FD_REF_COUNT_DEBUG*/
+#ifdef GRPC_FD_REF_COUNT_DEBUG
+static void fd_ref(grpc_fd *fd, const char *reason, const char *file, int line);
+static void fd_unref(grpc_fd *fd, const char *reason, const char *file,
+                     int line);
+#define GRPC_FD_REF(fd, reason) fd_ref(fd, reason, __FILE__, __LINE__)
+#define GRPC_FD_UNREF(fd, reason) fd_unref(fd, reason, __FILE__, __LINE__)
+#else
+static void fd_ref(grpc_fd *fd);
+static void fd_unref(grpc_fd *fd);
+#define GRPC_FD_REF(fd, reason) fd_ref(fd)
+#define GRPC_FD_UNREF(fd, reason) fd_unref(fd)
+#endif
+
+#define CLOSURE_NOT_READY ((grpc_closure *)0)
+#define CLOSURE_READY ((grpc_closure *)1)
+
+/*******************************************************************************
+ * pollset declarations
+ */
+
+typedef struct grpc_cached_wakeup_fd {
+  grpc_wakeup_fd fd;
+  struct grpc_cached_wakeup_fd *next;
+} grpc_cached_wakeup_fd;
+
+struct grpc_pollset_worker {
+  grpc_cached_wakeup_fd *wakeup_fd;
+  int reevaluate_polling_on_wakeup;
+  int kicked_specifically;
+  struct grpc_pollset_worker *next;
+  struct grpc_pollset_worker *prev;
+};
+
+struct grpc_pollset {
+  gpr_mu mu;
+  grpc_pollset_worker root_worker;
+  int in_flight_cbs;
+  int shutting_down;
+  int called_shutdown;
+  int kicked_without_pollers;
+  grpc_closure *shutdown_done;
+  grpc_closure_list idle_jobs;
+  /* all polled fds */
+  size_t fd_count;
+  size_t fd_capacity;
+  grpc_fd **fds;
+  /* fds that have been removed from the pollset explicitly */
+  size_t del_count;
+  size_t del_capacity;
+  grpc_fd **dels;
+  /* Local cache of eventfds for workers */
+  grpc_cached_wakeup_fd *local_wakeup_cache;
+};
+
+/* Add an fd to a pollset */
+static void pollset_add_fd(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
+                           struct grpc_fd *fd);
+
+static void pollset_set_add_fd(grpc_exec_ctx *exec_ctx,
+                               grpc_pollset_set *pollset_set, grpc_fd *fd);
+
+/* Convert a timespec to milliseconds:
+   - very small or negative poll times are clamped to zero to do a
+     non-blocking poll (which becomes spin polling)
+   - other small values are rounded up to one millisecond
+   - longer than a millisecond polls are rounded up to the next nearest
+     millisecond to avoid spinning
+   - infinite timeouts are converted to -1 */
+static int poll_deadline_to_millis_timeout(gpr_timespec deadline,
+                                           gpr_timespec now);
+
+/* Allow kick to wakeup the currently polling worker */
+#define GRPC_POLLSET_CAN_KICK_SELF 1
+/* Force the wakee to repoll when awoken */
+#define GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP 2
+/* As per pollset_kick, with an extended set of flags (defined above)
+   -- mostly for fd_posix's use. */
+static void pollset_kick_ext(grpc_pollset *p,
+                             grpc_pollset_worker *specific_worker,
+                             uint32_t flags);
+
+/* Return 1 if the pollset has active threads in pollset_work (pollset must
+ * be locked) */
+static int pollset_has_workers(grpc_pollset *pollset);
+
+/*******************************************************************************
+ * pollset_set definitions
+ */
+
+struct grpc_pollset_set {
+  gpr_mu mu;
+
+  size_t pollset_count;
+  size_t pollset_capacity;
+  grpc_pollset **pollsets;
+
+  size_t pollset_set_count;
+  size_t pollset_set_capacity;
+  struct grpc_pollset_set **pollset_sets;
+
+  size_t fd_count;
+  size_t fd_capacity;
+  grpc_fd **fds;
+};
+
+/*******************************************************************************
+ * fd_posix.c
+ */
+
+#ifdef GRPC_FD_REF_COUNT_DEBUG
+#define REF_BY(fd, n, reason) ref_by(fd, n, reason, __FILE__, __LINE__)
+#define UNREF_BY(fd, n, reason) unref_by(fd, n, reason, __FILE__, __LINE__)
+static void ref_by(grpc_fd *fd, int n, const char *reason, const char *file,
+                   int line) {
+  gpr_log(GPR_DEBUG, "FD %d %p   ref %d %d -> %d [%s; %s:%d]", fd->fd, fd, n,
+          gpr_atm_no_barrier_load(&fd->refst),
+          gpr_atm_no_barrier_load(&fd->refst) + n, reason, file, line);
+#else
+#define REF_BY(fd, n, reason) ref_by(fd, n)
+#define UNREF_BY(fd, n, reason) unref_by(fd, n)
+static void ref_by(grpc_fd *fd, int n) {
+#endif
+  GPR_ASSERT(gpr_atm_no_barrier_fetch_add(&fd->refst, n) > 0);
+}
+
+#ifdef GRPC_FD_REF_COUNT_DEBUG
+static void unref_by(grpc_fd *fd, int n, const char *reason, const char *file,
+                     int line) {
+  gpr_atm old;
+  gpr_log(GPR_DEBUG, "FD %d %p unref %d %d -> %d [%s; %s:%d]", fd->fd, fd, n,
+          gpr_atm_no_barrier_load(&fd->refst),
+          gpr_atm_no_barrier_load(&fd->refst) - n, reason, file, line);
+#else
+static void unref_by(grpc_fd *fd, int n) {
+  gpr_atm old;
+#endif
+  old = gpr_atm_full_fetch_add(&fd->refst, -n);
+  if (old == n) {
+    gpr_mu_destroy(&fd->mu);
+    grpc_iomgr_unregister_object(&fd->iomgr_object);
+    gpr_free(fd);
+  } else {
+    GPR_ASSERT(old > n);
+  }
+}
+
+static grpc_fd *fd_create(int fd, const char *name) {
+  grpc_fd *r = gpr_malloc(sizeof(*r));
+  gpr_mu_init(&r->mu);
+  gpr_atm_rel_store(&r->refst, 1);
+  r->shutdown = 0;
+  r->read_closure = CLOSURE_NOT_READY;
+  r->write_closure = CLOSURE_NOT_READY;
+  r->fd = fd;
+  r->inactive_watcher_root.next = r->inactive_watcher_root.prev =
+      &r->inactive_watcher_root;
+  r->read_watcher = r->write_watcher = NULL;
+  r->on_done_closure = NULL;
+  r->closed = 0;
+  r->released = 0;
+
+  char *name2;
+  gpr_asprintf(&name2, "%s fd=%d", name, fd);
+  grpc_iomgr_register_object(&r->iomgr_object, name2);
+  gpr_free(name2);
+#ifdef GRPC_FD_REF_COUNT_DEBUG
+  gpr_log(GPR_DEBUG, "FD %d %p create %s", fd, r, name);
+#endif
+  return r;
+}
+
+static bool fd_is_orphaned(grpc_fd *fd) {
+  return (gpr_atm_acq_load(&fd->refst) & 1) == 0;
+}
+
+static void pollset_kick_locked(grpc_fd_watcher *watcher) {
+  gpr_mu_lock(&watcher->pollset->mu);
+  GPR_ASSERT(watcher->worker);
+  pollset_kick_ext(watcher->pollset, watcher->worker,
+                   GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP);
+  gpr_mu_unlock(&watcher->pollset->mu);
+}
+
+static void maybe_wake_one_watcher_locked(grpc_fd *fd) {
+  if (fd->inactive_watcher_root.next != &fd->inactive_watcher_root) {
+    pollset_kick_locked(fd->inactive_watcher_root.next);
+  } else if (fd->read_watcher) {
+    pollset_kick_locked(fd->read_watcher);
+  } else if (fd->write_watcher) {
+    pollset_kick_locked(fd->write_watcher);
+  }
+}
+
+static void wake_all_watchers_locked(grpc_fd *fd) {
+  grpc_fd_watcher *watcher;
+  for (watcher = fd->inactive_watcher_root.next;
+       watcher != &fd->inactive_watcher_root; watcher = watcher->next) {
+    pollset_kick_locked(watcher);
+  }
+  if (fd->read_watcher) {
+    pollset_kick_locked(fd->read_watcher);
+  }
+  if (fd->write_watcher && fd->write_watcher != fd->read_watcher) {
+    pollset_kick_locked(fd->write_watcher);
+  }
+}
+
+static int has_watchers(grpc_fd *fd) {
+  return fd->read_watcher != NULL || fd->write_watcher != NULL ||
+         fd->inactive_watcher_root.next != &fd->inactive_watcher_root;
+}
+
+static void close_fd_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd) {
+  fd->closed = 1;
+  if (!fd->released) {
+    close(fd->fd);
+  }
+  grpc_exec_ctx_enqueue(exec_ctx, fd->on_done_closure, true, NULL);
+}
+
+static int fd_wrapped_fd(grpc_fd *fd) {
+  if (fd->released || fd->closed) {
+    return -1;
+  } else {
+    return fd->fd;
+  }
+}
+
+static void fd_orphan(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
+                      grpc_closure *on_done, int *release_fd,
+                      const char *reason) {
+  fd->on_done_closure = on_done;
+  fd->released = release_fd != NULL;
+  if (!fd->released) {
+    shutdown(fd->fd, SHUT_RDWR);
+  } else {
+    *release_fd = fd->fd;
+  }
+  gpr_mu_lock(&fd->mu);
+  REF_BY(fd, 1, reason); /* remove active status, but keep referenced */
+  if (!has_watchers(fd)) {
+    close_fd_locked(exec_ctx, fd);
+  } else {
+    wake_all_watchers_locked(fd);
+  }
+  gpr_mu_unlock(&fd->mu);
+  UNREF_BY(fd, 2, reason); /* drop the reference */
+}
+
+/* increment refcount by two to avoid changing the orphan bit */
+#ifdef GRPC_FD_REF_COUNT_DEBUG
+static void fd_ref(grpc_fd *fd, const char *reason, const char *file,
+                   int line) {
+  ref_by(fd, 2, reason, file, line);
+}
+
+static void fd_unref(grpc_fd *fd, const char *reason, const char *file,
+                     int line) {
+  unref_by(fd, 2, reason, file, line);
+}
+#else
+static void fd_ref(grpc_fd *fd) { ref_by(fd, 2); }
+
+static void fd_unref(grpc_fd *fd) { unref_by(fd, 2); }
+#endif
+
+static void notify_on_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
+                             grpc_closure **st, grpc_closure *closure) {
+  if (*st == CLOSURE_NOT_READY) {
+    /* not ready ==> switch to a waiting state by setting the closure */
+    *st = closure;
+  } else if (*st == CLOSURE_READY) {
+    /* already ready ==> queue the closure to run immediately */
+    *st = CLOSURE_NOT_READY;
+    grpc_exec_ctx_enqueue(exec_ctx, closure, !fd->shutdown, NULL);
+    maybe_wake_one_watcher_locked(fd);
+  } else {
+    /* upcallptr was set to a different closure.  This is an error! */
+    gpr_log(GPR_ERROR,
+            "User called a notify_on function with a previous callback still "
+            "pending");
+    abort();
+  }
+}
+
+/* returns 1 if state becomes not ready */
+static int set_ready_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
+                            grpc_closure **st) {
+  if (*st == CLOSURE_READY) {
+    /* duplicate ready ==> ignore */
+    return 0;
+  } else if (*st == CLOSURE_NOT_READY) {
+    /* not ready, and not waiting ==> flag ready */
+    *st = CLOSURE_READY;
+    return 0;
+  } else {
+    /* waiting ==> queue closure */
+    grpc_exec_ctx_enqueue(exec_ctx, *st, !fd->shutdown, NULL);
+    *st = CLOSURE_NOT_READY;
+    return 1;
+  }
+}
+
+static void fd_shutdown(grpc_exec_ctx *exec_ctx, grpc_fd *fd) {
+  gpr_mu_lock(&fd->mu);
+  GPR_ASSERT(!fd->shutdown);
+  fd->shutdown = 1;
+  set_ready_locked(exec_ctx, fd, &fd->read_closure);
+  set_ready_locked(exec_ctx, fd, &fd->write_closure);
+  gpr_mu_unlock(&fd->mu);
+}
+
+static void fd_notify_on_read(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
+                              grpc_closure *closure) {
+  gpr_mu_lock(&fd->mu);
+  notify_on_locked(exec_ctx, fd, &fd->read_closure, closure);
+  gpr_mu_unlock(&fd->mu);
+}
+
+static void fd_notify_on_write(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
+                               grpc_closure *closure) {
+  gpr_mu_lock(&fd->mu);
+  notify_on_locked(exec_ctx, fd, &fd->write_closure, closure);
+  gpr_mu_unlock(&fd->mu);
+}
+
+static uint32_t fd_begin_poll(grpc_fd *fd, grpc_pollset *pollset,
+                              grpc_pollset_worker *worker, uint32_t read_mask,
+                              uint32_t write_mask, grpc_fd_watcher *watcher) {
+  uint32_t mask = 0;
+  grpc_closure *cur;
+  int requested;
+  /* keep track of pollers that have requested our events, in case they change
+   */
+  GRPC_FD_REF(fd, "poll");
+
+  gpr_mu_lock(&fd->mu);
+
+  /* if we are shutdown, then don't add to the watcher set */
+  if (fd->shutdown) {
+    watcher->fd = NULL;
+    watcher->pollset = NULL;
+    watcher->worker = NULL;
+    gpr_mu_unlock(&fd->mu);
+    GRPC_FD_UNREF(fd, "poll");
+    return 0;
+  }
+
+  /* if there is nobody polling for read, but we need to, then start doing so */
+  cur = fd->read_closure;
+  requested = cur != CLOSURE_READY;
+  if (read_mask && fd->read_watcher == NULL && requested) {
+    fd->read_watcher = watcher;
+    mask |= read_mask;
+  }
+  /* if there is nobody polling for write, but we need to, then start doing so
+   */
+  cur = fd->write_closure;
+  requested = cur != CLOSURE_READY;
+  if (write_mask && fd->write_watcher == NULL && requested) {
+    fd->write_watcher = watcher;
+    mask |= write_mask;
+  }
+  /* if not polling, remember this watcher in case we need someone to later */
+  if (mask == 0 && worker != NULL) {
+    watcher->next = &fd->inactive_watcher_root;
+    watcher->prev = watcher->next->prev;
+    watcher->next->prev = watcher->prev->next = watcher;
+  }
+  watcher->pollset = pollset;
+  watcher->worker = worker;
+  watcher->fd = fd;
+  gpr_mu_unlock(&fd->mu);
+
+  return mask;
+}
+
+static void fd_end_poll(grpc_exec_ctx *exec_ctx, grpc_fd_watcher *watcher,
+                        int got_read, int got_write) {
+  int was_polling = 0;
+  int kick = 0;
+  grpc_fd *fd = watcher->fd;
+
+  if (fd == NULL) {
+    return;
+  }
+
+  gpr_mu_lock(&fd->mu);
+
+  if (watcher == fd->read_watcher) {
+    /* remove read watcher, kick if we still need a read */
+    was_polling = 1;
+    if (!got_read) {
+      kick = 1;
+    }
+    fd->read_watcher = NULL;
+  }
+  if (watcher == fd->write_watcher) {
+    /* remove write watcher, kick if we still need a write */
+    was_polling = 1;
+    if (!got_write) {
+      kick = 1;
+    }
+    fd->write_watcher = NULL;
+  }
+  if (!was_polling && watcher->worker != NULL) {
+    /* remove from inactive list */
+    watcher->next->prev = watcher->prev;
+    watcher->prev->next = watcher->next;
+  }
+  if (got_read) {
+    if (set_ready_locked(exec_ctx, fd, &fd->read_closure)) {
+      kick = 1;
+    }
+  }
+  if (got_write) {
+    if (set_ready_locked(exec_ctx, fd, &fd->write_closure)) {
+      kick = 1;
+    }
+  }
+  if (kick) {
+    maybe_wake_one_watcher_locked(fd);
+  }
+  if (fd_is_orphaned(fd) && !has_watchers(fd) && !fd->closed) {
+    close_fd_locked(exec_ctx, fd);
+  }
+  gpr_mu_unlock(&fd->mu);
+
+  GRPC_FD_UNREF(fd, "poll");
+}
+
+/*******************************************************************************
+ * pollset_posix.c
+ */
+
+GPR_TLS_DECL(g_current_thread_poller);
+GPR_TLS_DECL(g_current_thread_worker);
+
+static void remove_worker(grpc_pollset *p, grpc_pollset_worker *worker) {
+  worker->prev->next = worker->next;
+  worker->next->prev = worker->prev;
+}
+
+static int pollset_has_workers(grpc_pollset *p) {
+  return p->root_worker.next != &p->root_worker;
+}
+
+static grpc_pollset_worker *pop_front_worker(grpc_pollset *p) {
+  if (pollset_has_workers(p)) {
+    grpc_pollset_worker *w = p->root_worker.next;
+    remove_worker(p, w);
+    return w;
+  } else {
+    return NULL;
+  }
+}
+
+static void push_back_worker(grpc_pollset *p, grpc_pollset_worker *worker) {
+  worker->next = &p->root_worker;
+  worker->prev = worker->next->prev;
+  worker->prev->next = worker->next->prev = worker;
+}
+
+static void push_front_worker(grpc_pollset *p, grpc_pollset_worker *worker) {
+  worker->prev = &p->root_worker;
+  worker->next = worker->prev->next;
+  worker->prev->next = worker->next->prev = worker;
+}
+
+static void pollset_kick_ext(grpc_pollset *p,
+                             grpc_pollset_worker *specific_worker,
+                             uint32_t flags) {
+  GPR_TIMER_BEGIN("pollset_kick_ext", 0);
+
+  /* pollset->mu already held */
+  if (specific_worker != NULL) {
+    if (specific_worker == GRPC_POLLSET_KICK_BROADCAST) {
+      GPR_TIMER_BEGIN("pollset_kick_ext.broadcast", 0);
+      GPR_ASSERT((flags & GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP) == 0);
+      for (specific_worker = p->root_worker.next;
+           specific_worker != &p->root_worker;
+           specific_worker = specific_worker->next) {
+        grpc_wakeup_fd_wakeup(&specific_worker->wakeup_fd->fd);
+      }
+      p->kicked_without_pollers = 1;
+      GPR_TIMER_END("pollset_kick_ext.broadcast", 0);
+    } else if (gpr_tls_get(&g_current_thread_worker) !=
+               (intptr_t)specific_worker) {
+      GPR_TIMER_MARK("different_thread_worker", 0);
+      if ((flags & GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP) != 0) {
+        specific_worker->reevaluate_polling_on_wakeup = 1;
+      }
+      specific_worker->kicked_specifically = 1;
+      grpc_wakeup_fd_wakeup(&specific_worker->wakeup_fd->fd);
+    } else if ((flags & GRPC_POLLSET_CAN_KICK_SELF) != 0) {
+      GPR_TIMER_MARK("kick_yoself", 0);
+      if ((flags & GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP) != 0) {
+        specific_worker->reevaluate_polling_on_wakeup = 1;
+      }
+      specific_worker->kicked_specifically = 1;
+      grpc_wakeup_fd_wakeup(&specific_worker->wakeup_fd->fd);
+    }
+  } else if (gpr_tls_get(&g_current_thread_poller) != (intptr_t)p) {
+    GPR_ASSERT((flags & GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP) == 0);
+    GPR_TIMER_MARK("kick_anonymous", 0);
+    specific_worker = pop_front_worker(p);
+    if (specific_worker != NULL) {
+      if (gpr_tls_get(&g_current_thread_worker) == (intptr_t)specific_worker) {
+        GPR_TIMER_MARK("kick_anonymous_not_self", 0);
+        push_back_worker(p, specific_worker);
+        specific_worker = pop_front_worker(p);
+        if ((flags & GRPC_POLLSET_CAN_KICK_SELF) == 0 &&
+            gpr_tls_get(&g_current_thread_worker) ==
+                (intptr_t)specific_worker) {
+          push_back_worker(p, specific_worker);
+          specific_worker = NULL;
+        }
+      }
+      if (specific_worker != NULL) {
+        GPR_TIMER_MARK("finally_kick", 0);
+        push_back_worker(p, specific_worker);
+        grpc_wakeup_fd_wakeup(&specific_worker->wakeup_fd->fd);
+      }
+    } else {
+      GPR_TIMER_MARK("kicked_no_pollers", 0);
+      p->kicked_without_pollers = 1;
+    }
+  }
+
+  GPR_TIMER_END("pollset_kick_ext", 0);
+}
+
+static void pollset_kick(grpc_pollset *p,
+                         grpc_pollset_worker *specific_worker) {
+  pollset_kick_ext(p, specific_worker, 0);
+}
+
+/* global state management */
+
+static void pollset_global_init(void) {
+  gpr_tls_init(&g_current_thread_poller);
+  gpr_tls_init(&g_current_thread_worker);
+  grpc_wakeup_fd_init(&grpc_global_wakeup_fd);
+}
+
+static void pollset_global_shutdown(void) {
+  grpc_wakeup_fd_destroy(&grpc_global_wakeup_fd);
+  gpr_tls_destroy(&g_current_thread_poller);
+  gpr_tls_destroy(&g_current_thread_worker);
+}
+
+static void kick_poller(void) { grpc_wakeup_fd_wakeup(&grpc_global_wakeup_fd); }
+
+/* main interface */
+
+static void pollset_init(grpc_pollset *pollset, gpr_mu **mu) {
+  gpr_mu_init(&pollset->mu);
+  *mu = &pollset->mu;
+  pollset->root_worker.next = pollset->root_worker.prev = &pollset->root_worker;
+  pollset->in_flight_cbs = 0;
+  pollset->shutting_down = 0;
+  pollset->called_shutdown = 0;
+  pollset->kicked_without_pollers = 0;
+  pollset->idle_jobs.head = pollset->idle_jobs.tail = NULL;
+  pollset->local_wakeup_cache = NULL;
+  pollset->kicked_without_pollers = 0;
+  pollset->fd_count = 0;
+  pollset->fd_capacity = 0;
+  pollset->del_count = 0;
+  pollset->del_capacity = 0;
+  pollset->fds = NULL;
+  pollset->dels = NULL;
+}
+
+static void pollset_destroy(grpc_pollset *pollset) {
+  GPR_ASSERT(pollset->in_flight_cbs == 0);
+  GPR_ASSERT(!pollset_has_workers(pollset));
+  GPR_ASSERT(pollset->idle_jobs.head == pollset->idle_jobs.tail);
+  while (pollset->local_wakeup_cache) {
+    grpc_cached_wakeup_fd *next = pollset->local_wakeup_cache->next;
+    grpc_wakeup_fd_destroy(&pollset->local_wakeup_cache->fd);
+    gpr_free(pollset->local_wakeup_cache);
+    pollset->local_wakeup_cache = next;
+  }
+  gpr_free(pollset->fds);
+  gpr_free(pollset->dels);
+  gpr_mu_destroy(&pollset->mu);
+}
+
+static void pollset_reset(grpc_pollset *pollset) {
+  GPR_ASSERT(pollset->shutting_down);
+  GPR_ASSERT(pollset->in_flight_cbs == 0);
+  GPR_ASSERT(!pollset_has_workers(pollset));
+  GPR_ASSERT(pollset->idle_jobs.head == pollset->idle_jobs.tail);
+  GPR_ASSERT(pollset->fd_count == 0);
+  GPR_ASSERT(pollset->del_count == 0);
+  pollset->shutting_down = 0;
+  pollset->called_shutdown = 0;
+  pollset->kicked_without_pollers = 0;
+}
+
+static void pollset_add_fd(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
+                           grpc_fd *fd) {
+  gpr_mu_lock(&pollset->mu);
+  size_t i;
+  /* TODO(ctiller): this is O(num_fds^2); maybe switch to a hash set here */
+  for (i = 0; i < pollset->fd_count; i++) {
+    if (pollset->fds[i] == fd) goto exit;
+  }
+  if (pollset->fd_count == pollset->fd_capacity) {
+    pollset->fd_capacity =
+        GPR_MAX(pollset->fd_capacity + 8, pollset->fd_count * 3 / 2);
+    pollset->fds =
+        gpr_realloc(pollset->fds, sizeof(grpc_fd *) * pollset->fd_capacity);
+  }
+  pollset->fds[pollset->fd_count++] = fd;
+  GRPC_FD_REF(fd, "multipoller");
+  pollset_kick(pollset, NULL);
+exit:
+  gpr_mu_unlock(&pollset->mu);
+}
+
+static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset) {
+  GPR_ASSERT(grpc_closure_list_empty(pollset->idle_jobs));
+  size_t i;
+  for (i = 0; i < pollset->fd_count; i++) {
+    GRPC_FD_UNREF(pollset->fds[i], "multipoller");
+  }
+  for (i = 0; i < pollset->del_count; i++) {
+    GRPC_FD_UNREF(pollset->dels[i], "multipoller_del");
+  }
+  pollset->fd_count = 0;
+  pollset->del_count = 0;
+  grpc_exec_ctx_enqueue(exec_ctx, pollset->shutdown_done, true, NULL);
+}
+
+static void pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
+                         grpc_pollset_worker **worker_hdl, gpr_timespec now,
+                         gpr_timespec deadline) {
+  grpc_pollset_worker worker;
+  *worker_hdl = &worker;
+
+  /* pollset->mu already held */
+  int added_worker = 0;
+  int locked = 1;
+  int queued_work = 0;
+  int keep_polling = 0;
+  GPR_TIMER_BEGIN("pollset_work", 0);
+  /* this must happen before we (potentially) drop pollset->mu */
+  worker.next = worker.prev = NULL;
+  worker.reevaluate_polling_on_wakeup = 0;
+  if (pollset->local_wakeup_cache != NULL) {
+    worker.wakeup_fd = pollset->local_wakeup_cache;
+    pollset->local_wakeup_cache = worker.wakeup_fd->next;
+  } else {
+    worker.wakeup_fd = gpr_malloc(sizeof(*worker.wakeup_fd));
+    grpc_wakeup_fd_init(&worker.wakeup_fd->fd);
+  }
+  worker.kicked_specifically = 0;
+  /* If there's work waiting for the pollset to be idle, and the
+     pollset is idle, then do that work */
+  if (!pollset_has_workers(pollset) &&
+      !grpc_closure_list_empty(pollset->idle_jobs)) {
+    GPR_TIMER_MARK("pollset_work.idle_jobs", 0);
+    grpc_exec_ctx_enqueue_list(exec_ctx, &pollset->idle_jobs, NULL);
+    goto done;
+  }
+  /* If we're shutting down then we don't execute any extended work */
+  if (pollset->shutting_down) {
+    GPR_TIMER_MARK("pollset_work.shutting_down", 0);
+    goto done;
+  }
+  /* Give do_promote priority so we don't starve it out */
+  if (pollset->in_flight_cbs) {
+    GPR_TIMER_MARK("pollset_work.in_flight_cbs", 0);
+    gpr_mu_unlock(&pollset->mu);
+    locked = 0;
+    goto done;
+  }
+  /* Start polling, and keep doing so while we're being asked to
+     re-evaluate our pollers (this allows poll() based pollers to
+     ensure they don't miss wakeups) */
+  keep_polling = 1;
+  while (keep_polling) {
+    keep_polling = 0;
+    if (!pollset->kicked_without_pollers) {
+      if (!added_worker) {
+        push_front_worker(pollset, &worker);
+        added_worker = 1;
+        gpr_tls_set(&g_current_thread_worker, (intptr_t)&worker);
+      }
+      gpr_tls_set(&g_current_thread_poller, (intptr_t)pollset);
+      GPR_TIMER_BEGIN("maybe_work_and_unlock", 0);
+#define POLLOUT_CHECK (POLLOUT | POLLHUP | POLLERR)
+#define POLLIN_CHECK (POLLIN | POLLHUP | POLLERR)
+
+      int timeout;
+      int r;
+      size_t i, j, fd_count;
+      nfds_t pfd_count;
+      /* TODO(ctiller): inline some elements to avoid an allocation */
+      grpc_fd_watcher *watchers;
+      struct pollfd *pfds;
+
+      timeout = poll_deadline_to_millis_timeout(deadline, now);
+      /* TODO(ctiller): perform just one malloc here if we exceed the inline
+       * case */
+      pfds = gpr_malloc(sizeof(*pfds) * (pollset->fd_count + 2));
+      watchers = gpr_malloc(sizeof(*watchers) * (pollset->fd_count + 2));
+      fd_count = 0;
+      pfd_count = 2;
+      pfds[0].fd = GRPC_WAKEUP_FD_GET_READ_FD(&grpc_global_wakeup_fd);
+      pfds[0].events = POLLIN;
+      pfds[0].revents = 0;
+      pfds[1].fd = GRPC_WAKEUP_FD_GET_READ_FD(&worker.wakeup_fd->fd);
+      pfds[1].events = POLLIN;
+      pfds[1].revents = 0;
+      for (i = 0; i < pollset->fd_count; i++) {
+        int remove = fd_is_orphaned(pollset->fds[i]);
+        for (j = 0; !remove && j < pollset->del_count; j++) {
+          if (pollset->fds[i] == pollset->dels[j]) remove = 1;
+        }
+        if (remove) {
+          GRPC_FD_UNREF(pollset->fds[i], "multipoller");
+        } else {
+          pollset->fds[fd_count++] = pollset->fds[i];
+          watchers[pfd_count].fd = pollset->fds[i];
+          GRPC_FD_REF(watchers[pfd_count].fd, "multipoller_start");
+          pfds[pfd_count].fd = pollset->fds[i]->fd;
+          pfds[pfd_count].revents = 0;
+          pfd_count++;
+        }
+      }
+      for (j = 0; j < pollset->del_count; j++) {
+        GRPC_FD_UNREF(pollset->dels[j], "multipoller_del");
+      }
+      pollset->del_count = 0;
+      pollset->fd_count = fd_count;
+      gpr_mu_unlock(&pollset->mu);
+
+      for (i = 2; i < pfd_count; i++) {
+        grpc_fd *fd = watchers[i].fd;
+        pfds[i].events = (short)fd_begin_poll(fd, pollset, &worker, POLLIN,
+                                              POLLOUT, &watchers[i]);
+        GRPC_FD_UNREF(fd, "multipoller_start");
+      }
+
+      /* TODO(vpai): Consider first doing a 0 timeout poll here to avoid
+         even going into the blocking annotation if possible */
+      GRPC_SCHEDULING_START_BLOCKING_REGION;
+      r = grpc_poll_function(pfds, pfd_count, timeout);
+      GRPC_SCHEDULING_END_BLOCKING_REGION;
+
+      if (r < 0) {
+        if (errno != EINTR) {
+          gpr_log(GPR_ERROR, "poll() failed: %s", strerror(errno));
+        }
+        for (i = 2; i < pfd_count; i++) {
+          fd_end_poll(exec_ctx, &watchers[i], 0, 0);
+        }
+      } else if (r == 0) {
+        for (i = 2; i < pfd_count; i++) {
+          fd_end_poll(exec_ctx, &watchers[i], 0, 0);
+        }
+      } else {
+        if (pfds[0].revents & POLLIN_CHECK) {
+          grpc_wakeup_fd_consume_wakeup(&grpc_global_wakeup_fd);
+        }
+        if (pfds[1].revents & POLLIN_CHECK) {
+          grpc_wakeup_fd_consume_wakeup(&worker.wakeup_fd->fd);
+        }
+        for (i = 2; i < pfd_count; i++) {
+          if (watchers[i].fd == NULL) {
+            fd_end_poll(exec_ctx, &watchers[i], 0, 0);
+          } else {
+            fd_end_poll(exec_ctx, &watchers[i], pfds[i].revents & POLLIN_CHECK,
+                        pfds[i].revents & POLLOUT_CHECK);
+          }
+        }
+      }
+
+      gpr_free(pfds);
+      gpr_free(watchers);
+      GPR_TIMER_END("maybe_work_and_unlock", 0);
+      locked = 0;
+      gpr_tls_set(&g_current_thread_poller, 0);
+    } else {
+      GPR_TIMER_MARK("pollset_work.kicked_without_pollers", 0);
+      pollset->kicked_without_pollers = 0;
+    }
+  /* Finished execution - start cleaning up.
+     Note that we may arrive here from outside the enclosing while() loop.
+     In that case we won't loop though as we haven't added worker to the
+     worker list, which means nobody could ask us to re-evaluate polling). */
+  done:
+    if (!locked) {
+      queued_work |= grpc_exec_ctx_flush(exec_ctx);
+      gpr_mu_lock(&pollset->mu);
+      locked = 1;
+    }
+    /* If we're forced to re-evaluate polling (via pollset_kick with
+       GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP) then we land here and force
+       a loop */
+    if (worker.reevaluate_polling_on_wakeup) {
+      worker.reevaluate_polling_on_wakeup = 0;
+      pollset->kicked_without_pollers = 0;
+      if (queued_work || worker.kicked_specifically) {
+        /* If there's queued work on the list, then set the deadline to be
+           immediate so we get back out of the polling loop quickly */
+        deadline = gpr_inf_past(GPR_CLOCK_MONOTONIC);
+      }
+      keep_polling = 1;
+    }
+    if (keep_polling) {
+      now = gpr_now(now.clock_type);
+    }
+  }
+  if (added_worker) {
+    remove_worker(pollset, &worker);
+    gpr_tls_set(&g_current_thread_worker, 0);
+  }
+  /* release wakeup fd to the local pool */
+  worker.wakeup_fd->next = pollset->local_wakeup_cache;
+  pollset->local_wakeup_cache = worker.wakeup_fd;
+  /* check shutdown conditions */
+  if (pollset->shutting_down) {
+    if (pollset_has_workers(pollset)) {
+      pollset_kick(pollset, NULL);
+    } else if (!pollset->called_shutdown && pollset->in_flight_cbs == 0) {
+      pollset->called_shutdown = 1;
+      gpr_mu_unlock(&pollset->mu);
+      finish_shutdown(exec_ctx, pollset);
+      grpc_exec_ctx_flush(exec_ctx);
+      /* Continuing to access pollset here is safe -- it is the caller's
+       * responsibility to not destroy when it has outstanding calls to
+       * pollset_work.
+       * TODO(dklempner): Can we refactor the shutdown logic to avoid this? */
+      gpr_mu_lock(&pollset->mu);
+    } else if (!grpc_closure_list_empty(pollset->idle_jobs)) {
+      grpc_exec_ctx_enqueue_list(exec_ctx, &pollset->idle_jobs, NULL);
+      gpr_mu_unlock(&pollset->mu);
+      grpc_exec_ctx_flush(exec_ctx);
+      gpr_mu_lock(&pollset->mu);
+    }
+  }
+  *worker_hdl = NULL;
+  GPR_TIMER_END("pollset_work", 0);
+}
+
+static void pollset_shutdown(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
+                             grpc_closure *closure) {
+  GPR_ASSERT(!pollset->shutting_down);
+  pollset->shutting_down = 1;
+  pollset->shutdown_done = closure;
+  pollset_kick(pollset, GRPC_POLLSET_KICK_BROADCAST);
+  if (!pollset_has_workers(pollset)) {
+    grpc_exec_ctx_enqueue_list(exec_ctx, &pollset->idle_jobs, NULL);
+  }
+  if (!pollset->called_shutdown && pollset->in_flight_cbs == 0 &&
+      !pollset_has_workers(pollset)) {
+    pollset->called_shutdown = 1;
+    finish_shutdown(exec_ctx, pollset);
+  }
+}
+
+static int poll_deadline_to_millis_timeout(gpr_timespec deadline,
+                                           gpr_timespec now) {
+  gpr_timespec timeout;
+  static const int64_t max_spin_polling_us = 10;
+  if (gpr_time_cmp(deadline, gpr_inf_future(deadline.clock_type)) == 0) {
+    return -1;
+  }
+  if (gpr_time_cmp(deadline, gpr_time_add(now, gpr_time_from_micros(
+                                                   max_spin_polling_us,
+                                                   GPR_TIMESPAN))) <= 0) {
+    return 0;
+  }
+  timeout = gpr_time_sub(deadline, now);
+  return gpr_time_to_millis(gpr_time_add(
+      timeout, gpr_time_from_nanos(GPR_NS_PER_MS - 1, GPR_TIMESPAN)));
+}
+
+/*******************************************************************************
+ * pollset_set_posix.c
+ */
+
+static grpc_pollset_set *pollset_set_create(void) {
+  grpc_pollset_set *pollset_set = gpr_malloc(sizeof(*pollset_set));
+  memset(pollset_set, 0, sizeof(*pollset_set));
+  gpr_mu_init(&pollset_set->mu);
+  return pollset_set;
+}
+
+static void pollset_set_destroy(grpc_pollset_set *pollset_set) {
+  size_t i;
+  gpr_mu_destroy(&pollset_set->mu);
+  for (i = 0; i < pollset_set->fd_count; i++) {
+    GRPC_FD_UNREF(pollset_set->fds[i], "pollset_set");
+  }
+  gpr_free(pollset_set->pollsets);
+  gpr_free(pollset_set->pollset_sets);
+  gpr_free(pollset_set->fds);
+  gpr_free(pollset_set);
+}
+
+static void pollset_set_add_pollset(grpc_exec_ctx *exec_ctx,
+                                    grpc_pollset_set *pollset_set,
+                                    grpc_pollset *pollset) {
+  size_t i, j;
+  gpr_mu_lock(&pollset_set->mu);
+  if (pollset_set->pollset_count == pollset_set->pollset_capacity) {
+    pollset_set->pollset_capacity =
+        GPR_MAX(8, 2 * pollset_set->pollset_capacity);
+    pollset_set->pollsets =
+        gpr_realloc(pollset_set->pollsets, pollset_set->pollset_capacity *
+                                               sizeof(*pollset_set->pollsets));
+  }
+  pollset_set->pollsets[pollset_set->pollset_count++] = pollset;
+  for (i = 0, j = 0; i < pollset_set->fd_count; i++) {
+    if (fd_is_orphaned(pollset_set->fds[i])) {
+      GRPC_FD_UNREF(pollset_set->fds[i], "pollset_set");
+    } else {
+      pollset_add_fd(exec_ctx, pollset, pollset_set->fds[i]);
+      pollset_set->fds[j++] = pollset_set->fds[i];
+    }
+  }
+  pollset_set->fd_count = j;
+  gpr_mu_unlock(&pollset_set->mu);
+}
+
+static void pollset_set_del_pollset(grpc_exec_ctx *exec_ctx,
+                                    grpc_pollset_set *pollset_set,
+                                    grpc_pollset *pollset) {
+  size_t i;
+  gpr_mu_lock(&pollset_set->mu);
+  for (i = 0; i < pollset_set->pollset_count; i++) {
+    if (pollset_set->pollsets[i] == pollset) {
+      pollset_set->pollset_count--;
+      GPR_SWAP(grpc_pollset *, pollset_set->pollsets[i],
+               pollset_set->pollsets[pollset_set->pollset_count]);
+      break;
+    }
+  }
+  gpr_mu_unlock(&pollset_set->mu);
+}
+
+static void pollset_set_add_pollset_set(grpc_exec_ctx *exec_ctx,
+                                        grpc_pollset_set *bag,
+                                        grpc_pollset_set *item) {
+  size_t i, j;
+  gpr_mu_lock(&bag->mu);
+  if (bag->pollset_set_count == bag->pollset_set_capacity) {
+    bag->pollset_set_capacity = GPR_MAX(8, 2 * bag->pollset_set_capacity);
+    bag->pollset_sets =
+        gpr_realloc(bag->pollset_sets,
+                    bag->pollset_set_capacity * sizeof(*bag->pollset_sets));
+  }
+  bag->pollset_sets[bag->pollset_set_count++] = item;
+  for (i = 0, j = 0; i < bag->fd_count; i++) {
+    if (fd_is_orphaned(bag->fds[i])) {
+      GRPC_FD_UNREF(bag->fds[i], "pollset_set");
+    } else {
+      pollset_set_add_fd(exec_ctx, item, bag->fds[i]);
+      bag->fds[j++] = bag->fds[i];
+    }
+  }
+  bag->fd_count = j;
+  gpr_mu_unlock(&bag->mu);
+}
+
+static void pollset_set_del_pollset_set(grpc_exec_ctx *exec_ctx,
+                                        grpc_pollset_set *bag,
+                                        grpc_pollset_set *item) {
+  size_t i;
+  gpr_mu_lock(&bag->mu);
+  for (i = 0; i < bag->pollset_set_count; i++) {
+    if (bag->pollset_sets[i] == item) {
+      bag->pollset_set_count--;
+      GPR_SWAP(grpc_pollset_set *, bag->pollset_sets[i],
+               bag->pollset_sets[bag->pollset_set_count]);
+      break;
+    }
+  }
+  gpr_mu_unlock(&bag->mu);
+}
+
+static void pollset_set_add_fd(grpc_exec_ctx *exec_ctx,
+                               grpc_pollset_set *pollset_set, grpc_fd *fd) {
+  size_t i;
+  gpr_mu_lock(&pollset_set->mu);
+  if (pollset_set->fd_count == pollset_set->fd_capacity) {
+    pollset_set->fd_capacity = GPR_MAX(8, 2 * pollset_set->fd_capacity);
+    pollset_set->fds = gpr_realloc(
+        pollset_set->fds, pollset_set->fd_capacity * sizeof(*pollset_set->fds));
+  }
+  GRPC_FD_REF(fd, "pollset_set");
+  pollset_set->fds[pollset_set->fd_count++] = fd;
+  for (i = 0; i < pollset_set->pollset_count; i++) {
+    pollset_add_fd(exec_ctx, pollset_set->pollsets[i], fd);
+  }
+  for (i = 0; i < pollset_set->pollset_set_count; i++) {
+    pollset_set_add_fd(exec_ctx, pollset_set->pollset_sets[i], fd);
+  }
+  gpr_mu_unlock(&pollset_set->mu);
+}
+
+static void pollset_set_del_fd(grpc_exec_ctx *exec_ctx,
+                               grpc_pollset_set *pollset_set, grpc_fd *fd) {
+  size_t i;
+  gpr_mu_lock(&pollset_set->mu);
+  for (i = 0; i < pollset_set->fd_count; i++) {
+    if (pollset_set->fds[i] == fd) {
+      pollset_set->fd_count--;
+      GPR_SWAP(grpc_fd *, pollset_set->fds[i],
+               pollset_set->fds[pollset_set->fd_count]);
+      GRPC_FD_UNREF(fd, "pollset_set");
+      break;
+    }
+  }
+  for (i = 0; i < pollset_set->pollset_set_count; i++) {
+    pollset_set_del_fd(exec_ctx, pollset_set->pollset_sets[i], fd);
+  }
+  gpr_mu_unlock(&pollset_set->mu);
+}
+
+/*******************************************************************************
+ * event engine binding
+ */
+
+static void shutdown_engine(void) { pollset_global_shutdown(); }
+
+static const grpc_event_engine_vtable vtable = {
+    .pollset_size = sizeof(grpc_pollset),
+
+    .fd_create = fd_create,
+    .fd_wrapped_fd = fd_wrapped_fd,
+    .fd_orphan = fd_orphan,
+    .fd_shutdown = fd_shutdown,
+    .fd_notify_on_read = fd_notify_on_read,
+    .fd_notify_on_write = fd_notify_on_write,
+
+    .pollset_init = pollset_init,
+    .pollset_shutdown = pollset_shutdown,
+    .pollset_reset = pollset_reset,
+    .pollset_destroy = pollset_destroy,
+    .pollset_work = pollset_work,
+    .pollset_kick = pollset_kick,
+    .pollset_add_fd = pollset_add_fd,
+
+    .pollset_set_create = pollset_set_create,
+    .pollset_set_destroy = pollset_set_destroy,
+    .pollset_set_add_pollset = pollset_set_add_pollset,
+    .pollset_set_del_pollset = pollset_set_del_pollset,
+    .pollset_set_add_pollset_set = pollset_set_add_pollset_set,
+    .pollset_set_del_pollset_set = pollset_set_del_pollset_set,
+    .pollset_set_add_fd = pollset_set_add_fd,
+    .pollset_set_del_fd = pollset_set_del_fd,
+
+    .kick_poller = kick_poller,
+
+    .shutdown_engine = shutdown_engine,
+};
+
+const grpc_event_engine_vtable *grpc_init_poll_posix(void) {
+  pollset_global_init();
+  return &vtable;
+}
+
+#endif
diff --git a/examples/node/greeter_client.js b/src/core/lib/iomgr/ev_poll_posix.h
similarity index 72%
copy from examples/node/greeter_client.js
copy to src/core/lib/iomgr/ev_poll_posix.h
index 2820acb..291736a 100644
--- a/examples/node/greeter_client.js
+++ b/src/core/lib/iomgr/ev_poll_posix.h
@@ -1,6 +1,6 @@
 /*
  *
- * Copyright 2015, Google Inc.
+ * Copyright 2015-2016, Google Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,23 +31,11 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+#ifndef GRPC_CORE_LIB_IOMGR_EV_POLL_POSIX_H
+#define GRPC_CORE_LIB_IOMGR_EV_POLL_POSIX_H
 
-var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
+#include "src/core/lib/iomgr/ev_posix.h"
 
-function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
-                                       grpc.credentials.createInsecure());
-  var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
-  } else {
-    user = 'world';
-  }
-  client.sayHello({name: user}, function(err, response) {
-    console.log('Greeting:', response.message);
-  });
-}
+const grpc_event_engine_vtable *grpc_init_poll_posix(void);
 
-main();
+#endif /* GRPC_CORE_LIB_IOMGR_EV_POLL_POSIX_H */
diff --git a/src/core/lib/iomgr/ev_posix.c b/src/core/lib/iomgr/ev_posix.c
index 7df1751..a7dfc95 100644
--- a/src/core/lib/iomgr/ev_posix.c
+++ b/src/core/lib/iomgr/ev_posix.c
@@ -37,23 +37,104 @@
 
 #include "src/core/lib/iomgr/ev_posix.h"
 
+#include <string.h>
+
+#include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
+#include <grpc/support/useful.h>
 
 #include "src/core/lib/iomgr/ev_poll_and_epoll_posix.h"
+#include "src/core/lib/iomgr/ev_poll_posix.h"
+#include "src/core/lib/support/env.h"
+
+/** Default poll() function - a pointer so that it can be overridden by some
+ *  tests */
+grpc_poll_function_type grpc_poll_function = poll;
 
 static const grpc_event_engine_vtable *g_event_engine;
 
-grpc_poll_function_type grpc_poll_function = poll;
+typedef const grpc_event_engine_vtable *(*event_engine_factory_fn)(void);
 
-void grpc_event_engine_init(void) {
-  if ((g_event_engine = grpc_init_poll_and_epoll_posix())) {
-    return;
-  }
-  gpr_log(GPR_ERROR, "No event engine could be initialized");
-  abort();
+typedef struct {
+  const char *name;
+  event_engine_factory_fn factory;
+} event_engine_factory;
+
+static const event_engine_factory g_factories[] = {
+    {"poll", grpc_init_poll_posix}, {"legacy", grpc_init_poll_and_epoll_posix},
+};
+
+static void add(const char *beg, const char *end, char ***ss, size_t *ns) {
+  size_t n = *ns;
+  size_t np = n + 1;
+  char *s;
+  size_t len;
+  GPR_ASSERT(end >= beg);
+  len = (size_t)(end - beg);
+  s = gpr_malloc(len + 1);
+  memcpy(s, beg, len);
+  s[len] = 0;
+  *ss = gpr_realloc(*ss, sizeof(char **) * np);
+  (*ss)[n] = s;
+  *ns = np;
 }
 
-void grpc_event_engine_shutdown(void) { g_event_engine->shutdown_engine(); }
+static void split(const char *s, char ***ss, size_t *ns) {
+  const char *c = strchr(s, ',');
+  if (c == NULL) {
+    add(s, s + strlen(s), ss, ns);
+  } else {
+    add(s, c, ss, ns);
+    split(c + 1, ss, ns);
+  }
+}
+
+static bool is(const char *want, const char *have) {
+  return 0 == strcmp(want, "all") || 0 == strcmp(want, have);
+}
+
+static void try_engine(const char *engine) {
+  for (size_t i = 0; i < GPR_ARRAY_SIZE(g_factories); i++) {
+    if (is(engine, g_factories[i].name)) {
+      if ((g_event_engine = g_factories[i].factory())) {
+        gpr_log(GPR_DEBUG, "Using polling engine: %s", g_factories[i].name);
+        return;
+      }
+    }
+  }
+}
+
+void grpc_event_engine_init(void) {
+  char *s = gpr_getenv("GRPC_POLL_STRATEGY");
+  if (s == NULL) {
+    s = gpr_strdup("all");
+  }
+
+  char **strings = NULL;
+  size_t nstrings = 0;
+  split(s, &strings, &nstrings);
+
+  for (size_t i = 0; g_event_engine == NULL && i < nstrings; i++) {
+    try_engine(strings[i]);
+  }
+
+  for (size_t i = 0; i < nstrings; i++) {
+    gpr_free(strings[i]);
+  }
+  gpr_free(strings);
+  gpr_free(s);
+
+  if (g_event_engine == NULL) {
+    gpr_log(GPR_ERROR, "No event engine could be initialized");
+    abort();
+  }
+}
+
+void grpc_event_engine_shutdown(void) {
+  g_event_engine->shutdown_engine();
+  g_event_engine = NULL;
+}
 
 grpc_fd *grpc_fd_create(int fd, const char *name) {
   return g_event_engine->fd_create(fd, name);
diff --git a/src/core/lib/iomgr/iomgr_posix.c b/src/core/lib/iomgr/iomgr_posix.c
index 016c501..cede97f 100644
--- a/src/core/lib/iomgr/iomgr_posix.c
+++ b/src/core/lib/iomgr/iomgr_posix.c
@@ -41,12 +41,16 @@
 #include "src/core/lib/iomgr/tcp_posix.h"
 
 void grpc_iomgr_platform_init(void) {
+  grpc_wakeup_fd_global_init();
   grpc_event_engine_init();
   grpc_register_tracer("tcp", &grpc_tcp_trace);
 }
 
 void grpc_iomgr_platform_flush(void) {}
 
-void grpc_iomgr_platform_shutdown(void) { grpc_event_engine_shutdown(); }
+void grpc_iomgr_platform_shutdown(void) {
+  grpc_event_engine_shutdown();
+  grpc_wakeup_fd_global_destroy();
+}
 
 #endif /* GRPC_POSIX_SOCKET */
diff --git a/src/core/lib/iomgr/tcp_posix.c b/src/core/lib/iomgr/tcp_posix.c
index 7210aef..e286922 100644
--- a/src/core/lib/iomgr/tcp_posix.c
+++ b/src/core/lib/iomgr/tcp_posix.c
@@ -164,7 +164,7 @@
     for (i = 0; i < tcp->incoming_buffer->count; i++) {
       char *dump = gpr_dump_slice(tcp->incoming_buffer->slices[i],
                                   GPR_DUMP_HEX | GPR_DUMP_ASCII);
-      gpr_log(GPR_DEBUG, "READ %p: %s", tcp, dump);
+      gpr_log(GPR_DEBUG, "READ %p (peer=%s): %s", tcp, tcp->peer_string, dump);
       gpr_free(dump);
     }
   }
@@ -398,7 +398,7 @@
     for (i = 0; i < buf->count; i++) {
       char *data =
           gpr_dump_slice(buf->slices[i], GPR_DUMP_HEX | GPR_DUMP_ASCII);
-      gpr_log(GPR_DEBUG, "WRITE %p: %s", tcp, data);
+      gpr_log(GPR_DEBUG, "WRITE %p (peer=%s): %s", tcp, tcp->peer_string, data);
       gpr_free(data);
     }
   }
diff --git a/src/core/lib/iomgr/udp_server.c b/src/core/lib/iomgr/udp_server.c
index df6cf95..98ffccd 100644
--- a/src/core/lib/iomgr/udp_server.c
+++ b/src/core/lib/iomgr/udp_server.c
@@ -81,6 +81,7 @@
   grpc_closure read_closure;
   grpc_closure destroyed_closure;
   grpc_udp_server_read_cb read_cb;
+  grpc_udp_server_orphan_cb orphan_cb;
 } server_port;
 
 /* the overall server */
@@ -168,6 +169,10 @@
       server_port *sp = &s->ports[i];
       sp->destroyed_closure.cb = destroyed_port;
       sp->destroyed_closure.cb_arg = s;
+
+      GPR_ASSERT(sp->orphan_cb);
+      sp->orphan_cb(sp->emfd);
+
       grpc_fd_orphan(exec_ctx, sp->emfd, &sp->destroyed_closure, NULL,
                      "udp_listener_shutdown");
     }
@@ -268,7 +273,8 @@
 
 static int add_socket_to_server(grpc_udp_server *s, int fd,
                                 const struct sockaddr *addr, size_t addr_len,
-                                grpc_udp_server_read_cb read_cb) {
+                                grpc_udp_server_read_cb read_cb,
+                                grpc_udp_server_orphan_cb orphan_cb) {
   server_port *sp;
   int port;
   char *addr_str;
@@ -292,6 +298,7 @@
     memcpy(sp->addr.untyped, addr, addr_len);
     sp->addr_len = addr_len;
     sp->read_cb = read_cb;
+    sp->orphan_cb = orphan_cb;
     GPR_ASSERT(sp->emfd);
     gpr_mu_unlock(&s->mu);
     gpr_free(name);
@@ -301,7 +308,8 @@
 }
 
 int grpc_udp_server_add_port(grpc_udp_server *s, const void *addr,
-                             size_t addr_len, grpc_udp_server_read_cb read_cb) {
+                             size_t addr_len, grpc_udp_server_read_cb read_cb,
+                             grpc_udp_server_orphan_cb orphan_cb) {
   int allocated_port1 = -1;
   int allocated_port2 = -1;
   unsigned i;
@@ -348,7 +356,8 @@
     addr = (struct sockaddr *)&wild6;
     addr_len = sizeof(wild6);
     fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode);
-    allocated_port1 = add_socket_to_server(s, fd, addr, addr_len, read_cb);
+    allocated_port1 =
+        add_socket_to_server(s, fd, addr, addr_len, read_cb, orphan_cb);
     if (fd >= 0 && dsmode == GRPC_DSMODE_DUALSTACK) {
       goto done;
     }
@@ -370,7 +379,8 @@
     addr = (struct sockaddr *)&addr4_copy;
     addr_len = sizeof(addr4_copy);
   }
-  allocated_port2 = add_socket_to_server(s, fd, addr, addr_len, read_cb);
+  allocated_port2 =
+      add_socket_to_server(s, fd, addr, addr_len, read_cb, orphan_cb);
 
 done:
   gpr_free(allocated_addr);
diff --git a/src/core/lib/iomgr/udp_server.h b/src/core/lib/iomgr/udp_server.h
index d8cf957..33c5ce1 100644
--- a/src/core/lib/iomgr/udp_server.h
+++ b/src/core/lib/iomgr/udp_server.h
@@ -48,6 +48,9 @@
 typedef void (*grpc_udp_server_read_cb)(grpc_exec_ctx *exec_ctx, grpc_fd *emfd,
                                         struct grpc_server *server);
 
+/* Called when the grpc_fd is about to be orphaned (and the FD closed). */
+typedef void (*grpc_udp_server_orphan_cb)(grpc_fd *emfd);
+
 /* Create a server, initially not bound to any ports */
 grpc_udp_server *grpc_udp_server_create(void);
 
@@ -69,7 +72,8 @@
 /* TODO(ctiller): deprecate this, and make grpc_udp_server_add_ports to handle
                   all of the multiple socket port matching logic in one place */
 int grpc_udp_server_add_port(grpc_udp_server *s, const void *addr,
-                             size_t addr_len, grpc_udp_server_read_cb read_cb);
+                             size_t addr_len, grpc_udp_server_read_cb read_cb,
+                             grpc_udp_server_orphan_cb orphan_cb);
 
 void grpc_udp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_udp_server *server,
                              grpc_closure *on_done);
diff --git a/src/core/lib/surface/version.c b/src/core/lib/surface/version.c
index fe954cb..aca76d2 100644
--- a/src/core/lib/surface/version.c
+++ b/src/core/lib/surface/version.c
@@ -36,4 +36,4 @@
 
 #include <grpc/grpc.h>
 
-const char *grpc_version_string(void) { return "0.14.0-dev"; }
+const char *grpc_version_string(void) { return "0.15.0-dev"; }
diff --git a/src/core/lib/transport/metadata.h b/src/core/lib/transport/metadata.h
index 713d9e6..6d82f4d 100644
--- a/src/core/lib/transport/metadata.h
+++ b/src/core/lib/transport/metadata.h
@@ -147,6 +147,10 @@
 
 #define GRPC_MDSTR_LENGTH(s) (GPR_SLICE_LENGTH(s->slice))
 
+/* We add 32 bytes of padding as per RFC-7540 section 6.5.2. */
+#define GRPC_MDELEM_LENGTH(e) \
+  (GRPC_MDSTR_LENGTH((e)->key) + GRPC_MDSTR_LENGTH((e)->value) + 32)
+
 int grpc_mdstr_is_legal_header(grpc_mdstr *s);
 int grpc_mdstr_is_legal_nonbin_header(grpc_mdstr *s);
 int grpc_mdstr_is_bin_suffixed(grpc_mdstr *s);
diff --git a/src/core/lib/transport/metadata_batch.c b/src/core/lib/transport/metadata_batch.c
index 4567221..e4398ab 100644
--- a/src/core/lib/transport/metadata_batch.c
+++ b/src/core/lib/transport/metadata_batch.c
@@ -192,3 +192,12 @@
          gpr_time_cmp(gpr_inf_future(batch->deadline.clock_type),
                       batch->deadline) == 0;
 }
+
+size_t grpc_metadata_batch_size(grpc_metadata_batch *batch) {
+  size_t size = 0;
+  for (grpc_linked_mdelem *elem = batch->list.head; elem != NULL;
+       elem = elem->next) {
+    size += GRPC_MDELEM_LENGTH(elem->md);
+  }
+  return size;
+}
diff --git a/src/core/lib/transport/metadata_batch.h b/src/core/lib/transport/metadata_batch.h
index b626688..7af823f 100644
--- a/src/core/lib/transport/metadata_batch.h
+++ b/src/core/lib/transport/metadata_batch.h
@@ -66,6 +66,9 @@
 void grpc_metadata_batch_clear(grpc_metadata_batch *batch);
 int grpc_metadata_batch_is_empty(grpc_metadata_batch *batch);
 
+/* Returns the transport size of the batch. */
+size_t grpc_metadata_batch_size(grpc_metadata_batch *batch);
+
 /** Moves the metadata information from \a src to \a dst. Upon return, \a src is
  * zeroed. */
 void grpc_metadata_batch_move(grpc_metadata_batch *dst,
diff --git a/src/cpp/common/channel_arguments.cc b/src/cpp/common/channel_arguments.cc
index db3558f..f297ae8 100644
--- a/src/cpp/common/channel_arguments.cc
+++ b/src/cpp/common/channel_arguments.cc
@@ -85,7 +85,7 @@
 
 void ChannelArguments::SetCompressionAlgorithm(
     grpc_compression_algorithm algorithm) {
-  SetInt(GRPC_COMPRESSION_ALGORITHM_ARG, algorithm);
+  SetInt(GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM, algorithm);
 }
 
 // Note: a second call to this will add in front the result of the first call.
diff --git a/src/cpp/common/core_codegen.cc b/src/cpp/common/core_codegen.cc
index 33a8f75..8e8d42e 100644
--- a/src/cpp/common/core_codegen.cc
+++ b/src/cpp/common/core_codegen.cc
@@ -48,124 +48,6 @@
 
 #include "src/core/lib/profiling/timers.h"
 
-namespace {
-
-const int kGrpcBufferWriterMaxBufferLength = 8192;
-
-class GrpcBufferWriter GRPC_FINAL
-    : public ::grpc::protobuf::io::ZeroCopyOutputStream {
- public:
-  explicit GrpcBufferWriter(grpc_byte_buffer** bp, int block_size)
-      : block_size_(block_size), byte_count_(0), have_backup_(false) {
-    *bp = grpc_raw_byte_buffer_create(NULL, 0);
-    slice_buffer_ = &(*bp)->data.raw.slice_buffer;
-  }
-
-  ~GrpcBufferWriter() GRPC_OVERRIDE {
-    if (have_backup_) {
-      gpr_slice_unref(backup_slice_);
-    }
-  }
-
-  bool Next(void** data, int* size) GRPC_OVERRIDE {
-    if (have_backup_) {
-      slice_ = backup_slice_;
-      have_backup_ = false;
-    } else {
-      slice_ = gpr_slice_malloc(block_size_);
-    }
-    *data = GPR_SLICE_START_PTR(slice_);
-    // On win x64, int is only 32bit
-    GPR_ASSERT(GPR_SLICE_LENGTH(slice_) <= INT_MAX);
-    byte_count_ += * size = (int)GPR_SLICE_LENGTH(slice_);
-    gpr_slice_buffer_add(slice_buffer_, slice_);
-    return true;
-  }
-
-  void BackUp(int count) GRPC_OVERRIDE {
-    gpr_slice_buffer_pop(slice_buffer_);
-    if (count == block_size_) {
-      backup_slice_ = slice_;
-    } else {
-      backup_slice_ =
-          gpr_slice_split_tail(&slice_, GPR_SLICE_LENGTH(slice_) - count);
-      gpr_slice_buffer_add(slice_buffer_, slice_);
-    }
-    have_backup_ = true;
-    byte_count_ -= count;
-  }
-
-  grpc::protobuf::int64 ByteCount() const GRPC_OVERRIDE { return byte_count_; }
-
- private:
-  const int block_size_;
-  int64_t byte_count_;
-  gpr_slice_buffer* slice_buffer_;
-  bool have_backup_;
-  gpr_slice backup_slice_;
-  gpr_slice slice_;
-};
-
-class GrpcBufferReader GRPC_FINAL
-    : public ::grpc::protobuf::io::ZeroCopyInputStream {
- public:
-  explicit GrpcBufferReader(grpc_byte_buffer* buffer)
-      : byte_count_(0), backup_count_(0) {
-    grpc_byte_buffer_reader_init(&reader_, buffer);
-  }
-  ~GrpcBufferReader() GRPC_OVERRIDE {
-    grpc_byte_buffer_reader_destroy(&reader_);
-  }
-
-  bool Next(const void** data, int* size) GRPC_OVERRIDE {
-    if (backup_count_ > 0) {
-      *data = GPR_SLICE_START_PTR(slice_) + GPR_SLICE_LENGTH(slice_) -
-              backup_count_;
-      GPR_ASSERT(backup_count_ <= INT_MAX);
-      *size = (int)backup_count_;
-      backup_count_ = 0;
-      return true;
-    }
-    if (!grpc_byte_buffer_reader_next(&reader_, &slice_)) {
-      return false;
-    }
-    gpr_slice_unref(slice_);
-    *data = GPR_SLICE_START_PTR(slice_);
-    // On win x64, int is only 32bit
-    GPR_ASSERT(GPR_SLICE_LENGTH(slice_) <= INT_MAX);
-    byte_count_ += * size = (int)GPR_SLICE_LENGTH(slice_);
-    return true;
-  }
-
-  void BackUp(int count) GRPC_OVERRIDE { backup_count_ = count; }
-
-  bool Skip(int count) GRPC_OVERRIDE {
-    const void* data;
-    int size;
-    while (Next(&data, &size)) {
-      if (size >= count) {
-        BackUp(size - count);
-        return true;
-      }
-      // size < count;
-      count -= size;
-    }
-    // error or we have too large count;
-    return false;
-  }
-
-  grpc::protobuf::int64 ByteCount() const GRPC_OVERRIDE {
-    return byte_count_ - backup_count_;
-  }
-
- private:
-  int64_t byte_count_;
-  int64_t backup_count_;
-  grpc_byte_buffer_reader reader_;
-  gpr_slice slice_;
-};
-}  // namespace
-
 namespace grpc {
 
 grpc_completion_queue* CoreCodegen::grpc_completion_queue_create(
@@ -192,6 +74,44 @@
   ::grpc_byte_buffer_destroy(bb);
 }
 
+void CoreCodegen::grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader,
+                                               grpc_byte_buffer* buffer) {
+  ::grpc_byte_buffer_reader_init(reader, buffer);
+}
+
+void CoreCodegen::grpc_byte_buffer_reader_destroy(
+    grpc_byte_buffer_reader* reader) {
+  ::grpc_byte_buffer_reader_destroy(reader);
+}
+
+int CoreCodegen::grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader,
+                                              gpr_slice* slice) {
+  return ::grpc_byte_buffer_reader_next(reader, slice);
+}
+
+grpc_byte_buffer* CoreCodegen::grpc_raw_byte_buffer_create(gpr_slice* slice,
+                                                           size_t nslices) {
+  return ::grpc_raw_byte_buffer_create(slice, nslices);
+}
+
+gpr_slice CoreCodegen::gpr_slice_malloc(size_t length) {
+  return ::gpr_slice_malloc(length);
+}
+
+void CoreCodegen::gpr_slice_unref(gpr_slice slice) { ::gpr_slice_unref(slice); }
+
+gpr_slice CoreCodegen::gpr_slice_split_tail(gpr_slice* s, size_t split) {
+  return ::gpr_slice_split_tail(s, split);
+}
+
+void CoreCodegen::gpr_slice_buffer_add(gpr_slice_buffer* sb, gpr_slice slice) {
+  ::gpr_slice_buffer_add(sb, slice);
+}
+
+void CoreCodegen::gpr_slice_buffer_pop(gpr_slice_buffer* sb) {
+  ::gpr_slice_buffer_pop(sb);
+}
+
 void CoreCodegen::grpc_metadata_array_init(grpc_metadata_array* array) {
   ::grpc_metadata_array_init(array);
 }
@@ -200,6 +120,10 @@
   ::grpc_metadata_array_destroy(array);
 }
 
+const Status& CoreCodegen::ok() { return grpc::Status::OK; }
+
+const Status& CoreCodegen::cancelled() { return grpc::Status::CANCELLED; }
+
 gpr_timespec CoreCodegen::gpr_inf_future(gpr_clock_type type) {
   return ::gpr_inf_future(type);
 }
@@ -209,48 +133,4 @@
   abort();
 }
 
-Status CoreCodegen::SerializeProto(const grpc::protobuf::Message& msg,
-                                   grpc_byte_buffer** bp) {
-  GPR_TIMER_SCOPE("SerializeProto", 0);
-  int byte_size = msg.ByteSize();
-  if (byte_size <= kGrpcBufferWriterMaxBufferLength) {
-    gpr_slice slice = gpr_slice_malloc(byte_size);
-    GPR_ASSERT(GPR_SLICE_END_PTR(slice) ==
-               msg.SerializeWithCachedSizesToArray(GPR_SLICE_START_PTR(slice)));
-    *bp = grpc_raw_byte_buffer_create(&slice, 1);
-    gpr_slice_unref(slice);
-    return Status::OK;
-  } else {
-    GrpcBufferWriter writer(bp, kGrpcBufferWriterMaxBufferLength);
-    return msg.SerializeToZeroCopyStream(&writer)
-               ? Status::OK
-               : Status(StatusCode::INTERNAL, "Failed to serialize message");
-  }
-}
-
-Status CoreCodegen::DeserializeProto(grpc_byte_buffer* buffer,
-                                     grpc::protobuf::Message* msg,
-                                     int max_message_size) {
-  GPR_TIMER_SCOPE("DeserializeProto", 0);
-  if (buffer == nullptr) {
-    return Status(StatusCode::INTERNAL, "No payload");
-  }
-  Status result = Status::OK;
-  {
-    GrpcBufferReader reader(buffer);
-    ::grpc::protobuf::io::CodedInputStream decoder(&reader);
-    if (max_message_size > 0) {
-      decoder.SetTotalBytesLimit(max_message_size, max_message_size);
-    }
-    if (!msg->ParseFromCodedStream(&decoder)) {
-      result = Status(StatusCode::INTERNAL, msg->InitializationErrorString());
-    }
-    if (!decoder.ConsumedEntireMessage()) {
-      result = Status(StatusCode::INTERNAL, "Did not read entire message");
-    }
-  }
-  grpc_byte_buffer_destroy(buffer);
-  return result;
-}
-
 }  // namespace grpc
diff --git a/src/cpp/common/core_codegen.h b/src/cpp/common/core_codegen.h
index e15cb4c..656b11e 100644
--- a/src/cpp/common/core_codegen.h
+++ b/src/cpp/common/core_codegen.h
@@ -42,13 +42,6 @@
 /// Implementation of the core codegen interface.
 class CoreCodegen : public CoreCodegenInterface {
  private:
-  Status SerializeProto(const grpc::protobuf::Message& msg,
-                        grpc_byte_buffer** bp) override;
-
-  Status DeserializeProto(grpc_byte_buffer* buffer,
-                          grpc::protobuf::Message* msg,
-                          int max_message_size) override;
-
   grpc_completion_queue* grpc_completion_queue_create(void* reserved) override;
   void grpc_completion_queue_destroy(grpc_completion_queue* cq) override;
   grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, void* tag,
@@ -60,11 +53,30 @@
 
   void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) override;
 
+  void grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader,
+                                    grpc_byte_buffer* buffer) override;
+  void grpc_byte_buffer_reader_destroy(
+      grpc_byte_buffer_reader* reader) override;
+  int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader,
+                                   gpr_slice* slice) override;
+
+  grpc_byte_buffer* grpc_raw_byte_buffer_create(gpr_slice* slice,
+                                                size_t nslices) override;
+
+  gpr_slice gpr_slice_malloc(size_t length) override;
+  void gpr_slice_unref(gpr_slice slice) override;
+  gpr_slice gpr_slice_split_tail(gpr_slice* s, size_t split) override;
+  void gpr_slice_buffer_add(gpr_slice_buffer* sb, gpr_slice slice) override;
+  void gpr_slice_buffer_pop(gpr_slice_buffer* sb) override;
+
   void grpc_metadata_array_init(grpc_metadata_array* array) override;
   void grpc_metadata_array_destroy(grpc_metadata_array* array) override;
 
   gpr_timespec gpr_inf_future(gpr_clock_type type) override;
 
+  virtual const Status& ok() override;
+  virtual const Status& cancelled() override;
+
   void assert_fail(const char* failed_assertion) override;
 };
 
diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc
index fafe31e..f955a31 100644
--- a/src/cpp/server/server.cc
+++ b/src/cpp/server/server.cc
@@ -33,6 +33,7 @@
 
 #include <grpc++/server.h>
 
+#include <sstream>
 #include <utility>
 
 #include <grpc++/completion_queue.h>
@@ -41,6 +42,7 @@
 #include <grpc++/impl/grpc_library.h>
 #include <grpc++/impl/method_handler_impl.h>
 #include <grpc++/impl/rpc_service_method.h>
+#include <grpc++/impl/server_initializer.h>
 #include <grpc++/impl/service_type.h>
 #include <grpc++/security/server_credentials.h>
 #include <grpc++/server_context.h>
@@ -284,7 +286,8 @@
       has_generic_service_(false),
       server_(nullptr),
       thread_pool_(thread_pool),
-      thread_pool_owned_(thread_pool_owned) {
+      thread_pool_owned_(thread_pool_owned),
+      server_initializer_(new ServerInitializer(this)) {
   g_gli_initializer.summon();
   gpr_once_init(&g_once_init_callbacks, InitGlobalCallbacks);
   global_callbacks_ = g_callbacks;
@@ -341,6 +344,7 @@
                "Can only register an asynchronous service against one server.");
     service->server_ = this;
   }
+  const char* method_name = nullptr;
   for (auto it = service->methods_.begin(); it != service->methods_.end();
        ++it) {
     if (it->get() == nullptr) {  // Handled by generic service if any.
@@ -360,6 +364,17 @@
     } else {
       sync_methods_->emplace_back(method, tag);
     }
+    method_name = method->name();
+  }
+
+  // Parse service name.
+  if (method_name != nullptr) {
+    std::stringstream ss(method_name);
+    grpc::string service_name;
+    if (std::getline(ss, service_name, '/') &&
+        std::getline(ss, service_name, '/')) {
+      services_.push_back(service_name);
+    }
   }
   return true;
 }
@@ -598,4 +613,6 @@
   }
 }
 
+ServerInitializer* Server::initializer() { return server_initializer_.get(); }
+
 }  // namespace grpc
diff --git a/src/cpp/server/server_builder.cc b/src/cpp/server/server_builder.cc
index 68cc382..61f0f6a 100644
--- a/src/cpp/server/server_builder.cc
+++ b/src/cpp/server/server_builder.cc
@@ -41,9 +41,23 @@
 
 namespace grpc {
 
+static std::vector<std::unique_ptr<ServerBuilderPlugin> (*)()>*
+    g_plugin_factory_list;
+static gpr_once once_init_plugin_list = GPR_ONCE_INIT;
+
+static void do_plugin_list_init(void) {
+  g_plugin_factory_list =
+      new std::vector<std::unique_ptr<ServerBuilderPlugin> (*)()>();
+}
+
 ServerBuilder::ServerBuilder()
     : max_message_size_(-1), generic_service_(nullptr) {
   grpc_compression_options_init(&compression_options_);
+  gpr_once_init(&once_init_plugin_list, do_plugin_list_init);
+  for (auto factory : (*g_plugin_factory_list)) {
+    std::unique_ptr<ServerBuilderPlugin> plugin = factory();
+    plugins_[plugin->name()] = std::move(plugin);
+  }
 }
 
 std::unique_ptr<ServerCompletionQueue> ServerBuilder::AddCompletionQueue() {
@@ -96,14 +110,24 @@
   ChannelArguments args;
   for (auto option = options_.begin(); option != options_.end(); ++option) {
     (*option)->UpdateArguments(&args);
+    (*option)->UpdatePlugins(&plugins_);
+  }
+  if (thread_pool == nullptr) {
+    for (auto plugin = plugins_.begin(); plugin != plugins_.end(); plugin++) {
+      if ((*plugin).second->has_sync_methods()) {
+        thread_pool.reset(CreateDefaultThreadPool());
+        break;
+      }
+    }
   }
   if (max_message_size_ > 0) {
     args.SetInt(GRPC_ARG_MAX_MESSAGE_LENGTH, max_message_size_);
   }
-  args.SetInt(GRPC_COMPRESSION_ALGORITHM_STATE_ARG,
+  args.SetInt(GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET,
               compression_options_.enabled_algorithms_bitset);
   std::unique_ptr<Server> server(
       new Server(thread_pool.release(), true, max_message_size_, &args));
+  ServerInitializer* initializer = server->initializer();
   for (auto cq = cqs_.begin(); cq != cqs_.end(); ++cq) {
     grpc_server_register_completion_queue(server->server_, (*cq)->cq(),
                                           nullptr);
@@ -114,6 +138,9 @@
       return nullptr;
     }
   }
+  for (auto plugin = plugins_.begin(); plugin != plugins_.end(); plugin++) {
+    (*plugin).second->InitServer(initializer);
+  }
   if (generic_service_) {
     server->RegisterAsyncGenericService(generic_service_);
   } else {
@@ -137,7 +164,16 @@
   if (!server->Start(cqs_data, cqs_.size())) {
     return nullptr;
   }
+  for (auto plugin = plugins_.begin(); plugin != plugins_.end(); plugin++) {
+    (*plugin).second->Finish(initializer);
+  }
   return server;
 }
 
+void ServerBuilder::InternalAddPluginFactory(
+    std::unique_ptr<ServerBuilderPlugin> (*CreatePlugin)()) {
+  gpr_once_init(&once_init_plugin_list, do_plugin_list_init);
+  (*g_plugin_factory_list).push_back(CreatePlugin);
+}
+
 }  // namespace grpc
diff --git a/src/csharp/Grpc.Core.Tests/ChannelTest.cs b/src/csharp/Grpc.Core.Tests/ChannelTest.cs
index 6330f50..850d70c 100644
--- a/src/csharp/Grpc.Core.Tests/ChannelTest.cs
+++ b/src/csharp/Grpc.Core.Tests/ChannelTest.cs
@@ -32,6 +32,7 @@
 #endregion
 
 using System;
+using System.Threading.Tasks;
 using Grpc.Core;
 using Grpc.Core.Internal;
 using Grpc.Core.Utils;
@@ -89,5 +90,43 @@
             channel.ShutdownAsync().Wait();
             Assert.ThrowsAsync(typeof(InvalidOperationException), async () => await channel.ShutdownAsync());
         }
+
+        [Test]
+        public async Task ShutdownTokenCancelledAfterShutdown()
+        {
+            var channel = new Channel("localhost", ChannelCredentials.Insecure);
+            Assert.IsFalse(channel.ShutdownToken.IsCancellationRequested);
+            var shutdownTask = channel.ShutdownAsync();
+            Assert.IsTrue(channel.ShutdownToken.IsCancellationRequested);
+            await shutdownTask;
+        }
+
+        [Test]
+        public async Task StateIsFatalFailureAfterShutdown()
+        {
+            var channel = new Channel("localhost", ChannelCredentials.Insecure);
+            await channel.ShutdownAsync();
+            Assert.AreEqual(ChannelState.FatalFailure, channel.State);
+        }
+
+        [Test]
+        public async Task ShutdownFinishesWaitForStateChangedAsync()
+        {
+            var channel = new Channel("localhost", ChannelCredentials.Insecure);
+            var stateChangedTask = channel.WaitForStateChangedAsync(ChannelState.Idle);
+            var shutdownTask = channel.ShutdownAsync();
+            await stateChangedTask;
+            await shutdownTask;
+        }
+
+        [Test]
+        public async Task OperationsThrowAfterShutdown()
+        {
+            var channel = new Channel("localhost", ChannelCredentials.Insecure);
+            await channel.ShutdownAsync();
+            Assert.ThrowsAsync(typeof(ObjectDisposedException), async () => await channel.WaitForStateChangedAsync(ChannelState.Idle));
+            Assert.Throws(typeof(ObjectDisposedException), () => { var x = channel.ResolvedTarget; });
+            Assert.ThrowsAsync(typeof(TaskCanceledException), async () => await channel.ConnectAsync());
+        }
     }
 }
diff --git a/src/csharp/Grpc.Core.Tests/ClientServerTest.cs b/src/csharp/Grpc.Core.Tests/ClientServerTest.cs
index 6c13a4f..d92addb 100644
--- a/src/csharp/Grpc.Core.Tests/ClientServerTest.cs
+++ b/src/csharp/Grpc.Core.Tests/ClientServerTest.cs
@@ -167,6 +167,37 @@
         }
 
         [Test]
+        public async Task ServerStreamingCall_EndOfStreamIsIdempotent()
+        {
+            helper.ServerStreamingHandler = new ServerStreamingServerMethod<string, string>(async (request, responseStream, context) =>
+            {
+            });
+
+            var call = Calls.AsyncServerStreamingCall(helper.CreateServerStreamingCall(), "");
+
+            Assert.IsFalse(await call.ResponseStream.MoveNext());
+            Assert.IsFalse(await call.ResponseStream.MoveNext());
+        }
+
+        [Test]
+        public async Task ServerStreamingCall_ErrorCanBeAwaitedTwice()
+        {
+            helper.ServerStreamingHandler = new ServerStreamingServerMethod<string, string>(async (request, responseStream, context) =>
+            {
+                context.Status = new Status(StatusCode.InvalidArgument, "");
+            });
+
+            var call = Calls.AsyncServerStreamingCall(helper.CreateServerStreamingCall(), "");
+
+            var ex = Assert.ThrowsAsync<RpcException>(async () => await call.ResponseStream.MoveNext());
+            Assert.AreEqual(StatusCode.InvalidArgument, ex.Status.StatusCode);
+
+            // attempting MoveNext again should result in throwing the same exception.
+            var ex2 = Assert.ThrowsAsync<RpcException>(async () => await call.ResponseStream.MoveNext());
+            Assert.AreEqual(StatusCode.InvalidArgument, ex2.Status.StatusCode);
+        }
+
+        [Test]
         public async Task DuplexStreamingCall()
         {
             helper.DuplexStreamingHandler = new DuplexStreamingServerMethod<string, string>(async (requestStream, responseStream, context) =>
@@ -209,6 +240,38 @@
         }
 
         [Test]
+        public async Task ClientStreamingCall_ServerSideReadAfterCancelNotificationReturnsNull()
+        {
+            var handlerStartedBarrier = new TaskCompletionSource<object>();
+            var cancelNotificationReceivedBarrier = new TaskCompletionSource<object>();
+            var successTcs = new TaskCompletionSource<string>();
+
+            helper.ClientStreamingHandler = new ClientStreamingServerMethod<string, string>(async (requestStream, context) =>
+            {
+                handlerStartedBarrier.SetResult(null);
+
+                // wait for cancellation to be delivered.
+                context.CancellationToken.Register(() => cancelNotificationReceivedBarrier.SetResult(null));
+                await cancelNotificationReceivedBarrier.Task;
+
+                var moveNextResult = await requestStream.MoveNext();
+                successTcs.SetResult(!moveNextResult ? "SUCCESS" : "FAIL");
+                return "";
+            });
+
+            var cts = new CancellationTokenSource();
+            var call = Calls.AsyncClientStreamingCall(helper.CreateClientStreamingCall(new CallOptions(cancellationToken: cts.Token)));
+
+            await handlerStartedBarrier.Task;
+            cts.Cancel();
+
+            var ex = Assert.ThrowsAsync<RpcException>(async () => await call.ResponseAsync);
+            Assert.AreEqual(StatusCode.Cancelled, ex.Status.StatusCode);
+
+            Assert.AreEqual("SUCCESS", await successTcs.Task);
+        }
+
+        [Test]
         public async Task AsyncUnaryCall_EchoMetadata()
         {
             helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
diff --git a/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj b/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj
index 0cd059c..47131fc 100644
--- a/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj
+++ b/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj
@@ -84,6 +84,8 @@
     <Compile Include="SanityTest.cs" />
     <Compile Include="HalfcloseTest.cs" />
     <Compile Include="NUnitMain.cs" />
+    <Compile Include="Internal\FakeNativeCall.cs" />
+    <Compile Include="Internal\AsyncCallServerTest.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs
new file mode 100644
index 0000000..0e20476
--- /dev/null
+++ b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs
@@ -0,0 +1,191 @@
+#region Copyright notice and license
+
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using System.Threading.Tasks;
+
+using Grpc.Core.Internal;
+using NUnit.Framework;
+
+namespace Grpc.Core.Internal.Tests
+{
+    /// <summary>
+    /// Uses fake native call to test interaction of <c>AsyncCallServer</c> wrapping code with C core in different situations.
+    /// </summary>
+    public class AsyncCallServerTest
+    {
+        Server server;
+        FakeNativeCall fakeCall;
+        AsyncCallServer<string, string> asyncCallServer;
+
+        [SetUp]
+        public void Init()
+        {
+            var environment = GrpcEnvironment.AddRef();
+
+            // Create a fake server just so we have an instance to refer to.
+            // The server won't actually be used at all.
+            server = new Server()
+            {
+                Ports = { { "localhost", 0, ServerCredentials.Insecure } }
+            };
+            server.Start();
+
+            fakeCall = new FakeNativeCall();
+            asyncCallServer = new AsyncCallServer<string, string>(
+                Marshallers.StringMarshaller.Serializer, Marshallers.StringMarshaller.Deserializer,
+                environment,
+                server);
+            asyncCallServer.InitializeForTesting(fakeCall);
+        }
+
+        [TearDown]
+        public void Cleanup()
+        {
+            server.ShutdownAsync().Wait();
+            GrpcEnvironment.Release();
+        }
+
+        [Test]
+        public void CancelNotificationAfterStartDisposes()
+        {
+            var finishedTask = asyncCallServer.ServerSideCallAsync();
+            fakeCall.ReceivedCloseOnServerHandler(true, cancelled: true);
+            AssertFinished(asyncCallServer, fakeCall, finishedTask);
+        }
+
+        [Test]
+        public void CancelNotificationAfterStartDisposesAfterPendingReadFinishes()
+        {
+            var finishedTask = asyncCallServer.ServerSideCallAsync();
+            var requestStream = new ServerRequestStream<string, string>(asyncCallServer);
+
+            var moveNextTask = requestStream.MoveNext();
+
+            fakeCall.ReceivedCloseOnServerHandler(true, cancelled: true);
+            fakeCall.ReceivedMessageHandler(true, null);
+            Assert.IsFalse(moveNextTask.Result);
+
+            AssertFinished(asyncCallServer, fakeCall, finishedTask);
+        }
+
+        [Test]
+        public void ReadAfterCancelNotificationCanSucceed()
+        {
+            var finishedTask = asyncCallServer.ServerSideCallAsync();
+            var requestStream = new ServerRequestStream<string, string>(asyncCallServer);
+
+            fakeCall.ReceivedCloseOnServerHandler(true, cancelled: true);
+
+            // Check that starting a read after cancel notification has been processed is legal.
+            var moveNextTask = requestStream.MoveNext();
+            Assert.IsFalse(moveNextTask.Result);
+
+            AssertFinished(asyncCallServer, fakeCall, finishedTask);
+        }
+
+        [Test]
+        public void ReadCompletionFailureClosesRequestStream()
+        {
+            var finishedTask = asyncCallServer.ServerSideCallAsync();
+            var requestStream = new ServerRequestStream<string, string>(asyncCallServer);
+
+            // if a read completion's success==false, the request stream will silently finish
+            // and we rely on C core cancelling the call.
+            var moveNextTask = requestStream.MoveNext();
+            fakeCall.ReceivedMessageHandler(false, null);
+            Assert.IsFalse(moveNextTask.Result);
+
+            fakeCall.ReceivedCloseOnServerHandler(true, cancelled: true);
+            AssertFinished(asyncCallServer, fakeCall, finishedTask);
+        }
+
+        [Test]
+        public void WriteAfterCancelNotificationFails()
+        {
+            var finishedTask = asyncCallServer.ServerSideCallAsync();
+            var requestStream = new ServerRequestStream<string, string>(asyncCallServer);
+            var responseStream = new ServerResponseStream<string, string>(asyncCallServer);
+
+            fakeCall.ReceivedCloseOnServerHandler(true, cancelled: true);
+
+            // TODO(jtattermusch): should we throw a different exception type instead?
+            Assert.Throws(typeof(InvalidOperationException), () => responseStream.WriteAsync("request1"));
+            AssertFinished(asyncCallServer, fakeCall, finishedTask);
+        }
+
+        [Test]
+        public void WriteCompletionFailureThrows()
+        {
+            var finishedTask = asyncCallServer.ServerSideCallAsync();
+            var responseStream = new ServerResponseStream<string, string>(asyncCallServer);
+
+            var writeTask = responseStream.WriteAsync("request1");
+            fakeCall.SendCompletionHandler(false);
+            // TODO(jtattermusch): should we throw a different exception type instead?
+            Assert.ThrowsAsync(typeof(InvalidOperationException), async () => await writeTask);
+
+            fakeCall.ReceivedCloseOnServerHandler(true, cancelled: true);
+            AssertFinished(asyncCallServer, fakeCall, finishedTask);
+        }
+
+        [Test]
+        public void WriteAndWriteStatusCanRunConcurrently()
+        {
+            var finishedTask = asyncCallServer.ServerSideCallAsync();
+            var responseStream = new ServerResponseStream<string, string>(asyncCallServer);
+
+            var writeTask = responseStream.WriteAsync("request1");
+            var writeStatusTask = asyncCallServer.SendStatusFromServerAsync(Status.DefaultSuccess, new Metadata(), null);
+
+            fakeCall.SendCompletionHandler(true);
+            fakeCall.SendStatusFromServerHandler(true);
+
+            Assert.DoesNotThrowAsync(async () => await writeTask);
+            Assert.DoesNotThrowAsync(async () => await writeStatusTask);
+
+            fakeCall.ReceivedCloseOnServerHandler(true, cancelled: true);
+
+            AssertFinished(asyncCallServer, fakeCall, finishedTask);
+        }
+
+        static void AssertFinished(AsyncCallServer<string, string> asyncCallServer, FakeNativeCall fakeCall, Task finishedTask)
+        {
+            Assert.IsTrue(fakeCall.IsDisposed);
+            Assert.IsTrue(finishedTask.IsCompleted);
+            Assert.DoesNotThrow(() => finishedTask.Wait());
+        }
+    }
+}
diff --git a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs
index 60530d3..777a1c8 100644
--- a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs
+++ b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs
@@ -32,6 +32,7 @@
 #endregion
 
 using System;
+using System.Collections.Generic;
 using System.Runtime.InteropServices;
 using System.Threading.Tasks;
 
@@ -40,6 +41,9 @@
 
 namespace Grpc.Core.Internal.Tests
 {
+    /// <summary>
+    /// Uses fake native call to test interaction of <c>AsyncCall</c> wrapping code with C core in different situations.
+    /// </summary>
     public class AsyncCallTest
     {
         Channel channel;
@@ -64,159 +68,460 @@
         }
 
         [Test]
-        public void AsyncUnary_CompletionSuccess()
+        public void AsyncUnary_CanBeStartedOnlyOnce()
         {
-            var resultTask = asyncCall.UnaryCallAsync("abc");
-            fakeCall.UnaryResponseClientHandler(true, new ClientSideStatus(Status.DefaultSuccess, new Metadata()), new byte[] { 1, 2, 3 }, new Metadata());
-            Assert.IsTrue(resultTask.IsCompleted);
-            Assert.IsTrue(fakeCall.IsDisposed);
-            Assert.AreEqual(Status.DefaultSuccess, asyncCall.GetStatus());
+            asyncCall.UnaryCallAsync("request1");
+            Assert.Throws(typeof(InvalidOperationException),
+                () => asyncCall.UnaryCallAsync("abc"));
         }
 
         [Test]
-        public void AsyncUnary_CompletionFailure()
+        public void AsyncUnary_StreamingOperationsNotAllowed()
         {
-            var resultTask = asyncCall.UnaryCallAsync("abc");
-            fakeCall.UnaryResponseClientHandler(false, new ClientSideStatus(new Status(StatusCode.Internal, ""), null), new byte[] { 1, 2, 3 }, new Metadata());
+            asyncCall.UnaryCallAsync("request1");
+            Assert.ThrowsAsync(typeof(InvalidOperationException),
+                async () => await asyncCall.ReadMessageAsync());
+            Assert.Throws(typeof(InvalidOperationException),
+                () => asyncCall.StartSendMessage("abc", new WriteFlags(), (x,y) => {}));
+        }
 
+        [Test]
+        public void AsyncUnary_Success()
+        {
+            var resultTask = asyncCall.UnaryCallAsync("request1");
+            fakeCall.UnaryResponseClientHandler(true,
+                new ClientSideStatus(Status.DefaultSuccess, new Metadata()),
+                CreateResponsePayload(),
+                new Metadata());
+
+            AssertUnaryResponseSuccess(asyncCall, fakeCall, resultTask);
+        }
+
+        [Test]
+        public void AsyncUnary_NonSuccessStatusCode()
+        {
+            var resultTask = asyncCall.UnaryCallAsync("request1");
+            fakeCall.UnaryResponseClientHandler(true,
+                CreateClientSideStatus(StatusCode.InvalidArgument),
+                CreateResponsePayload(),
+                new Metadata());
+
+            AssertUnaryResponseError(asyncCall, fakeCall, resultTask, StatusCode.InvalidArgument);
+        }
+
+        [Test]
+        public void AsyncUnary_NullResponsePayload()
+        {
+            var resultTask = asyncCall.UnaryCallAsync("request1");
+            fakeCall.UnaryResponseClientHandler(true,
+                new ClientSideStatus(Status.DefaultSuccess, new Metadata()),
+                null,
+                new Metadata());
+
+            // failure to deserialize will result in InvalidArgument status.
+            AssertUnaryResponseError(asyncCall, fakeCall, resultTask, StatusCode.Internal);
+        }
+
+        [Test]
+        public void ClientStreaming_StreamingReadNotAllowed()
+        {
+            asyncCall.ClientStreamingCallAsync();
+            Assert.ThrowsAsync(typeof(InvalidOperationException),
+                async () => await asyncCall.ReadMessageAsync());
+        }
+
+        [Test]
+        public void ClientStreaming_NoRequest_Success()
+        {
+            var resultTask = asyncCall.ClientStreamingCallAsync();
+            fakeCall.UnaryResponseClientHandler(true,
+                new ClientSideStatus(Status.DefaultSuccess, new Metadata()),
+                CreateResponsePayload(),
+                new Metadata());
+
+            AssertUnaryResponseSuccess(asyncCall, fakeCall, resultTask);
+        }
+
+        [Test]
+        public void ClientStreaming_NoRequest_NonSuccessStatusCode()
+        {
+            var resultTask = asyncCall.ClientStreamingCallAsync();
+            fakeCall.UnaryResponseClientHandler(true,
+                CreateClientSideStatus(StatusCode.InvalidArgument),
+                CreateResponsePayload(),
+                new Metadata());
+
+            AssertUnaryResponseError(asyncCall, fakeCall, resultTask, StatusCode.InvalidArgument);
+        }
+
+        [Test]
+        public void ClientStreaming_MoreRequests_Success()
+        {
+            var resultTask = asyncCall.ClientStreamingCallAsync();
+            var requestStream = new ClientRequestStream<string, string>(asyncCall);
+
+            var writeTask = requestStream.WriteAsync("request1");
+            fakeCall.SendCompletionHandler(true);
+            writeTask.Wait();
+
+            var writeTask2 = requestStream.WriteAsync("request2");
+            fakeCall.SendCompletionHandler(true);
+            writeTask2.Wait();
+
+            var completeTask = requestStream.CompleteAsync();
+            fakeCall.SendCompletionHandler(true);
+            completeTask.Wait();
+
+            fakeCall.UnaryResponseClientHandler(true,
+                new ClientSideStatus(Status.DefaultSuccess, new Metadata()),
+                CreateResponsePayload(),
+                new Metadata());
+
+            AssertUnaryResponseSuccess(asyncCall, fakeCall, resultTask);
+        }
+
+        [Test]
+        public void ClientStreaming_WriteCompletionFailure()
+        {
+            var resultTask = asyncCall.ClientStreamingCallAsync();
+            var requestStream = new ClientRequestStream<string, string>(asyncCall);
+
+            var writeTask = requestStream.WriteAsync("request1");
+            fakeCall.SendCompletionHandler(false);
+            // TODO: maybe IOException or waiting for RPCException is more appropriate here.
+            Assert.ThrowsAsync(typeof(InvalidOperationException), async () => await writeTask);
+
+            fakeCall.UnaryResponseClientHandler(true,
+                CreateClientSideStatus(StatusCode.Internal),
+                CreateResponsePayload(),
+                new Metadata());
+
+            AssertUnaryResponseError(asyncCall, fakeCall, resultTask, StatusCode.Internal);
+        }
+
+        [Test]
+        public void ClientStreaming_WriteAfterReceivingStatusThrowsRpcException()
+        {
+            var resultTask = asyncCall.ClientStreamingCallAsync();
+            var requestStream = new ClientRequestStream<string, string>(asyncCall);
+
+            fakeCall.UnaryResponseClientHandler(true,
+                new ClientSideStatus(Status.DefaultSuccess, new Metadata()),
+                CreateResponsePayload(),
+                new Metadata());
+
+            AssertUnaryResponseSuccess(asyncCall, fakeCall, resultTask);
+            var ex = Assert.Throws<RpcException>(() => requestStream.WriteAsync("request1"));
+            Assert.AreEqual(Status.DefaultSuccess, ex.Status);
+        }
+
+        [Test]
+        public void ClientStreaming_WriteAfterReceivingStatusThrowsRpcException2()
+        {
+            var resultTask = asyncCall.ClientStreamingCallAsync();
+            var requestStream = new ClientRequestStream<string, string>(asyncCall);
+
+            fakeCall.UnaryResponseClientHandler(true,
+                new ClientSideStatus(new Status(StatusCode.OutOfRange, ""), new Metadata()),
+                CreateResponsePayload(),
+                new Metadata());
+
+            AssertUnaryResponseError(asyncCall, fakeCall, resultTask, StatusCode.OutOfRange);
+            var ex = Assert.Throws<RpcException>(() => requestStream.WriteAsync("request1"));
+            Assert.AreEqual(StatusCode.OutOfRange, ex.Status.StatusCode);
+        }
+
+        [Test]
+        public void ClientStreaming_WriteAfterCompleteThrowsInvalidOperationException()
+        {
+            var resultTask = asyncCall.ClientStreamingCallAsync();
+            var requestStream = new ClientRequestStream<string, string>(asyncCall);
+
+            requestStream.CompleteAsync();
+
+            Assert.Throws(typeof(InvalidOperationException), () => requestStream.WriteAsync("request1"));
+
+            fakeCall.SendCompletionHandler(true);
+
+            fakeCall.UnaryResponseClientHandler(true,
+                new ClientSideStatus(Status.DefaultSuccess, new Metadata()),
+                CreateResponsePayload(),
+                new Metadata());
+
+            AssertUnaryResponseSuccess(asyncCall, fakeCall, resultTask);
+        }
+
+        [Test]
+        public void ClientStreaming_CompleteAfterReceivingStatusSucceeds()
+        {
+            var resultTask = asyncCall.ClientStreamingCallAsync();
+            var requestStream = new ClientRequestStream<string, string>(asyncCall);
+
+            fakeCall.UnaryResponseClientHandler(true,
+                new ClientSideStatus(Status.DefaultSuccess, new Metadata()),
+                CreateResponsePayload(),
+                new Metadata());
+
+            AssertUnaryResponseSuccess(asyncCall, fakeCall, resultTask);
+            Assert.DoesNotThrowAsync(async () => await requestStream.CompleteAsync());
+        }
+
+        [Test]
+        public void ClientStreaming_WriteAfterCancellationRequestThrowsOperationCancelledException()
+        {
+            var resultTask = asyncCall.ClientStreamingCallAsync();
+            var requestStream = new ClientRequestStream<string, string>(asyncCall);
+
+            asyncCall.Cancel();
+            Assert.IsTrue(fakeCall.IsCancelled);
+
+            Assert.Throws(typeof(OperationCanceledException), () => requestStream.WriteAsync("request1"));
+
+            fakeCall.UnaryResponseClientHandler(true,
+                CreateClientSideStatus(StatusCode.Cancelled),
+                CreateResponsePayload(),
+                new Metadata());
+
+            AssertUnaryResponseError(asyncCall, fakeCall, resultTask, StatusCode.Cancelled);
+        }
+
+        [Test]
+        public void ServerStreaming_StreamingSendNotAllowed()
+        {
+            asyncCall.StartServerStreamingCall("request1");
+            Assert.Throws(typeof(InvalidOperationException),
+                () => asyncCall.StartSendMessage("abc", new WriteFlags(), (x,y) => {}));
+        }
+
+        [Test]
+        public void ServerStreaming_NoResponse_Success1()
+        {
+            asyncCall.StartServerStreamingCall("request1");
+            var responseStream = new ClientResponseStream<string, string>(asyncCall);
+            var readTask = responseStream.MoveNext();
+
+            fakeCall.ReceivedResponseHeadersHandler(true, new Metadata());
+            Assert.AreEqual(0, asyncCall.ResponseHeadersAsync.Result.Count);
+
+            fakeCall.ReceivedMessageHandler(true, null);
+            fakeCall.ReceivedStatusOnClientHandler(true, new ClientSideStatus(Status.DefaultSuccess, new Metadata()));
+
+            AssertStreamingResponseSuccess(asyncCall, fakeCall, readTask);
+        }
+
+        [Test]
+        public void ServerStreaming_NoResponse_Success2()
+        {
+            asyncCall.StartServerStreamingCall("request1");
+            var responseStream = new ClientResponseStream<string, string>(asyncCall);
+            var readTask = responseStream.MoveNext();
+
+            // try alternative order of completions
+            fakeCall.ReceivedStatusOnClientHandler(true, new ClientSideStatus(Status.DefaultSuccess, new Metadata()));
+            fakeCall.ReceivedMessageHandler(true, null);
+
+            AssertStreamingResponseSuccess(asyncCall, fakeCall, readTask);
+        }
+
+        [Test]
+        public void ServerStreaming_NoResponse_ReadFailure()
+        {
+            asyncCall.StartServerStreamingCall("request1");
+            var responseStream = new ClientResponseStream<string, string>(asyncCall);
+            var readTask = responseStream.MoveNext();
+
+            fakeCall.ReceivedMessageHandler(false, null);  // after a failed read, we rely on C core to deliver appropriate status code.
+            fakeCall.ReceivedStatusOnClientHandler(true, CreateClientSideStatus(StatusCode.Internal));
+
+            AssertStreamingResponseError(asyncCall, fakeCall, readTask, StatusCode.Internal);
+        }
+
+        [Test]
+        public void ServerStreaming_MoreResponses_Success()
+        {
+            asyncCall.StartServerStreamingCall("request1");
+            var responseStream = new ClientResponseStream<string, string>(asyncCall);
+
+            var readTask1 = responseStream.MoveNext();
+            fakeCall.ReceivedMessageHandler(true, CreateResponsePayload());
+            Assert.IsTrue(readTask1.Result);
+            Assert.AreEqual("response1", responseStream.Current);
+
+            var readTask2 = responseStream.MoveNext();
+            fakeCall.ReceivedMessageHandler(true, CreateResponsePayload());
+            Assert.IsTrue(readTask2.Result);
+            Assert.AreEqual("response1", responseStream.Current);
+
+            var readTask3 = responseStream.MoveNext();
+            fakeCall.ReceivedStatusOnClientHandler(true, new ClientSideStatus(Status.DefaultSuccess, new Metadata()));
+            fakeCall.ReceivedMessageHandler(true, null);
+
+            AssertStreamingResponseSuccess(asyncCall, fakeCall, readTask3);
+        }
+
+        [Test]
+        public void DuplexStreaming_NoRequestNoResponse_Success()
+        {
+            asyncCall.StartDuplexStreamingCall();
+            var requestStream = new ClientRequestStream<string, string>(asyncCall);
+            var responseStream = new ClientResponseStream<string, string>(asyncCall);
+
+            var writeTask1 = requestStream.CompleteAsync();
+            fakeCall.SendCompletionHandler(true);
+            Assert.DoesNotThrowAsync(async () => await writeTask1);
+
+            var readTask = responseStream.MoveNext();
+            fakeCall.ReceivedMessageHandler(true, null);
+            fakeCall.ReceivedStatusOnClientHandler(true, new ClientSideStatus(Status.DefaultSuccess, new Metadata()));
+
+            AssertStreamingResponseSuccess(asyncCall, fakeCall, readTask);
+        }
+
+        [Test]
+        public void DuplexStreaming_WriteAfterReceivingStatusThrowsRpcException()
+        {
+            asyncCall.StartDuplexStreamingCall();
+            var requestStream = new ClientRequestStream<string, string>(asyncCall);
+            var responseStream = new ClientResponseStream<string, string>(asyncCall);
+
+            var readTask = responseStream.MoveNext();
+            fakeCall.ReceivedMessageHandler(true, null);
+            fakeCall.ReceivedStatusOnClientHandler(true, new ClientSideStatus(Status.DefaultSuccess, new Metadata()));
+
+            AssertStreamingResponseSuccess(asyncCall, fakeCall, readTask);
+
+            var ex = Assert.ThrowsAsync<RpcException>(async () => await requestStream.WriteAsync("request1"));
+            Assert.AreEqual(Status.DefaultSuccess, ex.Status);
+        }
+
+        [Test]
+        public void DuplexStreaming_CompleteAfterReceivingStatusFails()
+        {
+            asyncCall.StartDuplexStreamingCall();
+            var requestStream = new ClientRequestStream<string, string>(asyncCall);
+            var responseStream = new ClientResponseStream<string, string>(asyncCall);
+
+            var readTask = responseStream.MoveNext();
+            fakeCall.ReceivedMessageHandler(true, null);
+            fakeCall.ReceivedStatusOnClientHandler(true, new ClientSideStatus(Status.DefaultSuccess, new Metadata()));
+
+            AssertStreamingResponseSuccess(asyncCall, fakeCall, readTask);
+
+            Assert.DoesNotThrowAsync(async () => await requestStream.CompleteAsync());
+        }
+
+        [Test]
+        public void DuplexStreaming_WriteAfterCancellationRequestThrowsOperationCancelledException()
+        {
+            asyncCall.StartDuplexStreamingCall();
+            var requestStream = new ClientRequestStream<string, string>(asyncCall);
+            var responseStream = new ClientResponseStream<string, string>(asyncCall);
+
+            asyncCall.Cancel();
+            Assert.IsTrue(fakeCall.IsCancelled);
+            Assert.Throws(typeof(OperationCanceledException), () => requestStream.WriteAsync("request1"));
+
+            var readTask = responseStream.MoveNext();
+            fakeCall.ReceivedMessageHandler(true, null);
+            fakeCall.ReceivedStatusOnClientHandler(true, CreateClientSideStatus(StatusCode.Cancelled));
+
+            AssertStreamingResponseError(asyncCall, fakeCall, readTask, StatusCode.Cancelled);
+        }
+
+        [Test]
+        public void DuplexStreaming_ReadAfterCancellationRequestCanSucceed()
+        {
+            asyncCall.StartDuplexStreamingCall();
+            var responseStream = new ClientResponseStream<string, string>(asyncCall);
+
+            asyncCall.Cancel();
+            Assert.IsTrue(fakeCall.IsCancelled);
+
+            var readTask1 = responseStream.MoveNext();
+            fakeCall.ReceivedMessageHandler(true, CreateResponsePayload());
+            Assert.IsTrue(readTask1.Result);
+            Assert.AreEqual("response1", responseStream.Current);
+
+            var readTask2 = responseStream.MoveNext();
+            fakeCall.ReceivedMessageHandler(true, null);
+            fakeCall.ReceivedStatusOnClientHandler(true, CreateClientSideStatus(StatusCode.Cancelled));
+
+            AssertStreamingResponseError(asyncCall, fakeCall, readTask2, StatusCode.Cancelled);
+        }
+
+        [Test]
+        public void DuplexStreaming_ReadStartedBeforeCancellationRequestCanSucceed()
+        {
+            asyncCall.StartDuplexStreamingCall();
+            var responseStream = new ClientResponseStream<string, string>(asyncCall);
+
+            var readTask1 = responseStream.MoveNext();  // initiate the read before cancel request
+            asyncCall.Cancel();
+            Assert.IsTrue(fakeCall.IsCancelled);
+
+            fakeCall.ReceivedMessageHandler(true, CreateResponsePayload());
+            Assert.IsTrue(readTask1.Result);
+            Assert.AreEqual("response1", responseStream.Current);
+
+            var readTask2 = responseStream.MoveNext();
+            fakeCall.ReceivedMessageHandler(true, null);
+            fakeCall.ReceivedStatusOnClientHandler(true, CreateClientSideStatus(StatusCode.Cancelled));
+
+            AssertStreamingResponseError(asyncCall, fakeCall, readTask2, StatusCode.Cancelled);
+        }
+
+        ClientSideStatus CreateClientSideStatus(StatusCode statusCode)
+        {
+            return new ClientSideStatus(new Status(statusCode, ""), new Metadata());
+        }
+
+        byte[] CreateResponsePayload()
+        {
+            return Marshallers.StringMarshaller.Serializer("response1");
+        }
+
+        static void AssertUnaryResponseSuccess(AsyncCall<string, string> asyncCall, FakeNativeCall fakeCall, Task<string> resultTask)
+        {
             Assert.IsTrue(resultTask.IsCompleted);
             Assert.IsTrue(fakeCall.IsDisposed);
 
-            Assert.AreEqual(StatusCode.Internal, asyncCall.GetStatus().StatusCode);
-            Assert.IsNull(asyncCall.GetTrailers());
-            var ex = Assert.ThrowsAsync<RpcException>(async () => await resultTask);
-            Assert.AreEqual(StatusCode.Internal, ex.Status.StatusCode);
+            Assert.AreEqual(Status.DefaultSuccess, asyncCall.GetStatus());
+            Assert.AreEqual(0, asyncCall.ResponseHeadersAsync.Result.Count);
+            Assert.AreEqual(0, asyncCall.GetTrailers().Count);
+            Assert.AreEqual("response1", resultTask.Result);
         }
 
-        internal class FakeNativeCall : INativeCall
+        static void AssertStreamingResponseSuccess(AsyncCall<string, string> asyncCall, FakeNativeCall fakeCall, Task<bool> moveNextTask)
         {
-            public UnaryResponseClientHandler UnaryResponseClientHandler
-            {
-                get;
-                set;
-            }
+            Assert.IsTrue(moveNextTask.IsCompleted);
+            Assert.IsTrue(fakeCall.IsDisposed);
 
-            public ReceivedStatusOnClientHandler ReceivedStatusOnClientHandler
-            {
-                get;
-                set;
-            }
+            Assert.IsFalse(moveNextTask.Result);
+            Assert.AreEqual(Status.DefaultSuccess, asyncCall.GetStatus());
+            Assert.AreEqual(0, asyncCall.GetTrailers().Count);
+        }
 
-            public ReceivedMessageHandler ReceivedMessageHandler
-            {
-                get;
-                set;
-            }
+        static void AssertUnaryResponseError(AsyncCall<string, string> asyncCall, FakeNativeCall fakeCall, Task<string> resultTask, StatusCode expectedStatusCode)
+        {
+            Assert.IsTrue(resultTask.IsCompleted);
+            Assert.IsTrue(fakeCall.IsDisposed);
 
-            public ReceivedResponseHeadersHandler ReceivedResponseHeadersHandler
-            {
-                get;
-                set;
-            }
+            Assert.AreEqual(expectedStatusCode, asyncCall.GetStatus().StatusCode);
+            var ex = Assert.ThrowsAsync<RpcException>(async () => await resultTask);
+            Assert.AreEqual(expectedStatusCode, ex.Status.StatusCode);
+            Assert.AreEqual(0, asyncCall.ResponseHeadersAsync.Result.Count);
+            Assert.AreEqual(0, asyncCall.GetTrailers().Count);
+        }
 
-            public SendCompletionHandler SendCompletionHandler
-            {
-                get;
-                set;
-            }
+        static void AssertStreamingResponseError(AsyncCall<string, string> asyncCall, FakeNativeCall fakeCall, Task<bool> moveNextTask, StatusCode expectedStatusCode)
+        {
+            Assert.IsTrue(moveNextTask.IsCompleted);
+            Assert.IsTrue(fakeCall.IsDisposed);
 
-            public ReceivedCloseOnServerHandler ReceivedCloseOnServerHandler
-            {
-                get;
-                set;
-            }
-
-            public bool IsCancelled
-            {
-                get;
-                set;
-            }
-
-            public bool IsDisposed
-            {
-                get;
-                set;
-            }
-
-            public void Cancel()
-            {
-                IsCancelled = true;
-            }
-
-            public void CancelWithStatus(Status status)
-            {
-                IsCancelled = true;
-            }
-
-            public string GetPeer()
-            {
-                return "PEER";
-            }
-
-            public void StartUnary(UnaryResponseClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags)
-            {
-                UnaryResponseClientHandler = callback;
-            }
-
-            public void StartUnary(BatchContextSafeHandle ctx, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags)
-            {
-                throw new NotImplementedException();
-            }
-
-            public void StartClientStreaming(UnaryResponseClientHandler callback, MetadataArraySafeHandle metadataArray)
-            {
-                UnaryResponseClientHandler = callback;
-            }
-
-            public void StartServerStreaming(ReceivedStatusOnClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags)
-            {
-                ReceivedStatusOnClientHandler = callback;
-            }
-
-            public void StartDuplexStreaming(ReceivedStatusOnClientHandler callback, MetadataArraySafeHandle metadataArray)
-            {
-                ReceivedStatusOnClientHandler = callback;
-            }
-
-            public void StartReceiveMessage(ReceivedMessageHandler callback)
-            {
-                ReceivedMessageHandler = callback;
-            }
-
-            public void StartReceiveInitialMetadata(ReceivedResponseHeadersHandler callback)
-            {
-                ReceivedResponseHeadersHandler = callback;
-            }
-
-            public void StartSendInitialMetadata(SendCompletionHandler callback, MetadataArraySafeHandle metadataArray)
-            {
-                SendCompletionHandler = callback;
-            }
-
-            public void StartSendMessage(SendCompletionHandler callback, byte[] payload, WriteFlags writeFlags, bool sendEmptyInitialMetadata)
-            {
-                SendCompletionHandler = callback;
-            }
-
-            public void StartSendCloseFromClient(SendCompletionHandler callback)
-            {
-                SendCompletionHandler = callback;
-            }
-
-            public void StartSendStatusFromServer(SendCompletionHandler callback, Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata)
-            {
-                SendCompletionHandler = callback;
-            }
-
-            public void StartServerSide(ReceivedCloseOnServerHandler callback)
-            {
-                ReceivedCloseOnServerHandler = callback;
-            }
-
-            public void Dispose()
-            {
-                IsDisposed = true;
-            }
+            var ex = Assert.ThrowsAsync<RpcException>(async () => await moveNextTask);
+            Assert.AreEqual(expectedStatusCode, ex.Status.StatusCode);
+            Assert.AreEqual(expectedStatusCode, asyncCall.GetStatus().StatusCode);
+            Assert.AreEqual(0, asyncCall.GetTrailers().Count);
         }
     }
 }
diff --git a/src/csharp/Grpc.Core.Tests/Internal/FakeNativeCall.cs b/src/csharp/Grpc.Core.Tests/Internal/FakeNativeCall.cs
new file mode 100644
index 0000000..909112a
--- /dev/null
+++ b/src/csharp/Grpc.Core.Tests/Internal/FakeNativeCall.cs
@@ -0,0 +1,184 @@
+#region Copyright notice and license
+
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using System.Threading.Tasks;
+
+using Grpc.Core.Internal;
+using NUnit.Framework;
+
+namespace Grpc.Core.Internal.Tests
+{
+    /// <summary>
+    /// For testing purposes.
+    /// </summary>
+    internal class FakeNativeCall : INativeCall
+    {
+        public UnaryResponseClientHandler UnaryResponseClientHandler
+        {
+            get;
+            set;
+        }
+
+        public ReceivedStatusOnClientHandler ReceivedStatusOnClientHandler
+        {
+            get;
+            set;
+        }
+
+        public ReceivedMessageHandler ReceivedMessageHandler
+        {
+            get;
+            set;
+        }
+
+        public ReceivedResponseHeadersHandler ReceivedResponseHeadersHandler
+        {
+            get;
+            set;
+        }
+
+        public SendCompletionHandler SendCompletionHandler
+        {
+            get;
+            set;
+        }
+
+        public SendCompletionHandler SendStatusFromServerHandler
+        {
+            get;
+            set;
+        }
+
+        public ReceivedCloseOnServerHandler ReceivedCloseOnServerHandler
+        {
+            get;
+            set;
+        }
+
+        public bool IsCancelled
+        {
+            get;
+            set;
+        }
+
+        public bool IsDisposed
+        {
+            get;
+            set;
+        }
+
+        public void Cancel()
+        {
+            IsCancelled = true;
+        }
+
+        public void CancelWithStatus(Status status)
+        {
+            IsCancelled = true;
+        }
+
+        public string GetPeer()
+        {
+            return "PEER";
+        }
+
+        public void StartUnary(UnaryResponseClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags)
+        {
+            UnaryResponseClientHandler = callback;
+        }
+
+        public void StartUnary(BatchContextSafeHandle ctx, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags)
+        {
+            throw new NotImplementedException();
+        }
+
+        public void StartClientStreaming(UnaryResponseClientHandler callback, MetadataArraySafeHandle metadataArray)
+        {
+            UnaryResponseClientHandler = callback;
+        }
+
+        public void StartServerStreaming(ReceivedStatusOnClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags)
+        {
+            ReceivedStatusOnClientHandler = callback;
+        }
+
+        public void StartDuplexStreaming(ReceivedStatusOnClientHandler callback, MetadataArraySafeHandle metadataArray)
+        {
+            ReceivedStatusOnClientHandler = callback;
+        }
+
+        public void StartReceiveMessage(ReceivedMessageHandler callback)
+        {
+            ReceivedMessageHandler = callback;
+        }
+
+        public void StartReceiveInitialMetadata(ReceivedResponseHeadersHandler callback)
+        {
+            ReceivedResponseHeadersHandler = callback;
+        }
+
+        public void StartSendInitialMetadata(SendCompletionHandler callback, MetadataArraySafeHandle metadataArray)
+        {
+            SendCompletionHandler = callback;
+        }
+
+        public void StartSendMessage(SendCompletionHandler callback, byte[] payload, WriteFlags writeFlags, bool sendEmptyInitialMetadata)
+        {
+            SendCompletionHandler = callback;
+        }
+
+        public void StartSendCloseFromClient(SendCompletionHandler callback)
+        {
+            SendCompletionHandler = callback;
+        }
+
+        public void StartSendStatusFromServer(SendCompletionHandler callback, Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata,
+            byte[] optionalPayload, WriteFlags writeFlags)
+        {
+            SendStatusFromServerHandler = callback;
+        }
+
+        public void StartServerSide(ReceivedCloseOnServerHandler callback)
+        {
+            ReceivedCloseOnServerHandler = callback;
+        }
+
+        public void Dispose()
+        {
+            IsDisposed = true;
+        }
+    }
+}
diff --git a/src/csharp/Grpc.Core/Channel.cs b/src/csharp/Grpc.Core/Channel.cs
index 89981b1..93a6e6a 100644
--- a/src/csharp/Grpc.Core/Channel.cs
+++ b/src/csharp/Grpc.Core/Channel.cs
@@ -32,6 +32,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 
 using Grpc.Core.Internal;
@@ -51,6 +52,7 @@
 
         readonly object myLock = new object();
         readonly AtomicCounter activeCallCounter = new AtomicCounter();
+        readonly CancellationTokenSource shutdownTokenSource = new CancellationTokenSource();
 
         readonly string target;
         readonly GrpcEnvironment environment;
@@ -101,12 +103,13 @@
 
         /// <summary>
         /// Gets current connectivity state of this channel.
+        /// After channel is has been shutdown, <c>ChannelState.FatalFailure</c> will be returned.
         /// </summary>
         public ChannelState State
         {
             get
             {
-                return handle.CheckConnectivityState(false);        
+                return GetConnectivityState(false);
             }
         }
 
@@ -155,6 +158,17 @@
         }
 
         /// <summary>
+        /// Returns a token that gets cancelled once <c>ShutdownAsync</c> is invoked.
+        /// </summary>
+        public CancellationToken ShutdownToken
+        {
+            get
+            {
+                return this.shutdownTokenSource.Token;
+            }
+        }
+
+        /// <summary>
         /// Allows explicitly requesting channel to connect without starting an RPC.
         /// Returned task completes once state Ready was seen. If the deadline is reached,
         /// or channel enters the FatalFailure state, the task is cancelled.
@@ -164,7 +178,7 @@
         /// <param name="deadline">The deadline. <c>null</c> indicates no deadline.</param>
         public async Task ConnectAsync(DateTime? deadline = null)
         {
-            var currentState = handle.CheckConnectivityState(true);
+            var currentState = GetConnectivityState(true);
             while (currentState != ChannelState.Ready)
             {
                 if (currentState == ChannelState.FatalFailure)
@@ -172,7 +186,7 @@
                     throw new OperationCanceledException("Channel has reached FatalFailure state.");
                 }
                 await WaitForStateChangedAsync(currentState, deadline).ConfigureAwait(false);
-                currentState = handle.CheckConnectivityState(false);
+                currentState = GetConnectivityState(false);
             }
         }
 
@@ -188,6 +202,8 @@
                 shutdownRequested = true;
             }
 
+            shutdownTokenSource.Cancel();
+
             var activeCallCount = activeCallCounter.Count;
             if (activeCallCount > 0)
             {
@@ -231,6 +247,18 @@
             activeCallCounter.Decrement();
         }
 
+        private ChannelState GetConnectivityState(bool tryToConnect)
+        {
+            try
+            {
+                return handle.CheckConnectivityState(tryToConnect);
+            }
+            catch (ObjectDisposedException)
+            {
+                return ChannelState.FatalFailure;
+            }
+        }
+
         private static void EnsureUserAgentChannelOption(Dictionary<string, ChannelOption> options)
         {
             var key = ChannelOptions.PrimaryUserAgentString;
diff --git a/src/csharp/Grpc.Core/GrpcEnvironment.cs b/src/csharp/Grpc.Core/GrpcEnvironment.cs
index a5c78cc..bee0ef1 100644
--- a/src/csharp/Grpc.Core/GrpcEnvironment.cs
+++ b/src/csharp/Grpc.Core/GrpcEnvironment.cs
@@ -45,11 +45,12 @@
     /// </summary>
     public class GrpcEnvironment
     {
-        const int THREAD_POOL_SIZE = 4;
+        const int MinDefaultThreadPoolSize = 4;
 
         static object staticLock = new object();
         static GrpcEnvironment instance;
         static int refCount;
+        static int? customThreadPoolSize;
 
         static ILogger logger = new ConsoleLogger();
 
@@ -123,13 +124,30 @@
         }
 
         /// <summary>
+        /// Sets the number of threads in the gRPC thread pool that polls for internal RPC events.
+        /// Can be only invoke before the <c>GrpcEnviroment</c> is started and cannot be changed afterwards.
+        /// Setting thread pool size is an advanced setting and you should only use it if you know what you are doing.
+        /// Most users should rely on the default value provided by gRPC library.
+        /// Note: this method is part of an experimental API that can change or be removed without any prior notice.
+        /// </summary>
+        public static void SetThreadPoolSize(int threadCount)
+        {
+            lock (staticLock)
+            {
+                GrpcPreconditions.CheckState(instance == null, "Can only be set before GrpcEnvironment is initialized");
+                GrpcPreconditions.CheckArgument(threadCount > 0, "threadCount needs to be a positive number");
+                customThreadPoolSize = threadCount;
+            }
+        }
+
+        /// <summary>
         /// Creates gRPC environment.
         /// </summary>
         private GrpcEnvironment()
         {
             GrpcNativeInit();
             completionRegistry = new CompletionRegistry(this);
-            threadPool = new GrpcThreadPool(this, THREAD_POOL_SIZE);
+            threadPool = new GrpcThreadPool(this, GetThreadPoolSizeOrDefault());
             threadPool.Start();
         }
 
@@ -200,5 +218,17 @@
 
             debugStats.CheckOK();
         }
+
+        private int GetThreadPoolSizeOrDefault()
+        {
+            if (customThreadPoolSize.HasValue)
+            {
+                return customThreadPoolSize.Value;
+            }
+            // In systems with many cores, use half of the cores for GrpcThreadPool
+            // and the other half for .NET thread pool. This heuristic definitely needs
+            // more work, but seems to work reasonably well for a start.
+            return Math.Max(MinDefaultThreadPoolSize, Environment.ProcessorCount / 2);
+        }
     }
 }
diff --git a/src/csharp/Grpc.Core/Internal/AsyncCall.cs b/src/csharp/Grpc.Core/Internal/AsyncCall.cs
index 016e1b8..5535186 100644
--- a/src/csharp/Grpc.Core/Internal/AsyncCall.cs
+++ b/src/csharp/Grpc.Core/Internal/AsyncCall.cs
@@ -57,7 +57,7 @@
         // Completion of a pending unary response if not null.
         TaskCompletionSource<TResponse> unaryResponseTcs;
 
-        // Indicates that steaming call has finished.
+        // Indicates that response streaming call has finished.
         TaskCompletionSource<object> streamingCallFinishedTcs = new TaskCompletionSource<object>();
 
         // Response headers set here once received.
@@ -241,11 +241,10 @@
 
         /// <summary>
         /// Receives a streaming response. Only one pending read action is allowed at any given time.
-        /// completionDelegate is called when the operation finishes.
         /// </summary>
-        public void StartReadMessage(AsyncCompletionDelegate<TResponse> completionDelegate)
+        public Task<TResponse> ReadMessageAsync()
         {
-            StartReadMessageInternal(completionDelegate);
+            return ReadMessageInternalAsync();
         }
 
         /// <summary>
@@ -409,10 +408,13 @@
         /// </summary>
         private void HandleUnaryResponse(bool success, ClientSideStatus receivedStatus, byte[] receivedMessage, Metadata responseHeaders)
         {
+            // NOTE: because this event is a result of batch containing GRPC_OP_RECV_STATUS_ON_CLIENT,
+            // success will be always set to true.
+
             using (Profilers.ForCurrentThread().NewScope("AsyncCall.HandleUnaryResponse"))
             {
                 TResponse msg = default(TResponse);
-                var deserializeException = success ? TryDeserialize(receivedMessage, out msg) : null;
+                var deserializeException = TryDeserialize(receivedMessage, out msg);
 
                 lock (myLock)
                 {
@@ -425,14 +427,13 @@
                     finishedStatus = receivedStatus;
 
                     ReleaseResourcesIfPossible();
-
                 }
 
                 responseHeadersTcs.SetResult(responseHeaders);
 
                 var status = receivedStatus.Status;
 
-                if (!success || status.StatusCode != StatusCode.OK)
+                if (status.StatusCode != StatusCode.OK)
                 {
                     unaryResponseTcs.SetException(new RpcException(status));
                     return;
@@ -442,11 +443,27 @@
             }
         }
 
+        protected override void CheckSendingAllowed(bool allowFinished)
+        {
+            base.CheckSendingAllowed(true);
+
+            // throwing RpcException if we already received status on client
+            // side makes the most sense.
+            // Note that this throws even for StatusCode.OK.
+            if (!allowFinished && finishedStatus.HasValue)
+            {
+                throw new RpcException(finishedStatus.Value.Status);
+            }
+        }
+
         /// <summary>
         /// Handles receive status completion for calls with streaming response.
         /// </summary>
         private void HandleFinished(bool success, ClientSideStatus receivedStatus)
         {
+            // NOTE: because this event is a result of batch containing GRPC_OP_RECV_STATUS_ON_CLIENT,
+            // success will be always set to true.
+
             lock (myLock)
             {
                 finished = true;
@@ -457,7 +474,7 @@
 
             var status = receivedStatus.Status;
 
-            if (!success || status.StatusCode != StatusCode.OK)
+            if (status.StatusCode != StatusCode.OK)
             {
                 streamingCallFinishedTcs.SetException(new RpcException(status));
                 return;
diff --git a/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs b/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs
index ccd047f..4de2370 100644
--- a/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs
+++ b/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs
@@ -68,7 +68,8 @@
         protected bool cancelRequested;
 
         protected AsyncCompletionDelegate<object> sendCompletionDelegate;  // Completion of a pending send or sendclose if not null.
-        protected AsyncCompletionDelegate<TRead> readCompletionDelegate;  // Completion of a pending send or sendclose if not null.
+        protected TaskCompletionSource<TRead> streamingReadTcs;  // Completion of a pending streaming read if not null.
+        protected TaskCompletionSource<object> sendStatusFromServerTcs;
 
         protected bool readingDone;  // True if last read (i.e. read with null payload) was already received.
         protected bool halfcloseRequested;  // True if send close have been initiated.
@@ -150,15 +151,25 @@
         /// Initiates reading a message. Only one read operation can be active at a time.
         /// completionDelegate is invoked upon completion.
         /// </summary>
-        protected void StartReadMessageInternal(AsyncCompletionDelegate<TRead> completionDelegate)
+        protected Task<TRead> ReadMessageInternalAsync()
         {
             lock (myLock)
             {
-                GrpcPreconditions.CheckNotNull(completionDelegate, "Completion delegate cannot be null");
-                CheckReadingAllowed();
+                GrpcPreconditions.CheckState(started);
+                if (readingDone)
+                {
+                    // the last read that returns null or throws an exception is idempotent
+                    // and maintain its state.
+                    GrpcPreconditions.CheckState(streamingReadTcs != null, "Call does not support streaming reads.");
+                    return streamingReadTcs.Task;
+                }
+
+                GrpcPreconditions.CheckState(streamingReadTcs == null, "Only one read can be pending at a time");
+                GrpcPreconditions.CheckState(!disposed);
 
                 call.StartReceiveMessage(HandleReadFinished);
-                readCompletionDelegate = completionDelegate;
+                streamingReadTcs = new TaskCompletionSource<TRead>();
+                return streamingReadTcs.Task;
             }
         }
 
@@ -202,7 +213,7 @@
         {
         }
 
-        protected void CheckSendingAllowed(bool allowFinished)
+        protected virtual void CheckSendingAllowed(bool allowFinished)
         {
             GrpcPreconditions.CheckState(started);
             CheckNotCancelled();
@@ -213,15 +224,6 @@
             GrpcPreconditions.CheckState(sendCompletionDelegate == null, "Only one write can be pending at a time");
         }
 
-        protected virtual void CheckReadingAllowed()
-        {
-            GrpcPreconditions.CheckState(started);
-            GrpcPreconditions.CheckState(!disposed);
-
-            GrpcPreconditions.CheckState(!readingDone, "Stream has already been closed.");
-            GrpcPreconditions.CheckState(readCompletionDelegate == null, "Only one read can be pending at a time");
-        }
-
         protected void CheckNotCancelled()
         {
             if (cancelRequested)
@@ -322,22 +324,18 @@
         /// </summary>
         protected void HandleSendStatusFromServerFinished(bool success)
         {
-            AsyncCompletionDelegate<object> origCompletionDelegate = null;
             lock (myLock)
             {
-                origCompletionDelegate = sendCompletionDelegate;
-                sendCompletionDelegate = null;
-
                 ReleaseResourcesIfPossible();
             }
 
             if (!success)
             {
-                FireCompletion(origCompletionDelegate, null, new InvalidOperationException("Error sending status from server."));
+                sendStatusFromServerTcs.SetException(new InvalidOperationException("Error sending status from server."));
             }
             else
             {
-                FireCompletion(origCompletionDelegate, null, null);
+                sendStatusFromServerTcs.SetResult(null);
             }
         }
 
@@ -346,15 +344,17 @@
         /// </summary>
         protected void HandleReadFinished(bool success, byte[] receivedMessage)
         {
+            // if success == false, received message will be null. It that case we will
+            // treat this completion as the last read an rely on C core to handle the failed
+            // read (e.g. deliver approriate statusCode on the clientside).
+
             TRead msg = default(TRead);
             var deserializeException = (success && receivedMessage != null) ? TryDeserialize(receivedMessage, out msg) : null;
 
-            AsyncCompletionDelegate<TRead> origCompletionDelegate = null;
+            TaskCompletionSource<TRead> origTcs = null;
             lock (myLock)
             {
-                origCompletionDelegate = readCompletionDelegate;
-                readCompletionDelegate = null;
-
+                origTcs = streamingReadTcs;
                 if (receivedMessage == null)
                 {
                     // This was the last read.
@@ -364,20 +364,25 @@
                 if (deserializeException != null && IsClient)
                 {
                     readingDone = true;
+
+                    // TODO(jtattermusch): it might be too late to set the status
                     CancelWithStatus(DeserializeResponseFailureStatus);
                 }
 
+                if (!readingDone)
+                {
+                    streamingReadTcs = null;
+                }
+
                 ReleaseResourcesIfPossible();
             }
 
-            // TODO: handle the case when success==false
-
             if (deserializeException != null && !IsClient)
             {
-                FireCompletion(origCompletionDelegate, default(TRead), new IOException("Failed to deserialize request message.", deserializeException));
+                origTcs.SetException(new IOException("Failed to deserialize request message.", deserializeException));
                 return;
             }
-            FireCompletion(origCompletionDelegate, msg, null);
+            origTcs.SetResult(msg);
         }
     }
 }
diff --git a/src/csharp/Grpc.Core/Internal/AsyncCallServer.cs b/src/csharp/Grpc.Core/Internal/AsyncCallServer.cs
index bea2b36..b1566b4 100644
--- a/src/csharp/Grpc.Core/Internal/AsyncCallServer.cs
+++ b/src/csharp/Grpc.Core/Internal/AsyncCallServer.cs
@@ -65,6 +65,15 @@
         }
 
         /// <summary>
+        /// Only for testing purposes.
+        /// </summary>
+        public void InitializeForTesting(INativeCall call)
+        {
+            server.AddCallReference(this);
+            InitializeInternal(call);
+        }
+
+        /// <summary>
         /// Starts a server side call.
         /// </summary>
         public Task ServerSideCallAsync()
@@ -91,11 +100,10 @@
 
         /// <summary>
         /// Receives a streaming request. Only one pending read action is allowed at any given time.
-        /// completionDelegate is called when the operation finishes.
         /// </summary>
-        public void StartReadMessage(AsyncCompletionDelegate<TRequest> completionDelegate)
+        public Task<TRequest> ReadMessageAsync()
         {
-            StartReadMessageInternal(completionDelegate);
+            return ReadMessageInternalAsync();
         }
 
         /// <summary>
@@ -128,24 +136,33 @@
         }
 
         /// <summary>
-        /// Sends call result status, also indicating server is done with streaming responses.
-        /// Only one pending send action is allowed at any given time.
-        /// completionDelegate is called when the operation finishes.
+        /// Sends call result status, indicating we are done with writes.
+        /// Sending a status different from StatusCode.OK will also implicitly cancel the call.
         /// </summary>
-        public void StartSendStatusFromServer(Status status, Metadata trailers, AsyncCompletionDelegate<object> completionDelegate)
+        public Task SendStatusFromServerAsync(Status status, Metadata trailers, Tuple<TResponse, WriteFlags> optionalWrite)
         {
+            byte[] payload = optionalWrite != null ? UnsafeSerialize(optionalWrite.Item1) : null;
+            var writeFlags = optionalWrite != null ? optionalWrite.Item2 : default(WriteFlags);
+
             lock (myLock)
             {
-                GrpcPreconditions.CheckNotNull(completionDelegate, "Completion delegate cannot be null");
-                CheckSendingAllowed(allowFinished: false);
+                GrpcPreconditions.CheckState(started);
+                GrpcPreconditions.CheckState(!disposed);
+                GrpcPreconditions.CheckState(!halfcloseRequested, "Can only send status from server once.");
 
                 using (var metadataArray = MetadataArraySafeHandle.Create(trailers))
                 {
-                    call.StartSendStatusFromServer(HandleSendStatusFromServerFinished, status, metadataArray, !initialMetadataSent);
+                    call.StartSendStatusFromServer(HandleSendStatusFromServerFinished, status, metadataArray, !initialMetadataSent,
+                        payload, writeFlags);
                 }
                 halfcloseRequested = true;
-                readingDone = true;
-                sendCompletionDelegate = completionDelegate;
+                initialMetadataSent = true;
+                sendStatusFromServerTcs = new TaskCompletionSource<object>();
+                if (optionalWrite != null)
+                {
+                    streamingWritesCounter++;
+                }
+                return sendStatusFromServerTcs.Task;
             }
         }
 
@@ -174,12 +191,6 @@
             get { return false; }
         }
 
-        protected override void CheckReadingAllowed()
-        {
-            base.CheckReadingAllowed();
-            GrpcPreconditions.CheckArgument(!cancelRequested);
-        }
-
         protected override void OnAfterReleaseResources()
         {
             server.RemoveCallReference(this);
@@ -190,12 +201,21 @@
         /// </summary>
         private void HandleFinishedServerside(bool success, bool cancelled)
         {
+            // NOTE: because this event is a result of batch containing GRPC_OP_RECV_CLOSE_ON_SERVER,
+            // success will be always set to true.
             lock (myLock)
             {
                 finished = true;
+                if (streamingReadTcs == null)
+                {
+                    // if there's no pending read, readingDone=true will dispose now.
+                    // if there is a pending read, we will dispose once that read finishes.
+                    readingDone = true;
+                    streamingReadTcs = new TaskCompletionSource<TRequest>();
+                    streamingReadTcs.SetResult(default(TRequest));
+                }
                 ReleaseResourcesIfPossible();
             }
-            // TODO(jtattermusch): handle error
 
             if (cancelled)
             {
diff --git a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs
index 500653b..244b97d 100644
--- a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs
+++ b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs
@@ -135,13 +135,16 @@
             }
         }
 
-        public void StartSendStatusFromServer(SendCompletionHandler callback, Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata)
+        public void StartSendStatusFromServer(SendCompletionHandler callback, Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata,
+            byte[] optionalPayload, WriteFlags writeFlags)
         {
             using (completionQueue.NewScope())
             {
                 var ctx = BatchContextSafeHandle.Create();
+                var optionalPayloadLength = optionalPayload != null ? new UIntPtr((ulong)optionalPayload.Length) : UIntPtr.Zero;
                 completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success));
-                Native.grpcsharp_call_send_status_from_server(this, ctx, status.StatusCode, status.Detail, metadataArray, sendEmptyInitialMetadata).CheckOk();
+                Native.grpcsharp_call_send_status_from_server(this, ctx, status.StatusCode, status.Detail, metadataArray, sendEmptyInitialMetadata,
+                    optionalPayload, optionalPayloadLength, writeFlags).CheckOk();
             }
         }
 
diff --git a/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs b/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs
index d6e34a0..ad9423f 100644
--- a/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs
+++ b/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs
@@ -68,9 +68,7 @@
             {
                 throw new InvalidOperationException("Cancellation of individual reads is not supported.");
             }
-            var taskSource = new AsyncCompletionTaskSource<TResponse>();
-            call.StartReadMessage(taskSource.CompletionDelegate);
-            var result = await taskSource.Task.ConfigureAwait(false);
+            var result = await call.ReadMessageAsync().ConfigureAwait(false);
             this.current = result;
 
             if (result == null)
diff --git a/src/csharp/Grpc.Core/Internal/INativeCall.cs b/src/csharp/Grpc.Core/Internal/INativeCall.cs
index cbef599..cd3719c 100644
--- a/src/csharp/Grpc.Core/Internal/INativeCall.cs
+++ b/src/csharp/Grpc.Core/Internal/INativeCall.cs
@@ -78,7 +78,7 @@
 
         void StartSendCloseFromClient(SendCompletionHandler callback);
 
-        void StartSendStatusFromServer(SendCompletionHandler callback, Grpc.Core.Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata);
+        void StartSendStatusFromServer(SendCompletionHandler callback, Grpc.Core.Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata, byte[] optionalPayload, Grpc.Core.WriteFlags writeFlags);
 
         void StartServerSide(ReceivedCloseOnServerHandler callback);
     }
diff --git a/src/csharp/Grpc.Core/Internal/NativeMethods.cs b/src/csharp/Grpc.Core/Internal/NativeMethods.cs
index 9ee0ba3..c277c73 100644
--- a/src/csharp/Grpc.Core/Internal/NativeMethods.cs
+++ b/src/csharp/Grpc.Core/Internal/NativeMethods.cs
@@ -421,20 +421,21 @@
             public delegate GRPCCallError grpcsharp_call_cancel_delegate(CallSafeHandle call);
             public delegate GRPCCallError grpcsharp_call_cancel_with_status_delegate(CallSafeHandle call, StatusCode status, string description);
             public delegate GRPCCallError grpcsharp_call_start_unary_delegate(CallSafeHandle call,
-                BatchContextSafeHandle ctx, byte[] send_buffer, UIntPtr send_buffer_len, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags);
+                BatchContextSafeHandle ctx, byte[] sendBuffer, UIntPtr sendBufferLen, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags);
             public delegate GRPCCallError grpcsharp_call_start_client_streaming_delegate(CallSafeHandle call,
                 BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray);
             public delegate GRPCCallError grpcsharp_call_start_server_streaming_delegate(CallSafeHandle call,
-                BatchContextSafeHandle ctx, byte[] send_buffer, UIntPtr send_buffer_len,
+                BatchContextSafeHandle ctx, byte[] sendBuffer, UIntPtr sendBufferLen,
                 MetadataArraySafeHandle metadataArray, WriteFlags writeFlags);
             public delegate GRPCCallError grpcsharp_call_start_duplex_streaming_delegate(CallSafeHandle call,
                 BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray);
             public delegate GRPCCallError grpcsharp_call_send_message_delegate(CallSafeHandle call,
-                BatchContextSafeHandle ctx, byte[] send_buffer, UIntPtr send_buffer_len, WriteFlags writeFlags, bool sendEmptyInitialMetadata);
+                BatchContextSafeHandle ctx, byte[] sendBuffer, UIntPtr sendBufferLen, WriteFlags writeFlags, bool sendEmptyInitialMetadata);
             public delegate GRPCCallError grpcsharp_call_send_close_from_client_delegate(CallSafeHandle call,
                 BatchContextSafeHandle ctx);
             public delegate GRPCCallError grpcsharp_call_send_status_from_server_delegate(CallSafeHandle call,
-                BatchContextSafeHandle ctx, StatusCode statusCode, string statusMessage, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata);
+                BatchContextSafeHandle ctx, StatusCode statusCode, string statusMessage, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata,
+                byte[] optionalSendBuffer, UIntPtr optionalSendBufferLen, WriteFlags writeFlags);
             public delegate GRPCCallError grpcsharp_call_recv_message_delegate(CallSafeHandle call,
                 BatchContextSafeHandle ctx);
             public delegate GRPCCallError grpcsharp_call_recv_initial_metadata_delegate(CallSafeHandle call,
@@ -593,7 +594,7 @@
 
             [DllImport("grpc_csharp_ext.dll")]
             public static extern GRPCCallError grpcsharp_call_start_unary(CallSafeHandle call,
-                BatchContextSafeHandle ctx, byte[] send_buffer, UIntPtr send_buffer_len, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags);
+                BatchContextSafeHandle ctx, byte[] sendBuffer, UIntPtr sendBufferLen, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags);
 
             [DllImport("grpc_csharp_ext.dll")]
             public static extern GRPCCallError grpcsharp_call_start_client_streaming(CallSafeHandle call,
@@ -601,7 +602,7 @@
 
             [DllImport("grpc_csharp_ext.dll")]
             public static extern GRPCCallError grpcsharp_call_start_server_streaming(CallSafeHandle call,
-                BatchContextSafeHandle ctx, byte[] send_buffer, UIntPtr send_buffer_len,
+                BatchContextSafeHandle ctx, byte[] sendBuffer, UIntPtr sendBufferLen,
                 MetadataArraySafeHandle metadataArray, WriteFlags writeFlags);
 
             [DllImport("grpc_csharp_ext.dll")]
@@ -610,7 +611,7 @@
 
             [DllImport("grpc_csharp_ext.dll")]
             public static extern GRPCCallError grpcsharp_call_send_message(CallSafeHandle call,
-                BatchContextSafeHandle ctx, byte[] send_buffer, UIntPtr send_buffer_len, WriteFlags writeFlags, bool sendEmptyInitialMetadata);
+                BatchContextSafeHandle ctx, byte[] sendBuffer, UIntPtr sendBufferLen, WriteFlags writeFlags, bool sendEmptyInitialMetadata);
 
             [DllImport("grpc_csharp_ext.dll")]
             public static extern GRPCCallError grpcsharp_call_send_close_from_client(CallSafeHandle call,
@@ -618,7 +619,8 @@
 
             [DllImport("grpc_csharp_ext.dll")]
             public static extern GRPCCallError grpcsharp_call_send_status_from_server(CallSafeHandle call,
-                BatchContextSafeHandle ctx, StatusCode statusCode, string statusMessage, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata);
+                BatchContextSafeHandle ctx, StatusCode statusCode, string statusMessage, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata,
+                byte[] optionalSendBuffer, UIntPtr optionalSendBufferLen, WriteFlags writeFlags);
 
             [DllImport("grpc_csharp_ext.dll")]
             public static extern GRPCCallError grpcsharp_call_recv_message(CallSafeHandle call,
diff --git a/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs b/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs
index 1f83e51..85b7a4b 100644
--- a/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs
+++ b/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs
@@ -75,29 +75,32 @@
             var responseStream = new ServerResponseStream<TRequest, TResponse>(asyncCall);
 
             Status status;
+            Tuple<TResponse,WriteFlags> responseTuple = null;
             var context = HandlerUtils.NewContext(newRpc, asyncCall.Peer, responseStream, asyncCall.CancellationToken);
             try
             {
                 GrpcPreconditions.CheckArgument(await requestStream.MoveNext().ConfigureAwait(false));
                 var request = requestStream.Current;
-                // TODO(jtattermusch): we need to read the full stream so that native callhandle gets deallocated.
-                GrpcPreconditions.CheckArgument(!await requestStream.MoveNext().ConfigureAwait(false));
-                var result = await handler(request, context).ConfigureAwait(false);
+                var response = await handler(request, context).ConfigureAwait(false);
                 status = context.Status;
-                await responseStream.WriteAsync(result).ConfigureAwait(false);
+                responseTuple = Tuple.Create(response, HandlerUtils.GetWriteFlags(context.WriteOptions));
             } 
             catch (Exception e)
             {
-                Logger.Error(e, "Exception occured in handler.");
+                if (!(e is RpcException))
+                {
+                    Logger.Warning(e, "Exception occured in handler.");
+                }
                 status = HandlerUtils.StatusFromException(e);
             }
             try
             {
-                await responseStream.WriteStatusAsync(status, context.ResponseTrailers).ConfigureAwait(false);
+                await asyncCall.SendStatusFromServerAsync(status, context.ResponseTrailers, responseTuple).ConfigureAwait(false);
             }
-            catch (OperationCanceledException)
+            catch (Exception)
             {
-                // Call has been already cancelled.
+                asyncCall.Cancel();
+                throw;
             }
             await finishedTask.ConfigureAwait(false);
         }
@@ -136,24 +139,26 @@
             {
                 GrpcPreconditions.CheckArgument(await requestStream.MoveNext().ConfigureAwait(false));
                 var request = requestStream.Current;
-                // TODO(jtattermusch): we need to read the full stream so that native callhandle gets deallocated.
-                GrpcPreconditions.CheckArgument(!await requestStream.MoveNext().ConfigureAwait(false));
                 await handler(request, responseStream, context).ConfigureAwait(false);
                 status = context.Status;
             }
             catch (Exception e)
             {
-                Logger.Error(e, "Exception occured in handler.");
+                if (!(e is RpcException))
+                {
+                    Logger.Warning(e, "Exception occured in handler.");
+                }
                 status = HandlerUtils.StatusFromException(e);
             }
 
             try
             {
-                await responseStream.WriteStatusAsync(status, context.ResponseTrailers).ConfigureAwait(false);
+                await asyncCall.SendStatusFromServerAsync(status, context.ResponseTrailers, null).ConfigureAwait(false);
             }
-            catch (OperationCanceledException)
+            catch (Exception)
             {
-                // Call has been already cancelled.
+                asyncCall.Cancel();
+                throw;
             }
             await finishedTask.ConfigureAwait(false);
         }
@@ -187,33 +192,31 @@
             var responseStream = new ServerResponseStream<TRequest, TResponse>(asyncCall);
 
             Status status;
+            Tuple<TResponse,WriteFlags> responseTuple = null;
             var context = HandlerUtils.NewContext(newRpc, asyncCall.Peer, responseStream, asyncCall.CancellationToken);
             try
             {
-                var result = await handler(requestStream, context).ConfigureAwait(false);
+                var response = await handler(requestStream, context).ConfigureAwait(false);
                 status = context.Status;
-                try
-                {
-                    await responseStream.WriteAsync(result).ConfigureAwait(false);
-                }
-                catch (OperationCanceledException)
-                {
-                    status = Status.DefaultCancelled;
-                }
+                responseTuple = Tuple.Create(response, HandlerUtils.GetWriteFlags(context.WriteOptions));
             }
             catch (Exception e)
             {
-                Logger.Error(e, "Exception occured in handler.");
+                if (!(e is RpcException))
+                {
+                    Logger.Warning(e, "Exception occured in handler.");
+                }
                 status = HandlerUtils.StatusFromException(e);
             }
 
             try
             {
-                await responseStream.WriteStatusAsync(status, context.ResponseTrailers).ConfigureAwait(false);
+                await asyncCall.SendStatusFromServerAsync(status, context.ResponseTrailers, responseTuple).ConfigureAwait(false);
             }
-            catch (OperationCanceledException)
+            catch (Exception)
             {
-                // Call has been already cancelled.
+                asyncCall.Cancel();
+                throw;
             }
             await finishedTask.ConfigureAwait(false);
         }
@@ -255,16 +258,20 @@
             }
             catch (Exception e)
             {
-                Logger.Error(e, "Exception occured in handler.");
+                if (!(e is RpcException))
+                {
+                    Logger.Warning(e, "Exception occured in handler.");
+                }
                 status = HandlerUtils.StatusFromException(e);
             }
             try
             {
-                await responseStream.WriteStatusAsync(status, context.ResponseTrailers).ConfigureAwait(false);
+                await asyncCall.SendStatusFromServerAsync(status, context.ResponseTrailers, null).ConfigureAwait(false);
             }
-            catch (OperationCanceledException)
+            catch (Exception)
             {
-                // Call has been already cancelled.
+                asyncCall.Cancel();
+                throw;
             }
             await finishedTask.ConfigureAwait(false);
         }
@@ -282,9 +289,7 @@
             
             asyncCall.Initialize(newRpc.Call);
             var finishedTask = asyncCall.ServerSideCallAsync();
-            var responseStream = new ServerResponseStream<byte[], byte[]>(asyncCall);
-
-            await responseStream.WriteStatusAsync(new Status(StatusCode.Unimplemented, ""), Metadata.Empty).ConfigureAwait(false);
+            await asyncCall.SendStatusFromServerAsync(new Status(StatusCode.Unimplemented, ""), Metadata.Empty, null).ConfigureAwait(false);
             await finishedTask.ConfigureAwait(false);
         }
     }
@@ -300,10 +305,14 @@
                 return rpcException.Status;
             }
 
-            // TODO(jtattermusch): what is the right status code here?
             return new Status(StatusCode.Unknown, "Exception was thrown by handler.");
         }
 
+        public static WriteFlags GetWriteFlags(WriteOptions writeOptions)
+        {
+            return writeOptions != null ? writeOptions.Flags : default(WriteFlags);
+        }
+
         public static ServerCallContext NewContext<TRequest, TResponse>(ServerRpcNew newRpc, string peer, ServerResponseStream<TRequest, TResponse> serverResponseStream, CancellationToken cancellationToken)
             where TRequest : class
             where TResponse : class
diff --git a/src/csharp/Grpc.Core/Internal/ServerRequestStream.cs b/src/csharp/Grpc.Core/Internal/ServerRequestStream.cs
index e7be82c..d76030d 100644
--- a/src/csharp/Grpc.Core/Internal/ServerRequestStream.cs
+++ b/src/csharp/Grpc.Core/Internal/ServerRequestStream.cs
@@ -68,9 +68,7 @@
             {
                 throw new InvalidOperationException("Cancellation of individual reads is not supported.");
             }
-            var taskSource = new AsyncCompletionTaskSource<TRequest>();
-            call.StartReadMessage(taskSource.CompletionDelegate);
-            var result = await taskSource.Task.ConfigureAwait(false);
+            var result = await call.ReadMessageAsync().ConfigureAwait(false);
             this.current = result;
             return result != null;
         }
diff --git a/src/csharp/Grpc.Core/Internal/ServerResponseStream.cs b/src/csharp/Grpc.Core/Internal/ServerResponseStream.cs
index 03e39ef..ecfee0b 100644
--- a/src/csharp/Grpc.Core/Internal/ServerResponseStream.cs
+++ b/src/csharp/Grpc.Core/Internal/ServerResponseStream.cs
@@ -57,13 +57,6 @@
             return taskSource.Task;
         }
 
-        public Task WriteStatusAsync(Status status, Metadata trailers)
-        {
-            var taskSource = new AsyncCompletionTaskSource<object>();
-            call.StartSendStatusFromServer(status, trailers, taskSource.CompletionDelegate);
-            return taskSource.Task;
-        }
-
         public Task WriteResponseHeadersAsync(Metadata responseHeaders)
         {
             var taskSource = new AsyncCompletionTaskSource<object>();
diff --git a/src/csharp/Grpc.Core/Server.cs b/src/csharp/Grpc.Core/Server.cs
index 5b61b7f..d538a46 100644
--- a/src/csharp/Grpc.Core/Server.cs
+++ b/src/csharp/Grpc.Core/Server.cs
@@ -48,6 +48,7 @@
     /// </summary>
     public class Server
     {
+        const int InitialAllowRpcTokenCount = 10;
         static readonly ILogger Logger = GrpcEnvironment.Logger.ForType<Server>();
 
         readonly AtomicCounter activeCallCounter = new AtomicCounter();
@@ -65,7 +66,7 @@
         readonly TaskCompletionSource<object> shutdownTcs = new TaskCompletionSource<object>();
 
         bool startRequested;
-        bool shutdownRequested;
+        volatile bool shutdownRequested;
 
         /// <summary>
         /// Create a new server.
@@ -129,7 +130,13 @@
                 startRequested = true;
                 
                 handle.Start();
-                AllowOneRpc();
+
+                // Starting with more than one AllowOneRpc tokens can significantly increase
+                // unary RPC throughput.
+                for (int i = 0; i < InitialAllowRpcTokenCount; i++)
+                {
+                    AllowOneRpc();
+                }
             }
         }
 
@@ -239,12 +246,9 @@
         /// </summary>
         private void AllowOneRpc()
         {
-            lock (myLock)
+            if (!shutdownRequested)
             {
-                if (!shutdownRequested)
-                {
-                    handle.RequestCall(HandleNewServerRpc, environment);
-                }
+                handle.RequestCall(HandleNewServerRpc, environment);
             }
         }
 
@@ -283,6 +287,8 @@
         /// </summary>
         private void HandleNewServerRpc(bool success, BatchContextSafeHandle ctx)
         {
+			Task.Run(() => AllowOneRpc());
+
             if (success)
             {
                 ServerRpcNew newRpc = ctx.GetServerRpcNew(this);
@@ -290,11 +296,9 @@
                 // after server shutdown, the callback returns with null call
                 if (!newRpc.Call.IsInvalid)
                 {
-                    Task.Run(async () => await HandleCallAsync(newRpc)).ConfigureAwait(false);
+                    HandleCallAsync(newRpc);  // we don't need to await.
                 }
             }
-
-            AllowOneRpc();
         }
 
         /// <summary>
diff --git a/src/csharp/Grpc.Core/VersionInfo.cs b/src/csharp/Grpc.Core/VersionInfo.cs
index f7a9cb9..e160934 100644
--- a/src/csharp/Grpc.Core/VersionInfo.cs
+++ b/src/csharp/Grpc.Core/VersionInfo.cs
@@ -48,11 +48,11 @@
         /// <summary>
         /// Current <c>AssemblyFileVersion</c> of gRPC C# assemblies
         /// </summary>
-        public const string CurrentAssemblyFileVersion = "0.14.0.0";
+        public const string CurrentAssemblyFileVersion = "0.15.0.0";
 
         /// <summary>
         /// Current version of gRPC C#
         /// </summary>
-        public const string CurrentVersion = "0.14.0-dev";
+        public const string CurrentVersion = "0.15.0-dev";
     }
 }
diff --git a/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs b/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
index 875202b..ee11105 100644
--- a/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
+++ b/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
@@ -92,7 +92,7 @@
         public void DivByZero()
         {
             var ex = Assert.Throws<RpcException>(() => client.Div(new DivArgs { Dividend = 0, Divisor = 0 }));
-            Assert.AreEqual(StatusCode.Unknown, ex.Status.StatusCode);
+            Assert.AreEqual(StatusCode.InvalidArgument, ex.Status.StatusCode);
         }
 
         [Test]
diff --git a/src/csharp/Grpc.Examples/MathExamples.cs b/src/csharp/Grpc.Examples/MathExamples.cs
index 6075420..d260830 100644
--- a/src/csharp/Grpc.Examples/MathExamples.cs
+++ b/src/csharp/Grpc.Examples/MathExamples.cs
@@ -32,6 +32,7 @@
 using System;
 using System.Collections.Generic;
 using System.Threading.Tasks;
+using Grpc.Core;
 using Grpc.Core.Utils;
 
 namespace Math
@@ -109,5 +110,42 @@
             DivReply result = await client.DivAsync(new DivArgs { Dividend = sum.Num_, Divisor = numbers.Count });
             Console.WriteLine("Avg Result: " + result);
         }
+
+        /// <summary>
+        /// Shows how to handle a call ending with non-OK status.
+        /// </summary>
+        public static async Task HandleErrorExample(Math.MathClient client)
+        {
+            try
+            {
+                 DivReply result = await client.DivAsync(new DivArgs { Dividend = 5, Divisor = 0 });
+            }
+            catch (RpcException ex)
+            {
+                Console.WriteLine(string.Format("RPC ended with status {0}", ex.Status));
+            }
+        }
+
+        /// <summary>
+        /// Shows how to send request headers and how to access response headers
+        /// and response trailers.
+        /// </summary>
+        public static async Task MetadataExample(Math.MathClient client)
+        {
+            var requestHeaders = new Metadata
+            {
+                { "custom-header", "custom-value" }
+            };
+
+            var call = client.DivAsync(new DivArgs { Dividend = 5, Divisor = 0 }, requestHeaders);
+
+            // Get response headers
+            Metadata responseHeaders = await call.ResponseHeadersAsync;
+
+            var result = await call;
+
+            // Get response trailers after the call has finished.
+            Metadata responseTrailers = call.GetTrailers();
+        }
     }
 }
diff --git a/src/csharp/Grpc.Examples/MathGrpc.cs b/src/csharp/Grpc.Examples/MathGrpc.cs
index 2d3034d..d700a18 100644
--- a/src/csharp/Grpc.Examples/MathGrpc.cs
+++ b/src/csharp/Grpc.Examples/MathGrpc.cs
@@ -151,25 +151,25 @@
       ///  Div divides args.dividend by args.divisor and returns the quotient and
       ///  remainder.
       /// </summary>
-      Task<global::Math.DivReply> Div(global::Math.DivArgs request, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Math.DivReply> Div(global::Math.DivArgs request, ServerCallContext context);
       /// <summary>
       ///  DivMany accepts an arbitrary number of division args from the client stream
       ///  and sends back the results in the reply stream.  The stream continues until
       ///  the client closes its end; the server does the same after sending all the
       ///  replies.  The stream ends immediately if either end aborts.
       /// </summary>
-      Task DivMany(IAsyncStreamReader<global::Math.DivArgs> requestStream, IServerStreamWriter<global::Math.DivReply> responseStream, ServerCallContext context);
+      global::System.Threading.Tasks.Task DivMany(IAsyncStreamReader<global::Math.DivArgs> requestStream, IServerStreamWriter<global::Math.DivReply> responseStream, ServerCallContext context);
       /// <summary>
       ///  Fib generates numbers in the Fibonacci sequence.  If args.limit > 0, Fib
       ///  generates up to limit numbers; otherwise it continues until the call is
       ///  canceled.  Unlike Fib above, Fib has no final FibReply.
       /// </summary>
-      Task Fib(global::Math.FibArgs request, IServerStreamWriter<global::Math.Num> responseStream, ServerCallContext context);
+      global::System.Threading.Tasks.Task Fib(global::Math.FibArgs request, IServerStreamWriter<global::Math.Num> responseStream, ServerCallContext context);
       /// <summary>
       ///  Sum sums a stream of numbers, returning the final result once the stream
       ///  is closed.
       /// </summary>
-      Task<global::Math.Num> Sum(IAsyncStreamReader<global::Math.Num> requestStream, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Math.Num> Sum(IAsyncStreamReader<global::Math.Num> requestStream, ServerCallContext context);
     }
 
     /// <summary>Base class for server-side implementations of Math</summary>
@@ -179,7 +179,7 @@
       ///  Div divides args.dividend by args.divisor and returns the quotient and
       ///  remainder.
       /// </summary>
-      public virtual Task<global::Math.DivReply> Div(global::Math.DivArgs request, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Math.DivReply> Div(global::Math.DivArgs request, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -190,7 +190,7 @@
       ///  the client closes its end; the server does the same after sending all the
       ///  replies.  The stream ends immediately if either end aborts.
       /// </summary>
-      public virtual Task DivMany(IAsyncStreamReader<global::Math.DivArgs> requestStream, IServerStreamWriter<global::Math.DivReply> responseStream, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task DivMany(IAsyncStreamReader<global::Math.DivArgs> requestStream, IServerStreamWriter<global::Math.DivReply> responseStream, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -200,7 +200,7 @@
       ///  generates up to limit numbers; otherwise it continues until the call is
       ///  canceled.  Unlike Fib above, Fib has no final FibReply.
       /// </summary>
-      public virtual Task Fib(global::Math.FibArgs request, IServerStreamWriter<global::Math.Num> responseStream, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task Fib(global::Math.FibArgs request, IServerStreamWriter<global::Math.Num> responseStream, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -209,7 +209,7 @@
       ///  Sum sums a stream of numbers, returning the final result once the stream
       ///  is closed.
       /// </summary>
-      public virtual Task<global::Math.Num> Sum(IAsyncStreamReader<global::Math.Num> requestStream, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Math.Num> Sum(IAsyncStreamReader<global::Math.Num> requestStream, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
diff --git a/src/csharp/Grpc.Examples/MathServiceImpl.cs b/src/csharp/Grpc.Examples/MathServiceImpl.cs
index 79c56e5..a28020f 100644
--- a/src/csharp/Grpc.Examples/MathServiceImpl.cs
+++ b/src/csharp/Grpc.Examples/MathServiceImpl.cs
@@ -52,23 +52,15 @@
 
         public override async Task Fib(FibArgs request, IServerStreamWriter<Num> responseStream, ServerCallContext context)
         {
-            if (request.Limit <= 0)
-            {
-                // keep streaming the sequence until cancelled.
-                IEnumerator<Num> fibEnumerator = FibInternal(long.MaxValue).GetEnumerator();
-                while (!context.CancellationToken.IsCancellationRequested && fibEnumerator.MoveNext())
-                {
-                    await responseStream.WriteAsync(fibEnumerator.Current);
-                    await Task.Delay(100);
-                }
-            }
+            var limit = request.Limit > 0 ? request.Limit : long.MaxValue;
+            var fibEnumerator = FibInternal(limit).GetEnumerator();
 
-            if (request.Limit > 0)
+            // Keep streaming the sequence until the call is cancelled.
+            // Use CancellationToken from ServerCallContext to detect the cancellation.
+            while (!context.CancellationToken.IsCancellationRequested && fibEnumerator.MoveNext())
             {
-                foreach (var num in FibInternal(request.Limit))
-                {
-                    await responseStream.WriteAsync(num);
-                }
+                await responseStream.WriteAsync(fibEnumerator.Current);
+                await Task.Delay(100);
             }
         }
 
@@ -89,6 +81,13 @@
 
         static DivReply DivInternal(DivArgs args)
         {
+            if (args.Divisor == 0)
+            {
+                // One can finish the RPC with non-ok status by throwing RpcException instance.
+                // Alternatively, resulting status can be set using ServerCallContext.Status
+                throw new RpcException(new Status(StatusCode.InvalidArgument, "Division by zero"));
+            }
+
             long quotient = args.Dividend / args.Divisor;
             long remainder = args.Dividend % args.Divisor;
             return new DivReply { Quotient = quotient, Remainder = remainder };
diff --git a/src/csharp/Grpc.HealthCheck/HealthGrpc.cs b/src/csharp/Grpc.HealthCheck/HealthGrpc.cs
index 967d117..51c6a39 100644
--- a/src/csharp/Grpc.HealthCheck/HealthGrpc.cs
+++ b/src/csharp/Grpc.HealthCheck/HealthGrpc.cs
@@ -72,13 +72,13 @@
     [System.Obsolete("Service implementations should inherit from the generated abstract base class instead.")]
     public interface IHealth
     {
-      Task<global::Grpc.Health.V1.HealthCheckResponse> Check(global::Grpc.Health.V1.HealthCheckRequest request, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Grpc.Health.V1.HealthCheckResponse> Check(global::Grpc.Health.V1.HealthCheckRequest request, ServerCallContext context);
     }
 
     /// <summary>Base class for server-side implementations of Health</summary>
     public abstract class HealthBase
     {
-      public virtual Task<global::Grpc.Health.V1.HealthCheckResponse> Check(global::Grpc.Health.V1.HealthCheckRequest request, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Grpc.Health.V1.HealthCheckResponse> Check(global::Grpc.Health.V1.HealthCheckRequest request, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
diff --git a/src/csharp/Grpc.IntegrationTesting/ClientRunners.cs b/src/csharp/Grpc.IntegrationTesting/ClientRunners.cs
index b457275..9eaf6bf 100644
--- a/src/csharp/Grpc.IntegrationTesting/ClientRunners.cs
+++ b/src/csharp/Grpc.IntegrationTesting/ClientRunners.cs
@@ -142,8 +142,7 @@
                 for (int i = 0; i < outstandingRpcsPerChannel; i++)
                 {
                     var timer = CreateTimer(loadParams, 1.0 / this.channels.Count / outstandingRpcsPerChannel);
-                    var threadBody = GetThreadBody(channel, timer);
-                    this.runnerTasks.Add(Task.Factory.StartNew(threadBody, TaskCreationOptions.LongRunning));
+                    this.runnerTasks.Add(RunClientAsync(channel, timer));
                 }
             }
         }
@@ -269,38 +268,30 @@
             }
         }
 
-        private Action GetThreadBody(Channel channel, IInterarrivalTimer timer)
+        private Task RunClientAsync(Channel channel, IInterarrivalTimer timer)
         {
             if (payloadConfig.PayloadCase == PayloadConfig.PayloadOneofCase.BytebufParams)
             {
                 GrpcPreconditions.CheckArgument(clientType == ClientType.ASYNC_CLIENT, "Generic client only supports async API");
                 GrpcPreconditions.CheckArgument(rpcType == RpcType.STREAMING, "Generic client only supports streaming calls");
-                return () =>
-                {
-                    RunGenericStreamingAsync(channel, timer).Wait();
-                };
+                return RunGenericStreamingAsync(channel, timer);
             }
 
             GrpcPreconditions.CheckNotNull(payloadConfig.SimpleParams);
             if (clientType == ClientType.SYNC_CLIENT)
             {
                 GrpcPreconditions.CheckArgument(rpcType == RpcType.UNARY, "Sync client can only be used for Unary calls in C#");
-                return () => RunUnary(channel, timer);
+                // create a dedicated thread for the synchronous client
+                return Task.Factory.StartNew(() => RunUnary(channel, timer), TaskCreationOptions.LongRunning);
             }
             else if (clientType == ClientType.ASYNC_CLIENT)
             {
                 switch (rpcType)
                 {
                     case RpcType.UNARY:
-                        return () =>
-                        {
-                            RunUnaryAsync(channel, timer).Wait();
-                        };
+                        return RunUnaryAsync(channel, timer);
                     case RpcType.STREAMING:
-                        return () =>
-                        {
-                            RunStreamingPingPongAsync(channel, timer).Wait();
-                        };
+                        return RunStreamingPingPongAsync(channel, timer);
                 }
             }
             throw new ArgumentException("Unsupported configuration.");
diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
index b3b1abf..cff8508 100644
--- a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
+++ b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
@@ -492,6 +492,10 @@
                 {
                     // Deadline was reached before write has started. Eat the exception and continue.
                 }
+                catch (RpcException)
+                {
+                    // Deadline was reached before write has started. Eat the exception and continue.
+                }
 
                 var ex = Assert.ThrowsAsync<RpcException>(async () => await call.ResponseStream.MoveNext());
                 // We can't guarantee the status code always DeadlineExceeded. See issue #2685.
diff --git a/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs b/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs
index aa4f1c5..9d31d1c 100644
--- a/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs
+++ b/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs
@@ -112,11 +112,11 @@
       ///  Returns the values of all the gauges that are currently being maintained by
       ///  the service
       /// </summary>
-      Task GetAllGauges(global::Grpc.Testing.EmptyMessage request, IServerStreamWriter<global::Grpc.Testing.GaugeResponse> responseStream, ServerCallContext context);
+      global::System.Threading.Tasks.Task GetAllGauges(global::Grpc.Testing.EmptyMessage request, IServerStreamWriter<global::Grpc.Testing.GaugeResponse> responseStream, ServerCallContext context);
       /// <summary>
       ///  Returns the value of one gauge
       /// </summary>
-      Task<global::Grpc.Testing.GaugeResponse> GetGauge(global::Grpc.Testing.GaugeRequest request, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Grpc.Testing.GaugeResponse> GetGauge(global::Grpc.Testing.GaugeRequest request, ServerCallContext context);
     }
 
     /// <summary>Base class for server-side implementations of MetricsService</summary>
@@ -126,7 +126,7 @@
       ///  Returns the values of all the gauges that are currently being maintained by
       ///  the service
       /// </summary>
-      public virtual Task GetAllGauges(global::Grpc.Testing.EmptyMessage request, IServerStreamWriter<global::Grpc.Testing.GaugeResponse> responseStream, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task GetAllGauges(global::Grpc.Testing.EmptyMessage request, IServerStreamWriter<global::Grpc.Testing.GaugeResponse> responseStream, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -134,7 +134,7 @@
       /// <summary>
       ///  Returns the value of one gauge
       /// </summary>
-      public virtual Task<global::Grpc.Testing.GaugeResponse> GetGauge(global::Grpc.Testing.GaugeRequest request, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Grpc.Testing.GaugeResponse> GetGauge(global::Grpc.Testing.GaugeRequest request, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
diff --git a/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs b/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs
index 42bf5e0..f7071eb 100644
--- a/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs
+++ b/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs
@@ -111,12 +111,12 @@
       ///  One request followed by one response.
       ///  The server returns the client payload as-is.
       /// </summary>
-      Task<global::Grpc.Testing.SimpleResponse> UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Grpc.Testing.SimpleResponse> UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context);
       /// <summary>
       ///  One request followed by one response.
       ///  The server returns the client payload as-is.
       /// </summary>
-      Task StreamingCall(IAsyncStreamReader<global::Grpc.Testing.SimpleRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.SimpleResponse> responseStream, ServerCallContext context);
+      global::System.Threading.Tasks.Task StreamingCall(IAsyncStreamReader<global::Grpc.Testing.SimpleRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.SimpleResponse> responseStream, ServerCallContext context);
     }
 
     /// <summary>Base class for server-side implementations of BenchmarkService</summary>
@@ -126,7 +126,7 @@
       ///  One request followed by one response.
       ///  The server returns the client payload as-is.
       /// </summary>
-      public virtual Task<global::Grpc.Testing.SimpleResponse> UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Grpc.Testing.SimpleResponse> UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -135,7 +135,7 @@
       ///  One request followed by one response.
       ///  The server returns the client payload as-is.
       /// </summary>
-      public virtual Task StreamingCall(IAsyncStreamReader<global::Grpc.Testing.SimpleRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.SimpleResponse> responseStream, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task StreamingCall(IAsyncStreamReader<global::Grpc.Testing.SimpleRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.SimpleResponse> responseStream, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -375,7 +375,7 @@
       ///  and once the shutdown has finished, the OK status is sent to terminate
       ///  this RPC.
       /// </summary>
-      Task RunServer(IAsyncStreamReader<global::Grpc.Testing.ServerArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ServerStatus> responseStream, ServerCallContext context);
+      global::System.Threading.Tasks.Task RunServer(IAsyncStreamReader<global::Grpc.Testing.ServerArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ServerStatus> responseStream, ServerCallContext context);
       /// <summary>
       ///  Start client with specified workload.
       ///  First request sent specifies the ClientConfig followed by ClientStatus
@@ -384,15 +384,15 @@
       ///  and once the shutdown has finished, the OK status is sent to terminate
       ///  this RPC.
       /// </summary>
-      Task RunClient(IAsyncStreamReader<global::Grpc.Testing.ClientArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ClientStatus> responseStream, ServerCallContext context);
+      global::System.Threading.Tasks.Task RunClient(IAsyncStreamReader<global::Grpc.Testing.ClientArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ClientStatus> responseStream, ServerCallContext context);
       /// <summary>
       ///  Just return the core count - unary call
       /// </summary>
-      Task<global::Grpc.Testing.CoreResponse> CoreCount(global::Grpc.Testing.CoreRequest request, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Grpc.Testing.CoreResponse> CoreCount(global::Grpc.Testing.CoreRequest request, ServerCallContext context);
       /// <summary>
       ///  Quit this worker
       /// </summary>
-      Task<global::Grpc.Testing.Void> QuitWorker(global::Grpc.Testing.Void request, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Grpc.Testing.Void> QuitWorker(global::Grpc.Testing.Void request, ServerCallContext context);
     }
 
     /// <summary>Base class for server-side implementations of WorkerService</summary>
@@ -406,7 +406,7 @@
       ///  and once the shutdown has finished, the OK status is sent to terminate
       ///  this RPC.
       /// </summary>
-      public virtual Task RunServer(IAsyncStreamReader<global::Grpc.Testing.ServerArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ServerStatus> responseStream, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task RunServer(IAsyncStreamReader<global::Grpc.Testing.ServerArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ServerStatus> responseStream, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -419,7 +419,7 @@
       ///  and once the shutdown has finished, the OK status is sent to terminate
       ///  this RPC.
       /// </summary>
-      public virtual Task RunClient(IAsyncStreamReader<global::Grpc.Testing.ClientArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ClientStatus> responseStream, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task RunClient(IAsyncStreamReader<global::Grpc.Testing.ClientArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ClientStatus> responseStream, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -427,7 +427,7 @@
       /// <summary>
       ///  Just return the core count - unary call
       /// </summary>
-      public virtual Task<global::Grpc.Testing.CoreResponse> CoreCount(global::Grpc.Testing.CoreRequest request, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Grpc.Testing.CoreResponse> CoreCount(global::Grpc.Testing.CoreRequest request, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -435,7 +435,7 @@
       /// <summary>
       ///  Quit this worker
       /// </summary>
-      public virtual Task<global::Grpc.Testing.Void> QuitWorker(global::Grpc.Testing.Void request, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Grpc.Testing.Void> QuitWorker(global::Grpc.Testing.Void request, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
diff --git a/src/csharp/Grpc.IntegrationTesting/StressTestClient.cs b/src/csharp/Grpc.IntegrationTesting/StressTestClient.cs
index 8db691c..4d6ca7e 100644
--- a/src/csharp/Grpc.IntegrationTesting/StressTestClient.cs
+++ b/src/csharp/Grpc.IntegrationTesting/StressTestClient.cs
@@ -311,7 +311,7 @@
                 var snapshot = histogram.GetSnapshot(true);
                 var elapsedSnapshot = wallClockStopwatch.GetElapsedSnapshot(true);
 
-                return (long) (snapshot.Count / elapsedSnapshot.Seconds);
+                return (long) (snapshot.Count / elapsedSnapshot.TotalSeconds);
             }
         }
     }
diff --git a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
index f1878cb..cf43a77 100644
--- a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
+++ b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
@@ -196,34 +196,34 @@
       /// <summary>
       ///  One empty request followed by one empty response.
       /// </summary>
-      Task<global::Grpc.Testing.Empty> EmptyCall(global::Grpc.Testing.Empty request, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Grpc.Testing.Empty> EmptyCall(global::Grpc.Testing.Empty request, ServerCallContext context);
       /// <summary>
       ///  One request followed by one response.
       /// </summary>
-      Task<global::Grpc.Testing.SimpleResponse> UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Grpc.Testing.SimpleResponse> UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context);
       /// <summary>
       ///  One request followed by a sequence of responses (streamed download).
       ///  The server returns the payload with client desired type and sizes.
       /// </summary>
-      Task StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context);
+      global::System.Threading.Tasks.Task StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context);
       /// <summary>
       ///  A sequence of requests followed by one response (streamed upload).
       ///  The server returns the aggregated size of client payload as the result.
       /// </summary>
-      Task<global::Grpc.Testing.StreamingInputCallResponse> StreamingInputCall(IAsyncStreamReader<global::Grpc.Testing.StreamingInputCallRequest> requestStream, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Grpc.Testing.StreamingInputCallResponse> StreamingInputCall(IAsyncStreamReader<global::Grpc.Testing.StreamingInputCallRequest> requestStream, ServerCallContext context);
       /// <summary>
       ///  A sequence of requests with each request served by the server immediately.
       ///  As one request could lead to multiple responses, this interface
       ///  demonstrates the idea of full duplexing.
       /// </summary>
-      Task FullDuplexCall(IAsyncStreamReader<global::Grpc.Testing.StreamingOutputCallRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context);
+      global::System.Threading.Tasks.Task FullDuplexCall(IAsyncStreamReader<global::Grpc.Testing.StreamingOutputCallRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context);
       /// <summary>
       ///  A sequence of requests followed by a sequence of responses.
       ///  The server buffers all the client requests and then serves them in order. A
       ///  stream of responses are returned to the client when the server starts with
       ///  first request.
       /// </summary>
-      Task HalfDuplexCall(IAsyncStreamReader<global::Grpc.Testing.StreamingOutputCallRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context);
+      global::System.Threading.Tasks.Task HalfDuplexCall(IAsyncStreamReader<global::Grpc.Testing.StreamingOutputCallRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context);
     }
 
     /// <summary>Base class for server-side implementations of TestService</summary>
@@ -232,7 +232,7 @@
       /// <summary>
       ///  One empty request followed by one empty response.
       /// </summary>
-      public virtual Task<global::Grpc.Testing.Empty> EmptyCall(global::Grpc.Testing.Empty request, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Grpc.Testing.Empty> EmptyCall(global::Grpc.Testing.Empty request, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -240,7 +240,7 @@
       /// <summary>
       ///  One request followed by one response.
       /// </summary>
-      public virtual Task<global::Grpc.Testing.SimpleResponse> UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Grpc.Testing.SimpleResponse> UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -249,7 +249,7 @@
       ///  One request followed by a sequence of responses (streamed download).
       ///  The server returns the payload with client desired type and sizes.
       /// </summary>
-      public virtual Task StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -258,7 +258,7 @@
       ///  A sequence of requests followed by one response (streamed upload).
       ///  The server returns the aggregated size of client payload as the result.
       /// </summary>
-      public virtual Task<global::Grpc.Testing.StreamingInputCallResponse> StreamingInputCall(IAsyncStreamReader<global::Grpc.Testing.StreamingInputCallRequest> requestStream, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Grpc.Testing.StreamingInputCallResponse> StreamingInputCall(IAsyncStreamReader<global::Grpc.Testing.StreamingInputCallRequest> requestStream, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -268,7 +268,7 @@
       ///  As one request could lead to multiple responses, this interface
       ///  demonstrates the idea of full duplexing.
       /// </summary>
-      public virtual Task FullDuplexCall(IAsyncStreamReader<global::Grpc.Testing.StreamingOutputCallRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task FullDuplexCall(IAsyncStreamReader<global::Grpc.Testing.StreamingOutputCallRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -279,7 +279,7 @@
       ///  stream of responses are returned to the client when the server starts with
       ///  first request.
       /// </summary>
-      public virtual Task HalfDuplexCall(IAsyncStreamReader<global::Grpc.Testing.StreamingOutputCallRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task HalfDuplexCall(IAsyncStreamReader<global::Grpc.Testing.StreamingOutputCallRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -525,7 +525,7 @@
       /// <summary>
       ///  A call that no server should implement
       /// </summary>
-      Task<global::Grpc.Testing.Empty> UnimplementedCall(global::Grpc.Testing.Empty request, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Grpc.Testing.Empty> UnimplementedCall(global::Grpc.Testing.Empty request, ServerCallContext context);
     }
 
     /// <summary>Base class for server-side implementations of UnimplementedService</summary>
@@ -534,7 +534,7 @@
       /// <summary>
       ///  A call that no server should implement
       /// </summary>
-      public virtual Task<global::Grpc.Testing.Empty> UnimplementedCall(global::Grpc.Testing.Empty request, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Grpc.Testing.Empty> UnimplementedCall(global::Grpc.Testing.Empty request, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
@@ -669,19 +669,19 @@
     [System.Obsolete("Service implementations should inherit from the generated abstract base class instead.")]
     public interface IReconnectService
     {
-      Task<global::Grpc.Testing.Empty> Start(global::Grpc.Testing.ReconnectParams request, ServerCallContext context);
-      Task<global::Grpc.Testing.ReconnectInfo> Stop(global::Grpc.Testing.Empty request, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Grpc.Testing.Empty> Start(global::Grpc.Testing.ReconnectParams request, ServerCallContext context);
+      global::System.Threading.Tasks.Task<global::Grpc.Testing.ReconnectInfo> Stop(global::Grpc.Testing.Empty request, ServerCallContext context);
     }
 
     /// <summary>Base class for server-side implementations of ReconnectService</summary>
     public abstract class ReconnectServiceBase
     {
-      public virtual Task<global::Grpc.Testing.Empty> Start(global::Grpc.Testing.ReconnectParams request, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Grpc.Testing.Empty> Start(global::Grpc.Testing.ReconnectParams request, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
 
-      public virtual Task<global::Grpc.Testing.ReconnectInfo> Stop(global::Grpc.Testing.Empty request, ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Grpc.Testing.ReconnectInfo> Stop(global::Grpc.Testing.Empty request, ServerCallContext context)
       {
         throw new RpcException(new Status(StatusCode.Unimplemented, ""));
       }
diff --git a/src/csharp/build_packages.bat b/src/csharp/build_packages.bat
index 9a60be2..7520b0f 100644
--- a/src/csharp/build_packages.bat
+++ b/src/csharp/build_packages.bat
@@ -1,7 +1,7 @@
 @rem Builds gRPC NuGet packages
 
 @rem Current package versions
-set VERSION=0.14.0-dev
+set VERSION=0.15.0-dev
 set PROTOBUF_VERSION=3.0.0-beta2
 
 @rem Packages that depend on prerelease packages (like Google.Protobuf) need to have prerelease suffix as well.
diff --git a/src/csharp/ext/grpc_csharp_ext.c b/src/csharp/ext/grpc_csharp_ext.c
index aeef8a7..5b8ff9b 100644
--- a/src/csharp/ext/grpc_csharp_ext.c
+++ b/src/csharp/ext/grpc_csharp_ext.c
@@ -715,10 +715,11 @@
 GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_status_from_server(
     grpc_call *call, grpcsharp_batch_context *ctx, grpc_status_code status_code,
     const char *status_details, grpc_metadata_array *trailing_metadata,
-    int32_t send_empty_initial_metadata) {
+    int32_t send_empty_initial_metadata, const char* optional_send_buffer,
+    size_t optional_send_buffer_len, uint32_t write_flags) {
   /* TODO: don't use magic number */
-  grpc_op ops[2];
-  size_t nops = send_empty_initial_metadata ? 2 : 1;
+  grpc_op ops[3];
+  size_t nops = 1;
   ops[0].op = GRPC_OP_SEND_STATUS_FROM_SERVER;
   ops[0].data.send_status_from_server.status = status_code;
   ops[0].data.send_status_from_server.status_details =
@@ -731,12 +732,23 @@
       ctx->send_status_from_server.trailing_metadata.metadata;
   ops[0].flags = 0;
   ops[0].reserved = NULL;
-  ops[1].op = GRPC_OP_SEND_INITIAL_METADATA;
-  ops[1].data.send_initial_metadata.count = 0;
-  ops[1].data.send_initial_metadata.metadata = NULL;
-  ops[1].flags = 0;
-  ops[1].reserved = NULL;
-
+  if (optional_send_buffer) {
+    ops[nops].op = GRPC_OP_SEND_MESSAGE;
+    ctx->send_message = string_to_byte_buffer(optional_send_buffer,
+                                              optional_send_buffer_len);
+    ops[nops].data.send_message = ctx->send_message;
+    ops[nops].flags = write_flags;
+    ops[nops].reserved = NULL;
+    nops ++;
+  }
+  if (send_empty_initial_metadata) {
+    ops[nops].op = GRPC_OP_SEND_INITIAL_METADATA;
+    ops[nops].data.send_initial_metadata.count = 0;
+    ops[nops].data.send_initial_metadata.metadata = NULL;
+    ops[nops].flags = 0;
+    ops[nops].reserved = NULL;
+    nops++;
+  }
   return grpc_call_start_batch(call, ops, nops, ctx, NULL);
 }
 
diff --git a/src/csharp/tests.json b/src/csharp/tests.json
index f733352..f6af340 100644
--- a/src/csharp/tests.json
+++ b/src/csharp/tests.json
@@ -1,5 +1,6 @@
 {
   "Grpc.Core.Tests": [
+    "Grpc.Core.Internal.Tests.AsyncCallServerTest",
     "Grpc.Core.Internal.Tests.AsyncCallTest",
     "Grpc.Core.Internal.Tests.ChannelArgsSafeHandleTest",
     "Grpc.Core.Internal.Tests.CompletionQueueEventTest",
diff --git a/src/node/test/math/math_server.js b/src/node/test/math/math_server.js
index fa05ed0..5e3d1dd 100644
--- a/src/node/test/math/math_server.js
+++ b/src/node/test/math/math_server.js
@@ -68,7 +68,7 @@
 function mathFib(stream) {
   // Here, call is a standard writable Node object Stream
   var previous = 0, current = 1;
-  for (var i = 0; i < stream.request.limit; i++) {
+  for (var i = 0; i < stream.request.getLimit(); i++) {
     var response = new math.Num();
     response.setNum(current);
     stream.write(response);
diff --git a/src/node/tools/bin/protoc.js b/src/node/tools/bin/protoc.js
index 0c6d7ce..53fc5dc 100755
--- a/src/node/tools/bin/protoc.js
+++ b/src/node/tools/bin/protoc.js
@@ -43,12 +43,15 @@
 var path = require('path');
 var execFile = require('child_process').execFile;
 
-var protoc = path.resolve(__dirname, 'protoc');
+var exe_ext = process.platform === 'win32' ? '.exe' : '';
 
-execFile(protoc, process.argv.slice(2), function(error, stdout, stderr) {
+var protoc = path.resolve(__dirname, 'protoc' + exe_ext);
+
+var child_process = execFile(protoc, process.argv.slice(2), function(error, stdout, stderr) {
   if (error) {
     throw error;
   }
-  console.log(stdout);
-  console.log(stderr);
 });
+
+child_process.stdout.pipe(process.stdout);
+child_process.stderr.pipe(process.stderr);
diff --git a/src/node/tools/bin/protoc_plugin.js b/src/node/tools/bin/protoc_plugin.js
index 0e0bb94..857882e 100755
--- a/src/node/tools/bin/protoc_plugin.js
+++ b/src/node/tools/bin/protoc_plugin.js
@@ -43,12 +43,16 @@
 var path = require('path');
 var execFile = require('child_process').execFile;
 
-var protoc = path.resolve(__dirname, 'grpc_node_plugin');
+var exe_ext = process.platform === 'win32' ? '.exe' : '';
 
-execFile(protoc, process.argv.slice(2), function(error, stdout, stderr) {
+var plugin = path.resolve(__dirname, 'grpc_node_plugin' + exe_ext);
+
+var child_process = execFile(plugin, process.argv.slice(2), {encoding: 'buffer'}, function(error, stdout, stderr) {
   if (error) {
     throw error;
   }
-  console.log(stdout);
-  console.log(stderr);
 });
+
+process.stdin.pipe(child_process.stdin);
+child_process.stdout.pipe(process.stdout);
+child_process.stderr.pipe(process.stderr);
diff --git a/src/node/tools/package.json b/src/node/tools/package.json
index d98ed0b..d4849c2 100644
--- a/src/node/tools/package.json
+++ b/src/node/tools/package.json
@@ -1,6 +1,6 @@
 {
   "name": "grpc-tools",
-  "version": "0.14.0-dev",
+  "version": "0.15.0-dev",
   "author": "Google Inc.",
   "description": "Tools for developing with gRPC on Node.js",
   "homepage": "http://www.grpc.io/",
@@ -16,8 +16,8 @@
     }
   ],
   "bin": {
-    "grpc-tools-protoc": "./bin/protoc.js",
-    "grpc-tools-plugin": "./bin/protoc_plugin.js"
+    "grpc_tools_node_protoc": "./bin/protoc.js",
+    "grpc_tools_node_protoc_plugin": "./bin/protoc_plugin.js"
   },
   "scripts": {
     "install": "./node_modules/.bin/node-pre-gyp install"
diff --git a/src/objective-c/BoringSSL.podspec b/src/objective-c/BoringSSL.podspec
index 4a6df91..7d1de80 100644
--- a/src/objective-c/BoringSSL.podspec
+++ b/src/objective-c/BoringSSL.podspec
@@ -31,7 +31,7 @@
 
 Pod::Spec.new do |s|
   s.name     = 'BoringSSL'
-  s.version  = '2.0'
+  s.version  = '3.0'
   s.summary  = 'BoringSSL is a fork of OpenSSL that is designed to meet Google’s needs.'
   # Adapted from the homepage:
   s.description = <<-DESC
@@ -67,7 +67,7 @@
   s.authors  = 'Adam Langley', 'David Benjamin', 'Matt Braithwaite'
 
   s.source = { :git => 'https://boringssl.googlesource.com/boringssl',
-               :tag => 'version_for_cocoapods_2.0' }
+               :tag => 'version_for_cocoapods_3.0' }
 
   s.source_files = 'ssl/*.{h,c}',
                    'ssl/**/*.{h,c}',
diff --git a/src/php/ext/grpc/call.c b/src/php/ext/grpc/call.c
index a0f3d16..a2c1c08 100644
--- a/src/php/ext/grpc/call.c
+++ b/src/php/ext/grpc/call.c
@@ -96,6 +96,7 @@
   wrapped_grpc_call *call =
       (wrapped_grpc_call *)zend_object_store_get_object(call_object TSRMLS_CC);
   call->wrapped = wrapped;
+  call->owned = owned;
   return call_object;
 }
 
diff --git a/src/php/tests/interop/interop_client.php b/src/php/tests/interop/interop_client.php
index aebf80f..565bfce 100755
--- a/src/php/tests/interop/interop_client.php
+++ b/src/php/tests/interop/interop_client.php
@@ -1,7 +1,7 @@
 <?php
 /*
  *
- * Copyright 2015, Google Inc.
+ * Copyright 2015-2016, Google Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -388,141 +388,158 @@
              'Call status was not DEADLINE_EXCEEDED');
 }
 
-$args = getopt('', ['server_host:', 'server_port:', 'test_case:',
-                    'use_tls::', 'use_test_ca::',
-                    'server_host_override:', 'oauth_scope:',
-                    'default_service_account:', ]);
-if (!array_key_exists('server_host', $args)) {
-    throw new Exception('Missing argument: --server_host is required');
-}
-if (!array_key_exists('server_port', $args)) {
-    throw new Exception('Missing argument: --server_port is required');
-}
-if (!array_key_exists('test_case', $args)) {
-    throw new Exception('Missing argument: --test_case is required');
-}
-
-if ($args['server_port'] == 443) {
-    $server_address = $args['server_host'];
-} else {
-    $server_address = $args['server_host'].':'.$args['server_port'];
-}
-
-$test_case = $args['test_case'];
-
-$host_override = 'foo.test.google.fr';
-if (array_key_exists('server_host_override', $args)) {
-    $host_override = $args['server_host_override'];
-}
-
-$use_tls = false;
-if (array_key_exists('use_tls', $args) &&
-    $args['use_tls'] != 'false') {
-    $use_tls = true;
-}
-
-$use_test_ca = false;
-if (array_key_exists('use_test_ca', $args) &&
-    $args['use_test_ca'] != 'false') {
-    $use_test_ca = true;
-}
-
-$opts = [];
-
-if ($use_tls) {
-    if ($use_test_ca) {
-        $ssl_credentials = Grpc\ChannelCredentials::createSsl(
-            file_get_contents(dirname(__FILE__).'/../data/ca.pem'));
-    } else {
-        $ssl_credentials = Grpc\ChannelCredentials::createSsl();
+function _makeStub($args)
+{
+    if (!array_key_exists('server_host', $args)) {
+        throw new Exception('Missing argument: --server_host is required');
     }
-    $opts['credentials'] = $ssl_credentials;
-    $opts['grpc.ssl_target_name_override'] = $host_override;
-} else {
-    $opts['credentials'] = Grpc\ChannelCredentials::createInsecure();
-}
+    if (!array_key_exists('server_port', $args)) {
+        throw new Exception('Missing argument: --server_port is required');
+    }
+    if (!array_key_exists('test_case', $args)) {
+        throw new Exception('Missing argument: --test_case is required');
+    }
 
-if (in_array($test_case, ['service_account_creds',
-    'compute_engine_creds', 'jwt_token_creds', ])) {
-    if ($test_case == 'jwt_token_creds') {
-        $auth_credentials = ApplicationDefaultCredentials::getCredentials();
+    if ($args['server_port'] == 443) {
+        $server_address = $args['server_host'];
     } else {
+        $server_address = $args['server_host'].':'.$args['server_port'];
+    }
+
+    $test_case = $args['test_case'];
+
+    $host_override = 'foo.test.google.fr';
+    if (array_key_exists('server_host_override', $args)) {
+        $host_override = $args['server_host_override'];
+    }
+
+    $use_tls = false;
+    if (array_key_exists('use_tls', $args) &&
+        $args['use_tls'] != 'false') {
+        $use_tls = true;
+    }
+
+    $use_test_ca = false;
+    if (array_key_exists('use_test_ca', $args) &&
+        $args['use_test_ca'] != 'false') {
+        $use_test_ca = true;
+    }
+
+    $opts = [];
+
+    if ($use_tls) {
+        if ($use_test_ca) {
+            $ssl_credentials = Grpc\ChannelCredentials::createSsl(
+                file_get_contents(dirname(__FILE__).'/../data/ca.pem'));
+        } else {
+            $ssl_credentials = Grpc\ChannelCredentials::createSsl();
+        }
+        $opts['credentials'] = $ssl_credentials;
+        $opts['grpc.ssl_target_name_override'] = $host_override;
+    } else {
+        $opts['credentials'] = Grpc\ChannelCredentials::createInsecure();
+    }
+
+    if (in_array($test_case, ['service_account_creds',
+                              'compute_engine_creds', 'jwt_token_creds', ])) {
+        if ($test_case == 'jwt_token_creds') {
+            $auth_credentials = ApplicationDefaultCredentials::getCredentials();
+        } else {
+            $auth_credentials = ApplicationDefaultCredentials::getCredentials(
+                $args['oauth_scope']
+            );
+        }
+        $opts['update_metadata'] = $auth_credentials->getUpdateMetadataFunc();
+    }
+
+    if ($test_case == 'oauth2_auth_token') {
         $auth_credentials = ApplicationDefaultCredentials::getCredentials(
             $args['oauth_scope']
         );
+        $token = $auth_credentials->fetchAuthToken();
+        $update_metadata =
+            function ($metadata,
+                      $authUri = null,
+                      ClientInterface $client = null) use ($token) {
+                $metadata_copy = $metadata;
+                $metadata_copy[CredentialsLoader::AUTH_METADATA_KEY] =
+                    [sprintf('%s %s',
+                             $token['token_type'],
+                             $token['access_token'])];
+
+                return $metadata_copy;
+            };
+        $opts['update_metadata'] = $update_metadata;
     }
-    $opts['update_metadata'] = $auth_credentials->getUpdateMetadataFunc();
+
+    $stub = new grpc\testing\TestServiceClient($server_address, $opts);
+
+    return $stub;
 }
 
-if ($test_case == 'oauth2_auth_token') {
-    $auth_credentials = ApplicationDefaultCredentials::getCredentials(
-        $args['oauth_scope']
-    );
-    $token = $auth_credentials->fetchAuthToken();
-    $update_metadata =
-        function ($metadata,
-                  $authUri = null,
-                  ClientInterface $client = null) use ($token) {
-            $metadata_copy = $metadata;
-            $metadata_copy[CredentialsLoader::AUTH_METADATA_KEY] =
-                [sprintf('%s %s',
-                         $token['token_type'],
-                         $token['access_token'])];
+function interop_main($args, $stub = false) {
+    if (!$stub) {
+        $stub = _makeStub($args);
+    }
 
-            return $metadata_copy;
-        };
-    $opts['update_metadata'] = $update_metadata;
+    $test_case = $args['test_case'];
+    echo "Running test case $test_case\n";
+
+    switch ($test_case) {
+        case 'empty_unary':
+            emptyUnary($stub);
+            break;
+        case 'large_unary':
+            largeUnary($stub);
+            break;
+        case 'client_streaming':
+            clientStreaming($stub);
+            break;
+        case 'server_streaming':
+            serverStreaming($stub);
+            break;
+        case 'ping_pong':
+            pingPong($stub);
+            break;
+        case 'empty_stream':
+            emptyStream($stub);
+            break;
+        case 'cancel_after_begin':
+            cancelAfterBegin($stub);
+            break;
+        case 'cancel_after_first_response':
+            cancelAfterFirstResponse($stub);
+            break;
+        case 'timeout_on_sleeping_server':
+            timeoutOnSleepingServer($stub);
+            break;
+        case 'service_account_creds':
+            serviceAccountCreds($stub, $args);
+            break;
+        case 'compute_engine_creds':
+            computeEngineCreds($stub, $args);
+            break;
+        case 'jwt_token_creds':
+            jwtTokenCreds($stub, $args);
+            break;
+        case 'oauth2_auth_token':
+            oauth2AuthToken($stub, $args);
+            break;
+        case 'per_rpc_creds':
+            perRpcCreds($stub, $args);
+            break;
+        default:
+            echo "Unsupported test case $test_case\n";
+            exit(1);
+    }
+
+    return $stub;
 }
 
-$stub = new grpc\testing\TestServiceClient($server_address, $opts);
-
-echo "Connecting to $server_address\n";
-echo "Running test case $test_case\n";
-
-switch ($test_case) {
-    case 'empty_unary':
-        emptyUnary($stub);
-        break;
-    case 'large_unary':
-        largeUnary($stub);
-        break;
-    case 'client_streaming':
-        clientStreaming($stub);
-        break;
-    case 'server_streaming':
-        serverStreaming($stub);
-        break;
-    case 'ping_pong':
-        pingPong($stub);
-        break;
-    case 'empty_stream':
-        emptyStream($stub);
-        break;
-    case 'cancel_after_begin':
-        cancelAfterBegin($stub);
-        break;
-    case 'cancel_after_first_response':
-        cancelAfterFirstResponse($stub);
-        break;
-    case 'timeout_on_sleeping_server':
-        timeoutOnSleepingServer($stub);
-        break;
-    case 'service_account_creds':
-        serviceAccountCreds($stub, $args);
-        break;
-    case 'compute_engine_creds':
-        computeEngineCreds($stub, $args);
-        break;
-    case 'jwt_token_creds':
-        jwtTokenCreds($stub, $args);
-        break;
-    case 'oauth2_auth_token':
-        oauth2AuthToken($stub, $args);
-        break;
-    case 'per_rpc_creds':
-        perRpcCreds($stub, $args);
-        break;
-    default:
-        echo "Unsupported test case $test_case\n";
-        exit(1);
+if (isset($_SERVER['PHP_SELF']) && preg_match('/interop_client/', $_SERVER['PHP_SELF'])) {
+    $args = getopt('', ['server_host:', 'server_port:', 'test_case:',
+                        'use_tls::', 'use_test_ca::',
+                        'server_host_override:', 'oauth_scope:',
+                        'default_service_account:', ]);
+    interop_main($args);
 }
diff --git a/examples/node/greeter_client.js b/src/php/tests/interop/metrics_client.php
similarity index 72%
copy from examples/node/greeter_client.js
copy to src/php/tests/interop/metrics_client.php
index 2820acb..46f4212 100644
--- a/examples/node/greeter_client.js
+++ b/src/php/tests/interop/metrics_client.php
@@ -1,6 +1,7 @@
+<?php
 /*
  *
- * Copyright 2015, Google Inc.
+ * Copyright 2016, Google Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,23 +32,18 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+$args = getopt('', ['metrics_server_address:', 'total_only::']);
+$parts = explode(':', $args['metrics_server_address']);
+$server_host = $parts[0];
+$server_port = (count($parts) == 2) ? $parts[1] : '';
 
-var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
-
-function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
-                                       grpc.credentials.createInsecure());
-  var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
-  } else {
-    user = 'world';
-  }
-  client.sayHello({name: user}, function(err, response) {
-    console.log('Greeting:', response.message);
-  });
+$socket = socket_create(AF_INET, SOCK_STREAM, 0);
+if (@!socket_connect($socket, $server_host, $server_port)) {
+  echo "Cannot connect to merics server...\n";
+  exit(1);
 }
-
-main();
+socket_write($socket, 'qps');
+while ($out = socket_read($socket, 1024)) {
+  echo "$out\n";
+}
+socket_close($socket);
diff --git a/src/php/tests/interop/stress_client.php b/src/php/tests/interop/stress_client.php
new file mode 100644
index 0000000..2339f0d
--- /dev/null
+++ b/src/php/tests/interop/stress_client.php
@@ -0,0 +1,116 @@
+<?php
+/*
+ *
+ * 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_once('interop_client.php');
+
+function stress_main($args) {
+  mt_srand();
+  set_time_limit(0);
+
+  // open socket to listen as metrics server
+  $socket = socket_create(AF_INET, SOCK_STREAM, 0);
+  socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
+  if (@!socket_bind($socket, 'localhost', $args['metrics_port'])) {
+    echo "Cannot create socket for metrics server...\n";
+    exit(1);
+  }
+  socket_listen($socket);
+  socket_set_nonblock($socket);
+
+  $start_time = microtime(true);
+  $count = 0;
+  $deadline = $args['test_duration_secs'] ?
+              ($start_time + $args['test_duration_secs']) : false;
+  $num_test_cases = count($args['test_cases']);
+  $stub = false;
+
+  while (true) {
+    $current_time = microtime(true);
+    if ($deadline && $current_time > $deadline) {
+      break;
+    }
+    if ($client_connection = socket_accept($socket)) {
+      // there is an incoming request, respond with qps metrics
+      $input = socket_read($client_connection, 1024);
+      $qps = round($count / ($current_time - $start_time));
+      socket_write($client_connection, "qps: $qps");
+      socket_close($client_connection);
+    } else {
+      // do actual work, run one interop test case
+      $args['test_case'] =
+          $args['test_cases'][mt_rand(0, $num_test_cases - 1)];
+      $stub = @interop_main($args, $stub);
+      $count++;
+    }
+  }
+  socket_close($socket);
+  echo "Number of interop tests run in $args[test_duration_secs] seconds: $count.\n";
+}
+
+// process command line arguments
+$raw_args = getopt('',
+  ['server_addresses::',
+   'test_cases:',
+   'metrics_port::',
+   'test_duration_secs::',
+   'num_channels_per_server::',
+   'num_stubs_per_channel::']);
+
+$args = [];
+
+if (empty($raw_args['server_addresses'])) {
+  $args['server_host'] = 'localhost';
+  $args['server_port'] = '8080';
+} else {
+  $parts = explode(':', $raw_args['server_addresses']);
+  $args['server_host'] = $parts[0];
+  $args['server_port'] = (count($parts) == 2) ? $parts[1] : '';
+}
+
+$args['metrics_port'] = empty($raw_args['metrics_port']) ?
+  '8081' : $args['metrics_port'];
+
+$args['test_duration_secs'] = empty($raw_args['test_duration_secs']) ||
+  $raw_args['test_duration_secs'] == -1 ?
+  false : $raw_args['test_duration_secs'];
+
+$test_cases = [];
+$test_case_strs = explode(',', $raw_args['test_cases']);
+foreach ($test_case_strs as $test_case_str) {
+  $parts = explode(':', $test_case_str);
+  $test_cases = array_merge($test_cases, array_fill(0, $parts[1], $parts[0]));
+}
+$args['test_cases'] = $test_cases;
+
+stress_main($args);
diff --git a/src/proto/grpc/lb/v0/load_balancer.options b/src/proto/grpc/lb/v0/load_balancer.options
deleted file mode 100644
index 6d4528f..0000000
--- a/src/proto/grpc/lb/v0/load_balancer.options
+++ /dev/null
@@ -1,6 +0,0 @@
-grpc.lb.v0.InitialLoadBalanceRequest.name max_size:128
-grpc.lb.v0.InitialLoadBalanceResponse.client_config max_size:64
-grpc.lb.v0.InitialLoadBalanceResponse.load_balancer_delegate max_size:64
-grpc.lb.v0.Server.ip_address max_size:46
-grpc.lb.v0.Server.load_balance_token max_size:64
-load_balancer.proto no_unions:true
diff --git a/src/proto/grpc/lb/v1/load_balancer.options b/src/proto/grpc/lb/v1/load_balancer.options
new file mode 100644
index 0000000..d903669
--- /dev/null
+++ b/src/proto/grpc/lb/v1/load_balancer.options
@@ -0,0 +1,6 @@
+grpc.lb.v1.InitialLoadBalanceRequest.name max_size:128
+grpc.lb.v1.InitialLoadBalanceResponse.client_config max_size:64
+grpc.lb.v1.InitialLoadBalanceResponse.load_balancer_delegate max_size:64
+grpc.lb.v1.Server.ip_address max_size:46
+grpc.lb.v1.Server.load_balance_token max_size:64
+load_balancer.proto no_unions:true
diff --git a/src/proto/grpc/lb/v0/load_balancer.proto b/src/proto/grpc/lb/v1/load_balancer.proto
similarity index 94%
rename from src/proto/grpc/lb/v0/load_balancer.proto
rename to src/proto/grpc/lb/v1/load_balancer.proto
index e88a4f8..1bcad0b 100644
--- a/src/proto/grpc/lb/v0/load_balancer.proto
+++ b/src/proto/grpc/lb/v1/load_balancer.proto
@@ -29,7 +29,7 @@
 
 syntax = "proto3";
 
-package grpc.lb.v0;
+package grpc.lb.v1;
 
 message Duration {
 
@@ -94,9 +94,8 @@
 
 message InitialLoadBalanceResponse {
   oneof initial_response_type {
-    // Contains gRPC config options like RPC deadline or flow control.
-    // TODO(yetianx): Change to ClientConfig after it is defined.
-    string client_config = 1;
+    // TODO(zhangkun83): ClientConfig not yet defined
+    //ClientConfig client_config = 1;
 
     // This is an application layer redirect that indicates the client should
     // use the specified server for load balancing. When this field is set in
@@ -134,9 +133,7 @@
   // An opaque token that is passed from the client to the server in metadata.
   // The server may expect this token to indicate that the request from the
   // client was load balanced.
-  // TODO(yetianx): Not used right now, and will be used after implementing
-  // load report.
-  bytes load_balance_token = 3;
+  string load_balance_token = 3;
 
   // Indicates whether this particular request should be dropped by the client
   // when this server is chosen from the list.
diff --git a/src/proto/grpc/testing/echo.proto b/src/proto/grpc/testing/echo.proto
index 0eef53a..c596aab 100644
--- a/src/proto/grpc/testing/echo.proto
+++ b/src/proto/grpc/testing/echo.proto
@@ -45,3 +45,7 @@
 service UnimplementedService {
   rpc Unimplemented(EchoRequest) returns (EchoResponse);
 }
+
+// A service without any rpc defined to test coverage.
+service NoRpcService {
+}
diff --git a/src/proto/grpc/testing/echo_messages.proto b/src/proto/grpc/testing/echo_messages.proto
index 1be1966..b405acf 100644
--- a/src/proto/grpc/testing/echo_messages.proto
+++ b/src/proto/grpc/testing/echo_messages.proto
@@ -32,6 +32,12 @@
 
 package grpc.testing;
 
+// Message to be echoed back serialized in trailer.
+message DebugInfo {
+  repeated string stack_entries = 1;
+  string detail = 2;
+}
+
 message RequestParams {
   bool echo_deadline = 1;
   int32 client_cancel_after_us = 2;
@@ -43,6 +49,7 @@
   string expected_client_identity = 8; // will force check_auth_context.
   bool skip_cancelled_check = 9;
   string expected_transport_security_type = 10;
+  DebugInfo debug_info = 11;
 }
 
 message EchoRequest {
diff --git a/src/python/grpcio/README.rst b/src/python/grpcio/README.rst
index cb3f6b8..afc4fe6 100644
--- a/src/python/grpcio/README.rst
+++ b/src/python/grpcio/README.rst
@@ -48,6 +48,7 @@
   $ export REPO_ROOT=grpc  # REPO_ROOT can be any directory of your choice
   $ git clone https://github.com/grpc/grpc.git $REPO_ROOT
   $ cd $REPO_ROOT
+  $ git submodule update --init
 
   # For the next two commands do `sudo pip install` if you get permission-denied errors
   $ pip install -rrequirements.txt
diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py
index 7086519..b844a14 100644
--- a/src/python/grpcio/grpc/__init__.py
+++ b/src/python/grpcio/grpc/__init__.py
@@ -1,4 +1,4 @@
-# Copyright 2015, Google Inc.
+# Copyright 2015-2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,4 +27,5 @@
 # (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__('pkg_resources').declare_namespace(__name__)
 
diff --git a/src/python/grpcio/grpc/_cython/imports.generated.c b/src/python/grpcio/grpc/_cython/imports.generated.c
index f0a40db..0955147 100644
--- a/src/python/grpcio/grpc/_cython/imports.generated.c
+++ b/src/python/grpcio/grpc/_cython/imports.generated.c
@@ -125,6 +125,7 @@
 grpc_header_nonbin_value_is_legal_type grpc_header_nonbin_value_is_legal_import;
 grpc_is_binary_header_type grpc_is_binary_header_import;
 grpc_call_error_to_string_type grpc_call_error_to_string_import;
+grpc_cronet_secure_channel_create_type grpc_cronet_secure_channel_create_import;
 grpc_auth_property_iterator_next_type grpc_auth_property_iterator_next_import;
 grpc_auth_context_property_iterator_type grpc_auth_context_property_iterator_import;
 grpc_auth_context_peer_identity_type grpc_auth_context_peer_identity_import;
@@ -395,6 +396,7 @@
   grpc_header_nonbin_value_is_legal_import = (grpc_header_nonbin_value_is_legal_type) GetProcAddress(library, "grpc_header_nonbin_value_is_legal");
   grpc_is_binary_header_import = (grpc_is_binary_header_type) GetProcAddress(library, "grpc_is_binary_header");
   grpc_call_error_to_string_import = (grpc_call_error_to_string_type) GetProcAddress(library, "grpc_call_error_to_string");
+  grpc_cronet_secure_channel_create_import = (grpc_cronet_secure_channel_create_type) GetProcAddress(library, "grpc_cronet_secure_channel_create");
   grpc_auth_property_iterator_next_import = (grpc_auth_property_iterator_next_type) GetProcAddress(library, "grpc_auth_property_iterator_next");
   grpc_auth_context_property_iterator_import = (grpc_auth_context_property_iterator_type) GetProcAddress(library, "grpc_auth_context_property_iterator");
   grpc_auth_context_peer_identity_import = (grpc_auth_context_peer_identity_type) GetProcAddress(library, "grpc_auth_context_peer_identity");
diff --git a/src/python/grpcio/grpc/_cython/imports.generated.h b/src/python/grpcio/grpc/_cython/imports.generated.h
index d5e810b..54c8aaa 100644
--- a/src/python/grpcio/grpc/_cython/imports.generated.h
+++ b/src/python/grpcio/grpc/_cython/imports.generated.h
@@ -43,6 +43,7 @@
 #include <grpc/census.h>
 #include <grpc/compression.h>
 #include <grpc/grpc.h>
+#include <grpc/grpc_cronet.h>
 #include <grpc/grpc_security.h>
 #include <grpc/impl/codegen/alloc.h>
 #include <grpc/impl/codegen/byte_buffer.h>
@@ -325,6 +326,9 @@
 typedef const char *(*grpc_call_error_to_string_type)(grpc_call_error error);
 extern grpc_call_error_to_string_type grpc_call_error_to_string_import;
 #define grpc_call_error_to_string grpc_call_error_to_string_import
+typedef grpc_channel *(*grpc_cronet_secure_channel_create_type)(void *engine, const char *target, const grpc_channel_args *args, void *reserved);
+extern grpc_cronet_secure_channel_create_type grpc_cronet_secure_channel_create_import;
+#define grpc_cronet_secure_channel_create grpc_cronet_secure_channel_create_import
 typedef const grpc_auth_property *(*grpc_auth_property_iterator_next_type)(grpc_auth_property_iterator *it);
 extern grpc_auth_property_iterator_next_type grpc_auth_property_iterator_next_import;
 #define grpc_auth_property_iterator_next grpc_auth_property_iterator_next_import
diff --git a/src/python/grpcio/grpc/beta/implementations.py b/src/python/grpcio/grpc/beta/implementations.py
index 742e94d..822f593 100644
--- a/src/python/grpcio/grpc/beta/implementations.py
+++ b/src/python/grpcio/grpc/beta/implementations.py
@@ -1,4 +1,4 @@
-# Copyright 2015, Google Inc.
+# Copyright 2015-2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -188,12 +188,13 @@
   Args:
     host: The name of the remote host to which to connect.
     port: The port of the remote host to which to connect.
+      If None only the 'host' part will be used.
 
   Returns:
     A Channel to the remote host through which RPCs may be conducted.
   """
   intermediary_low_channel = _intermediary_low.Channel(
-      '%s:%d' % (host, port), None)
+      '%s:%d' % (host, port) if port else host, None)
   return Channel(intermediary_low_channel._internal, intermediary_low_channel)  # pylint: disable=protected-access
 
 
@@ -203,13 +204,15 @@
   Args:
     host: The name of the remote host to which to connect.
     port: The port of the remote host to which to connect.
+      If None only the 'host' part will be used.
     channel_credentials: A ChannelCredentials.
 
   Returns:
     A secure Channel to the remote host through which RPCs may be conducted.
   """
   intermediary_low_channel = _intermediary_low.Channel(
-      '%s:%d' % (host, port), channel_credentials._low_credentials)
+      '%s:%d' % (host, port) if port else host,
+      channel_credentials._low_credentials)
   return Channel(intermediary_low_channel._internal, intermediary_low_channel)  # pylint: disable=protected-access
 
 
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index dab6253..162191b 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -95,6 +95,7 @@
   'src/core/lib/iomgr/endpoint_pair_posix.c',
   'src/core/lib/iomgr/endpoint_pair_windows.c',
   'src/core/lib/iomgr/ev_poll_and_epoll_posix.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',
@@ -222,8 +223,11 @@
   'src/core/ext/client_config/uri_parser.c',
   'src/core/ext/transport/chttp2/server/insecure/server_chttp2.c',
   'src/core/ext/transport/chttp2/client/insecure/channel_create.c',
+  'src/core/ext/transport/cronet/client/secure/cronet_channel_create.c',
+  'src/core/ext/transport/cronet/transport/cronet_api_dummy.c',
+  'src/core/ext/transport/cronet/transport/cronet_transport.c',
   'src/core/ext/lb_policy/grpclb/load_balancer_api.c',
-  'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c',
+  'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c',
   'third_party/nanopb/pb_common.c',
   'third_party/nanopb/pb_decode.c',
   'third_party/nanopb/pb_encode.c',
diff --git a/src/python/grpcio/grpc_version.py b/src/python/grpcio/grpc_version.py
index 873b4e2..0c13104 100644
--- a/src/python/grpcio/grpc_version.py
+++ b/src/python/grpcio/grpc_version.py
@@ -29,4 +29,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_version.py.template`!!!
 
-VERSION='0.14.0.dev0'
+VERSION='0.15.0.dev0'
diff --git a/src/python/grpcio/precompiled.py b/src/python/grpcio/precompiled.py
deleted file mode 100644
index b6aa7fc..0000000
--- a/src/python/grpcio/precompiled.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# Copyright 2015, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-import os
-import platform
-import shutil
-import sys
-import sysconfig
-
-import setuptools
-
-import commands
-import grpc_version
-
-try:
-  from urllib2 import urlopen
-except ImportError:
-  from urllib.request import urlopen
-
-PYTHON_STEM = os.path.dirname(os.path.abspath(__file__))
-BINARIES_REPOSITORY = os.environ.get(
-    'GRPC_PYTHON_BINARIES_REPOSITORY',
-    'https://storage.googleapis.com/grpc-precompiled-binaries/python')
-USE_PRECOMPILED_BINARIES = bool(int(os.environ.get(
-    'GRPC_PYTHON_USE_PRECOMPILED_BINARIES', '1')))
-
-def _tagged_ext_name(base):
-  uname = platform.uname()
-  tags = (
-      grpc_version.VERSION,
-      'py{}'.format(sysconfig.get_python_version()),
-      uname[0],
-      uname[4],
-  )
-  ucs = 'ucs{}'.format(sysconfig.get_config_var('Py_UNICODE_SIZE'))
-  return '{base}-{tags}-{ucs}'.format(
-      base=base, tags='-'.join(tags), ucs=ucs)
-
-
-class BuildTaggedExt(setuptools.Command):
-
-  description = 'build the gRPC tagged extensions'
-  user_options = []
-
-  def initialize_options(self):
-    # distutils requires this override.
-    pass
-
-  def finalize_options(self):
-    # distutils requires this override.
-    pass
-
-  def run(self):
-    if 'linux' in sys.platform:
-      self.run_command('build_ext')
-      try:
-        os.makedirs('dist/')
-      except OSError:
-        pass
-      shutil.copyfile(
-          os.path.join(PYTHON_STEM, 'grpc/_cython/cygrpc.so'),
-          'dist/{}.so'.format(_tagged_ext_name('cygrpc')))
-    else:
-      sys.stderr.write('nothing to do for build_tagged_ext\n')
-
-
-def update_setup_arguments(setup_arguments):
-  if not USE_PRECOMPILED_BINARIES:
-    sys.stderr.write('not using precompiled extension')
-    return
-  url = '{}/{}.so'.format(BINARIES_REPOSITORY, _tagged_ext_name('cygrpc'))
-  target_path = os.path.join(PYTHON_STEM, 'grpc/_cython/cygrpc.so')
-  try:
-    extension = urlopen(url).read()
-  except:
-    sys.stderr.write(
-        'could not download precompiled extension: {}\n'.format(url))
-    return
-  try:
-    with open(target_path, 'w') as target:
-      target.write(extension)
-    setup_arguments['ext_modules'] = []
-  except:
-    sys.stderr.write(
-        'could not write precompiled extension to directory: {} -> {}\n'
-            .format(url, target_path))
-    return
-  setup_arguments['package_data']['grpc._cython'].append('cygrpc.so')
diff --git a/src/python/grpcio/tests/protoc_plugin/beta_python_plugin_test.py b/src/python/grpcio/tests/protoc_plugin/beta_python_plugin_test.py
index 3dc3042..7466f88 100644
--- a/src/python/grpcio/tests/protoc_plugin/beta_python_plugin_test.py
+++ b/src/python/grpcio/tests/protoc_plugin/beta_python_plugin_test.py
@@ -59,11 +59,12 @@
 
 class _ServicerMethods(object):
 
-  def __init__(self, test_pb2):
+  def __init__(self, response_pb2, payload_pb2):
     self._condition = threading.Condition()
     self._paused = False
     self._fail = False
-    self._test_pb2 = test_pb2
+    self._response_pb2 = response_pb2
+    self._payload_pb2 = payload_pb2
 
   @contextlib.contextmanager
   def pause(self):  # pylint: disable=invalid-name
@@ -90,22 +91,22 @@
         self._condition.wait()
 
   def UnaryCall(self, request, unused_rpc_context):
-    response = self._test_pb2.SimpleResponse()
-    response.payload.payload_type = self._test_pb2.COMPRESSABLE
+    response = self._response_pb2.SimpleResponse()
+    response.payload.payload_type = self._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 = self._test_pb2.StreamingOutputCallResponse()
-      response.payload.payload_type = self._test_pb2.COMPRESSABLE
+      response = self._response_pb2.StreamingOutputCallResponse()
+      response.payload.payload_type = self._payload_pb2.COMPRESSABLE
       response.payload.payload_compressable = 'a' * parameter.size
       self._control()
       yield response
 
   def StreamingInputCall(self, request_iter, unused_rpc_context):
-    response = self._test_pb2.StreamingInputCallResponse()
+    response = self._response_pb2.StreamingInputCallResponse()
     aggregated_payload_size = 0
     for request in request_iter:
       aggregated_payload_size += len(request.payload.payload_compressable)
@@ -116,8 +117,8 @@
   def FullDuplexCall(self, request_iter, unused_rpc_context):
     for request in request_iter:
       for parameter in request.response_parameters:
-        response = self._test_pb2.StreamingOutputCallResponse()
-        response.payload.payload_type = self._test_pb2.COMPRESSABLE
+        response = self._response_pb2.StreamingOutputCallResponse()
+        response.payload.payload_type = self._payload_pb2.COMPRESSABLE
         response.payload.payload_compressable = 'a' * parameter.size
         self._control()
         yield response
@@ -126,8 +127,8 @@
     responses = []
     for request in request_iter:
       for parameter in request.response_parameters:
-        response = self._test_pb2.StreamingOutputCallResponse()
-        response.payload.payload_type = self._test_pb2.COMPRESSABLE
+        response = self._response_pb2.StreamingOutputCallResponse()
+        response.payload.payload_type = self._payload_pb2.COMPRESSABLE
         response.payload.payload_compressable = 'a' * parameter.size
         self._control()
         responses.append(response)
@@ -136,23 +137,25 @@
 
 
 @contextlib.contextmanager
-def _CreateService(test_pb2):
+def _CreateService(service_pb2, response_pb2, payload_pb2):
   """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.
 
   Args:
-    test_pb2: The test_pb2 module generated by this test.
+    service_pb2: The service_pb2 module generated by this test.
+    response_pb2: The response_pb2 module generated by this test
+    payload_pb2: The payload_pb2 module generated by this test
 
   Yields:
     A (servicer_methods, stub) pair where servicer_methods is the back-end of
       the service bound to the stub and and stub is the stub on which to invoke
       RPCs.
   """
-  servicer_methods = _ServicerMethods(test_pb2)
+  servicer_methods = _ServicerMethods(response_pb2, payload_pb2)
 
-  class Servicer(getattr(test_pb2, SERVICER_IDENTIFIER)):
+  class Servicer(getattr(service_pb2, SERVICER_IDENTIFIER)):
 
     def UnaryCall(self, request, context):
       return servicer_methods.UnaryCall(request, context)
@@ -170,55 +173,52 @@
       return servicer_methods.HalfDuplexCall(request_iter, context)
 
   servicer = Servicer()
-  server = getattr(test_pb2, SERVER_FACTORY_IDENTIFIER)(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(test_pb2, STUB_FACTORY_IDENTIFIER)(channel)
-  yield servicer_methods, stub
+  stub = getattr(service_pb2, STUB_FACTORY_IDENTIFIER)(channel)
+  yield (servicer_methods, stub)
   server.stop(0)
 
 
 @contextlib.contextmanager
-def _CreateIncompleteService(test_pb2):
+def _CreateIncompleteService(service_pb2):
   """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.
-
   Args:
-    test_pb2: The test_pb2 module generated by this test.
-
+    service_pb2: The service_pb2 module generated by this test.
   Yields:
     A (servicer_methods, stub) pair where servicer_methods is the back-end of
       the service bound to the stub and and stub is the stub on which to invoke
       RPCs.
   """
-  servicer_methods = _ServicerMethods(test_pb2)
 
-  class Servicer(getattr(test_pb2, SERVICER_IDENTIFIER)):
+  class Servicer(getattr(service_pb2, SERVICER_IDENTIFIER)):
     pass
 
   servicer = Servicer()
-  server = getattr(test_pb2, SERVER_FACTORY_IDENTIFIER)(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(test_pb2, STUB_FACTORY_IDENTIFIER)(channel)
-  yield servicer_methods, stub
+  stub = getattr(service_pb2, STUB_FACTORY_IDENTIFIER)(channel)
+  yield None, stub
   server.stop(0)
 
 
-def _streaming_input_request_iterator(test_pb2):
+def _streaming_input_request_iterator(request_pb2, payload_pb2):
   for _ in range(3):
-    request = test_pb2.StreamingInputCallRequest()
-    request.payload.payload_type = test_pb2.COMPRESSABLE
+    request = request_pb2.StreamingInputCallRequest()
+    request.payload.payload_type = payload_pb2.COMPRESSABLE
     request.payload.payload_compressable = 'a'
     yield request
 
 
-def _streaming_output_request(test_pb2):
-  request = test_pb2.StreamingOutputCallRequest()
+def _streaming_output_request(request_pb2):
+  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)
@@ -226,11 +226,11 @@
   return request
 
 
-def _full_duplex_request_iterator(test_pb2):
-  request = test_pb2.StreamingOutputCallRequest()
+def _full_duplex_request_iterator(request_pb2):
+  request = request_pb2.StreamingOutputCallRequest()
   request.response_parameters.add(size=1, interval_us=0)
   yield request
-  request = test_pb2.StreamingOutputCallRequest()
+  request = request_pb2.StreamingOutputCallRequest()
   request.response_parameters.add(size=2, interval_us=0)
   request.response_parameters.add(size=3, interval_us=0)
   yield request
@@ -250,8 +250,6 @@
     protoc_command = 'protoc'
     protoc_plugin_filename = distutils.spawn.find_executable(
         'grpc_python_plugin')
-    test_proto_filename = pkg_resources.resource_filename(
-        'tests.protoc_plugin', 'protoc_plugin_test.proto')
     if not os.path.isfile(protoc_command):
       # Assume that if we haven't built protoc that it's on the system.
       protoc_command = 'protoc'
@@ -259,19 +257,44 @@
     # Ensure that the output directory exists.
     self.outdir = tempfile.mkdtemp()
 
+    # Find all proto files
+    paths = []
+    root_dir = os.path.dirname(os.path.realpath(__file__))
+    proto_dir = os.path.join(root_dir, 'protos')
+    for walk_root, _, filenames in os.walk(proto_dir):
+      for filename in filenames:
+        if filename.endswith('.proto'):
+          path = os.path.join(walk_root, filename)
+          paths.append(path)
+
     # Invoke protoc with the plugin.
     cmd = [
         protoc_command,
         '--plugin=protoc-gen-python-grpc=%s' % protoc_plugin_filename,
-        '-I .',
+        '-I %s' % root_dir,
         '--python_out=%s' % self.outdir,
-        '--python-grpc_out=%s' % self.outdir,
-        os.path.basename(test_proto_filename),
-    ]
+        '--python-grpc_out=%s' % self.outdir
+    ] + paths
     subprocess.check_call(' '.join(cmd), shell=True, env=os.environ,
-                          cwd=os.path.dirname(test_proto_filename))
+                          cwd=os.path.dirname(os.path.realpath(__file__)))
+
+    # Generated proto directories dont include __init__.py, but
+    # these are needed for python package resolution
+    for walk_root, _, _ in os.walk(os.path.join(self.outdir, 'protos')):
+      path = os.path.join(walk_root, '__init__.py')
+      open(path, 'a').close()
+
     sys.path.insert(0, self.outdir)
 
+    import protos.payload.test_payload_pb2 as payload_pb2  # pylint: disable=g-import-not-at-top
+    import protos.requests.r.test_requests_pb2 as request_pb2  # pylint: disable=g-import-not-at-top
+    import protos.responses.test_responses_pb2 as response_pb2  # pylint: disable=g-import-not-at-top
+    import protos.service.test_service_pb2 as service_pb2  # pylint: disable=g-import-not-at-top
+    self._payload_pb2 = payload_pb2
+    self._request_pb2 = request_pb2
+    self._response_pb2 = response_pb2
+    self._service_pb2 = service_pb2
+
   def tearDown(self):
     try:
       shutil.rmtree(self.outdir)
@@ -282,43 +305,40 @@
 
   def testImportAttributes(self):
     # check that we can access the generated module and its members.
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    self.assertIsNotNone(getattr(test_pb2, SERVICER_IDENTIFIER, None))
-    self.assertIsNotNone(getattr(test_pb2, STUB_IDENTIFIER, None))
-    self.assertIsNotNone(getattr(test_pb2, SERVER_FACTORY_IDENTIFIER, None))
-    self.assertIsNotNone(getattr(test_pb2, STUB_FACTORY_IDENTIFIER, None))
+    self.assertIsNotNone(
+        getattr(self._service_pb2, SERVICER_IDENTIFIER, None))
+    self.assertIsNotNone(
+        getattr(self._service_pb2, STUB_IDENTIFIER, None))
+    self.assertIsNotNone(
+        getattr(self._service_pb2, SERVER_FACTORY_IDENTIFIER, None))
+    self.assertIsNotNone(
+        getattr(self._service_pb2, STUB_FACTORY_IDENTIFIER, None))
 
   def testUpDown(self):
-    import protoc_plugin_test_pb2 as test_pb2
-    moves.reload_module(test_pb2)
-    with _CreateService(test_pb2) as (servicer, stub):
-      request = test_pb2.SimpleRequest(response_size=13)
+    with _CreateService(
+        self._service_pb2, self._response_pb2, self._payload_pb2):
+      self._request_pb2.SimpleRequest(response_size=13)
 
   def testIncompleteServicer(self):
-    import protoc_plugin_test_pb2 as test_pb2
-    moves.reload_module(test_pb2)
-    with _CreateIncompleteService(test_pb2) as (servicer, stub):
-      request = test_pb2.SimpleRequest(response_size=13)
+    with _CreateIncompleteService(self._service_pb2) as (_, stub):
+      request = self._request_pb2.SimpleRequest(response_size=13)
       try:
-        response = stub.UnaryCall(request, test_constants.LONG_TIMEOUT)
+        stub.UnaryCall(request, test_constants.LONG_TIMEOUT)
       except face.AbortionError as error:
         self.assertEqual(interfaces.StatusCode.UNIMPLEMENTED, error.code)
 
   def testUnaryCall(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
-      request = test_pb2.SimpleRequest(response_size=13)
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
+      request = self._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):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    request = test_pb2.SimpleRequest(response_size=13)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
+      request = self._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(
@@ -328,10 +348,9 @@
     self.assertEqual(expected_response, response)
 
   def testUnaryCallFutureExpired(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
-      request = test_pb2.SimpleRequest(response_size=13)
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
+      request = self._request_pb2.SimpleRequest(response_size=13)
       with methods.pause():
         response_future = stub.UnaryCall.future(
             request, test_constants.SHORT_TIMEOUT)
@@ -339,30 +358,27 @@
           response_future.result()
 
   def testUnaryCallFutureCancelled(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    request = test_pb2.SimpleRequest(response_size=13)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
+      request = self._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):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    request = test_pb2.SimpleRequest(response_size=13)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
+      request = self._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):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    request = _streaming_output_request(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
+      request = _streaming_output_request(self._request_pb2)
       responses = stub.StreamingOutputCall(
           request, test_constants.LONG_TIMEOUT)
       expected_responses = methods.StreamingOutputCall(
@@ -372,10 +388,9 @@
         self.assertEqual(expected_response, response)
 
   def testStreamingOutputCallExpired(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    request = _streaming_output_request(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
+      request = _streaming_output_request(self._request_pb2)
       with methods.pause():
         responses = stub.StreamingOutputCall(
             request, test_constants.SHORT_TIMEOUT)
@@ -383,10 +398,9 @@
           list(responses)
 
   def testStreamingOutputCallCancelled(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    request = _streaming_output_request(test_pb2)
-    with _CreateService(test_pb2) as (unused_methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
+      request = _streaming_output_request(self._request_pb2)
       responses = stub.StreamingOutputCall(
           request, test_constants.LONG_TIMEOUT)
       next(responses)
@@ -395,10 +409,9 @@
         next(responses)
 
   def testStreamingOutputCallFailed(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    request = _streaming_output_request(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
+      request = _streaming_output_request(self._request_pb2)
       with methods.fail():
         responses = stub.StreamingOutputCall(request, 1)
         self.assertIsNotNone(responses)
@@ -406,36 +419,38 @@
           next(responses)
 
   def testStreamingInputCall(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
       response = stub.StreamingInputCall(
-          _streaming_input_request_iterator(test_pb2),
+          _streaming_input_request_iterator(
+              self._request_pb2, self._payload_pb2),
           test_constants.LONG_TIMEOUT)
     expected_response = methods.StreamingInputCall(
-        _streaming_input_request_iterator(test_pb2), 'not a real RpcContext!')
+        _streaming_input_request_iterator(self._request_pb2, self._payload_pb2),
+        'not a real RpcContext!')
     self.assertEqual(expected_response, response)
 
   def testStreamingInputCallFuture(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
       with methods.pause():
         response_future = stub.StreamingInputCall.future(
-            _streaming_input_request_iterator(test_pb2),
+            _streaming_input_request_iterator(
+                self._request_pb2, self._payload_pb2),
             test_constants.LONG_TIMEOUT)
       response = response_future.result()
     expected_response = methods.StreamingInputCall(
-        _streaming_input_request_iterator(test_pb2), 'not a real RpcContext!')
+        _streaming_input_request_iterator(self._request_pb2, self._payload_pb2),
+        'not a real RpcContext!')
     self.assertEqual(expected_response, response)
 
   def testStreamingInputCallFutureExpired(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
       with methods.pause():
         response_future = stub.StreamingInputCall.future(
-            _streaming_input_request_iterator(test_pb2),
+            _streaming_input_request_iterator(
+                self._request_pb2, self._payload_pb2),
             test_constants.SHORT_TIMEOUT)
         with self.assertRaises(face.ExpirationError):
           response_future.result()
@@ -443,12 +458,12 @@
             response_future.exception(), face.ExpirationError)
 
   def testStreamingInputCallFutureCancelled(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
       with methods.pause():
         response_future = stub.StreamingInputCall.future(
-            _streaming_input_request_iterator(test_pb2),
+            _streaming_input_request_iterator(
+                self._request_pb2, self._payload_pb2),
             test_constants.LONG_TIMEOUT)
         response_future.cancel()
         self.assertTrue(response_future.cancelled())
@@ -456,32 +471,32 @@
         response_future.result()
 
   def testStreamingInputCallFutureFailed(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
       with methods.fail():
         response_future = stub.StreamingInputCall.future(
-            _streaming_input_request_iterator(test_pb2),
+            _streaming_input_request_iterator(
+                self._request_pb2, self._payload_pb2),
             test_constants.LONG_TIMEOUT)
         self.assertIsNotNone(response_future.exception())
 
   def testFullDuplexCall(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
       responses = stub.FullDuplexCall(
-          _full_duplex_request_iterator(test_pb2), test_constants.LONG_TIMEOUT)
+          _full_duplex_request_iterator(self._request_pb2),
+          test_constants.LONG_TIMEOUT)
       expected_responses = methods.FullDuplexCall(
-          _full_duplex_request_iterator(test_pb2), 'not a real RpcContext!')
+          _full_duplex_request_iterator(self._request_pb2),
+          'not a real RpcContext!')
       for expected_response, response in moves.zip_longest(
           expected_responses, responses):
         self.assertEqual(expected_response, response)
 
   def testFullDuplexCallExpired(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    request_iterator = _full_duplex_request_iterator(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    request_iterator = _full_duplex_request_iterator(self._request_pb2)
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
       with methods.pause():
         responses = stub.FullDuplexCall(
             request_iterator, test_constants.SHORT_TIMEOUT)
@@ -489,10 +504,9 @@
           list(responses)
 
   def testFullDuplexCallCancelled(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
-      request_iterator = _full_duplex_request_iterator(test_pb2)
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
+      request_iterator = _full_duplex_request_iterator(self._request_pb2)
       responses = stub.FullDuplexCall(
           request_iterator, test_constants.LONG_TIMEOUT)
       next(responses)
@@ -501,10 +515,9 @@
         next(responses)
 
   def testFullDuplexCallFailed(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    request_iterator = _full_duplex_request_iterator(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    request_iterator = _full_duplex_request_iterator(self._request_pb2)
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
       with methods.fail():
         responses = stub.FullDuplexCall(
             request_iterator, test_constants.LONG_TIMEOUT)
@@ -513,14 +526,13 @@
           next(responses)
 
   def testHalfDuplexCall(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
       def half_duplex_request_iterator():
-        request = test_pb2.StreamingOutputCallRequest()
+        request = self._request_pb2.StreamingOutputCallRequest()
         request.response_parameters.add(size=1, interval_us=0)
         yield request
-        request = test_pb2.StreamingOutputCallRequest()
+        request = self._request_pb2.StreamingOutputCallRequest()
         request.response_parameters.add(size=2, interval_us=0)
         request.response_parameters.add(size=3, interval_us=0)
         yield request
@@ -533,8 +545,6 @@
         self.assertEqual(expected_response, response)
 
   def testHalfDuplexCallWedged(self):
-    import protoc_plugin_test_pb2 as test_pb2  # pylint: disable=g-import-not-at-top
-    moves.reload_module(test_pb2)
     condition = threading.Condition()
     wait_cell = [False]
     @contextlib.contextmanager
@@ -547,13 +557,14 @@
         wait_cell[0] = False
         condition.notify_all()
     def half_duplex_request_iterator():
-      request = test_pb2.StreamingOutputCallRequest()
+      request = self._request_pb2.StreamingOutputCallRequest()
       request.response_parameters.add(size=1, interval_us=0)
       yield request
       with condition:
         while wait_cell[0]:
           condition.wait()
-    with _CreateService(test_pb2) as (methods, stub):
+    with _CreateService(self._service_pb2, self._response_pb2,
+                        self._payload_pb2) as (methods, stub):
       with wait():
         responses = stub.HalfDuplexCall(
             half_duplex_request_iterator(), test_constants.SHORT_TIMEOUT)
@@ -563,5 +574,5 @@
 
 
 if __name__ == '__main__':
-  os.chdir(os.path.dirname(sys.argv[0]))
+  #os.chdir(os.path.dirname(sys.argv[0]))
   unittest.main(verbosity=2)
diff --git a/src/python/grpcio/tests/protoc_plugin/protoc_plugin_test.proto b/src/python/grpcio/tests/protoc_plugin/protoc_plugin_test.proto
deleted file mode 100644
index 6762a8e..0000000
--- a/src/python/grpcio/tests/protoc_plugin/protoc_plugin_test.proto
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2015, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// An integration test service that covers all the method signature permutations
-// of unary/streaming requests/responses.
-// This file is duplicated around the code base. See GitHub issue #526.
-syntax = "proto2";
-
-package grpc_protoc_plugin;
-
-enum PayloadType {
-  // Compressable text format.
-  COMPRESSABLE= 1;
-
-  // Uncompressable binary format.
-  UNCOMPRESSABLE = 2;
-
-  // Randomly chosen from all other formats defined in this enum.
-  RANDOM = 3;
-}
-
-message Payload {
-  required PayloadType payload_type = 1;
-  oneof payload_body {
-    string payload_compressable = 2;
-    bytes payload_uncompressable = 3;
-  }
-}
-
-message SimpleRequest {
-  // Desired payload type in the response from the server.
-  // If response_type is RANDOM, server randomly chooses one from other formats.
-  optional PayloadType response_type = 1 [default=COMPRESSABLE];
-
-  // Desired payload size in the response from the server.
-  // If response_type is COMPRESSABLE, this denotes the size before compression.
-  optional int32 response_size = 2;
-
-  // Optional input payload sent along with the request.
-  optional Payload payload = 3;
-}
-
-message SimpleResponse {
-  optional Payload payload = 1;
-}
-
-message StreamingInputCallRequest {
-  // Optional input payload sent along with the request.
-  optional Payload payload = 1;
-
-  // Not expecting any payload from the response.
-}
-
-message StreamingInputCallResponse {
-  // Aggregated size of payloads received from the client.
-  optional int32 aggregated_payload_size = 1;
-}
-
-message ResponseParameters {
-  // Desired payload sizes in responses from the server.
-  // If response_type is COMPRESSABLE, this denotes the size before compression.
-  required int32 size = 1;
-
-  // Desired interval between consecutive responses in the response stream in
-  // microseconds.
-  required int32 interval_us = 2;
-}
-
-message StreamingOutputCallRequest {
-  // Desired payload type in the response from the server.
-  // If response_type is RANDOM, the payload from each response in the stream
-  // might be of different types. This is to simulate a mixed type of payload
-  // stream.
-  optional PayloadType response_type = 1 [default=COMPRESSABLE];
-
-  repeated ResponseParameters response_parameters = 2;
-
-  // Optional input payload sent along with the request.
-  optional Payload payload = 3;
-}
-
-message StreamingOutputCallResponse {
-  optional Payload payload = 1;
-}
-
-service TestService {
-  // One request followed by one response.
-  // The server returns the client payload as-is.
-  rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
-
-  // One request followed by a sequence of responses (streamed download).
-  // The server returns the payload with client desired type and sizes.
-  rpc StreamingOutputCall(StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-
-  // A sequence of requests followed by one response (streamed upload).
-  // The server returns the aggregated size of client payload as the result.
-  rpc StreamingInputCall(stream StreamingInputCallRequest)
-      returns (StreamingInputCallResponse);
-
-  // A sequence of requests with each request served by the server immediately.
-  // As one request could lead to multiple responses, this interface
-  // demonstrates the idea of full duplexing.
-  rpc FullDuplexCall(stream StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-
-  // A sequence of requests followed by a sequence of responses.
-  // The server buffers all the client requests and then serves them in order. A
-  // stream of responses are returned to the client when the server starts with
-  // first request.
-  rpc HalfDuplexCall(stream StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-}
diff --git a/src/python/grpcio/tests/protoc_plugin/protos/payload/test_payload.proto b/src/python/grpcio/tests/protoc_plugin/protos/payload/test_payload.proto
new file mode 100644
index 0000000..457543a
--- /dev/null
+++ b/src/python/grpcio/tests/protoc_plugin/protos/payload/test_payload.proto
@@ -0,0 +1,51 @@
+// 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.
+
+syntax = "proto3";
+
+package grpc_protoc_plugin;
+
+enum PayloadType {
+  // Compressable text format.
+  COMPRESSABLE= 0;
+
+  // Uncompressable binary format.
+  UNCOMPRESSABLE = 1;
+
+  // Randomly chosen from all other formats defined in this enum.
+  RANDOM = 2;
+}
+
+message Payload {
+  PayloadType payload_type = 1;
+  oneof payload_body {
+    string payload_compressable = 2;
+    bytes payload_uncompressable = 3;
+  }
+}
diff --git a/src/python/grpcio/tests/protoc_plugin/protos/requests/r/test_requests.proto b/src/python/grpcio/tests/protoc_plugin/protos/requests/r/test_requests.proto
new file mode 100644
index 0000000..54105df
--- /dev/null
+++ b/src/python/grpcio/tests/protoc_plugin/protos/requests/r/test_requests.proto
@@ -0,0 +1,77 @@
+// 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.
+
+syntax = "proto3";
+
+import "protos/payload/test_payload.proto";
+
+package grpc_protoc_plugin;
+
+message SimpleRequest {
+  // Desired payload type in the response from the server.
+  // If response_type is RANDOM, server randomly chooses one from other formats.
+  PayloadType response_type = 1;
+
+  // Desired payload size in the response from the server.
+  // If response_type is COMPRESSABLE, this denotes the size before compression.
+  int32 response_size = 2;
+
+  // input payload sent along with the request.
+  Payload payload = 3;
+}
+
+message StreamingInputCallRequest {
+  // input payload sent along with the request.
+  Payload payload = 1;
+
+  // Not expecting any payload from the response.
+}
+
+message ResponseParameters {
+  // Desired payload sizes in responses from the server.
+  // If response_type is COMPRESSABLE, this denotes the size before compression.
+  int32 size = 1;
+
+  // Desired interval between consecutive responses in the response stream in
+  // microseconds.
+  int32 interval_us = 2;
+}
+
+message StreamingOutputCallRequest {
+  // Desired payload type in the response from the server.
+  // If response_type is RANDOM, the payload from each response in the stream
+  // might be of different types. This is to simulate a mixed type of payload
+  // stream.
+  PayloadType response_type = 1;
+
+  repeated ResponseParameters response_parameters = 2;
+
+  // input payload sent along with the request.
+  Payload payload = 3;
+}
diff --git a/src/python/grpcio/tests/protoc_plugin/protos/responses/test_responses.proto b/src/python/grpcio/tests/protoc_plugin/protos/responses/test_responses.proto
new file mode 100644
index 0000000..734fbda
--- /dev/null
+++ b/src/python/grpcio/tests/protoc_plugin/protos/responses/test_responses.proto
@@ -0,0 +1,47 @@
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+import "protos/payload/test_payload.proto";
+
+package grpc_protoc_plugin;
+
+message SimpleResponse {
+  Payload payload = 1;
+}
+
+message StreamingInputCallResponse {
+  // Aggregated size of payloads received from the client.
+  int32 aggregated_payload_size = 1;
+}
+
+message StreamingOutputCallResponse {
+  Payload payload = 1;
+}
diff --git a/src/python/grpcio/tests/protoc_plugin/protos/service/test_service.proto b/src/python/grpcio/tests/protoc_plugin/protos/service/test_service.proto
new file mode 100644
index 0000000..fe715ee
--- /dev/null
+++ b/src/python/grpcio/tests/protoc_plugin/protos/service/test_service.proto
@@ -0,0 +1,64 @@
+// 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.
+
+syntax = "proto3";
+
+import "protos/requests/r/test_requests.proto";
+import "protos/responses/test_responses.proto";
+
+package grpc_protoc_plugin;
+
+service TestService {
+  // One request followed by one response.
+  // The server returns the client payload as-is.
+  rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
+
+  // One request followed by a sequence of responses (streamed download).
+  // The server returns the payload with client desired type and sizes.
+  rpc StreamingOutputCall(StreamingOutputCallRequest)
+      returns (stream StreamingOutputCallResponse);
+
+  // A sequence of requests followed by one response (streamed upload).
+  // The server returns the aggregated size of client payload as the result.
+  rpc StreamingInputCall(stream StreamingInputCallRequest)
+      returns (StreamingInputCallResponse);
+
+  // A sequence of requests with each request served by the server immediately.
+  // As one request could lead to multiple responses, this interface
+  // demonstrates the idea of full duplexing.
+  rpc FullDuplexCall(stream StreamingOutputCallRequest)
+      returns (stream StreamingOutputCallResponse);
+
+  // A sequence of requests followed by a sequence of responses.
+  // The server buffers all the client requests and then serves them in order. A
+  // stream of responses are returned to the client when the server starts with
+  // first request.
+  rpc HalfDuplexCall(stream StreamingOutputCallRequest)
+      returns (stream StreamingOutputCallResponse);
+}
diff --git a/src/python/grpcio/tests/qps/benchmark_client.py b/src/python/grpcio/tests/qps/benchmark_client.py
index eed0b0c..b372ea0 100644
--- a/src/python/grpcio/tests/qps/benchmark_client.py
+++ b/src/python/grpcio/tests/qps/benchmark_client.py
@@ -39,6 +39,7 @@
 from concurrent import futures
 
 from grpc.beta import implementations
+from grpc.framework.interfaces.face import face
 from src.proto.grpc.testing import messages_pb2
 from src.proto.grpc.testing import services_pb2
 from tests.unit import resources
@@ -141,10 +142,10 @@
     self._stub = None
 
 
-class StreamingAsyncBenchmarkClient(BenchmarkClient):
+class StreamingSyncBenchmarkClient(BenchmarkClient):
 
   def __init__(self, server, config, hist):
-    super(StreamingAsyncBenchmarkClient, self).__init__(server, config, hist)
+    super(StreamingSyncBenchmarkClient, self).__init__(server, config, hist)
     self._is_streaming = False
     self._pool = futures.ThreadPoolExecutor(max_workers=1)
     # Use a thread-safe queue to put requests on the stream
@@ -167,12 +168,12 @@
   def _request_stream(self):
     self._is_streaming = True
     if self._generic:
-      response_stream = self._stub.inline_stream_stream(
-          'grpc.testing.BenchmarkService', 'StreamingCall',
-          self._request_generator(), _TIMEOUT)
+      stream_callable = self._stub.stream_stream(
+          'grpc.testing.BenchmarkService', 'StreamingCall')
     else:
-      response_stream = self._stub.StreamingCall(self._request_generator(),
-                                                 _TIMEOUT)
+      stream_callable = self._stub.StreamingCall
+
+    response_stream = stream_callable(self._request_generator(), _TIMEOUT)
     for _ in response_stream:
       end_time = time.time()
       self._handle_response(end_time - self._send_time_queue.get_nowait())
@@ -184,3 +185,48 @@
         yield request
       except queue.Empty:
         pass
+
+
+class AsyncReceiver(face.ResponseReceiver):
+  """Receiver for async stream responses."""
+
+  def __init__(self, send_time_queue, response_handler):
+    self._send_time_queue = send_time_queue
+    self._response_handler = response_handler
+
+  def initial_metadata(self, initial_mdetadata):
+    pass
+
+  def response(self, response):
+    end_time = time.time()
+    self._response_handler(end_time - self._send_time_queue.get_nowait())
+
+  def complete(self, terminal_metadata, code, details):
+    pass
+
+
+class StreamingAsyncBenchmarkClient(BenchmarkClient):
+
+  def __init__(self, server, config, hist):
+    super(StreamingAsyncBenchmarkClient, self).__init__(server, config, hist)
+    self._send_time_queue = queue.Queue()
+    self._receiver = AsyncReceiver(self._send_time_queue, self._handle_response)
+    self._rendezvous = None
+
+  def send_request(self):
+    if self._rendezvous is not None:
+      self._send_time_queue.put(time.time())
+      self._rendezvous.consume(self._request)
+
+  def start(self):
+    if self._generic:
+      stream_callable = self._stub.stream_stream(
+          'grpc.testing.BenchmarkService', 'StreamingCall')
+    else:
+      stream_callable = self._stub.StreamingCall
+    self._rendezvous = stream_callable.event(
+        self._receiver, lambda *args: None, _TIMEOUT)
+
+  def stop(self):
+    self._rendezvous.terminate()
+    self._rendezvous = None
diff --git a/src/python/grpcio/tests/qps/client_runner.py b/src/python/grpcio/tests/qps/client_runner.py
index a36c30c..1ede7d2 100644
--- a/src/python/grpcio/tests/qps/client_runner.py
+++ b/src/python/grpcio/tests/qps/client_runner.py
@@ -89,9 +89,9 @@
 
   def start(self):
     self._is_running = True
+    self._client.start()
     for _ in xrange(self._request_count):
       self._client.send_request()
-    self._client.start()
 
   def stop(self):
     self._is_running = False
diff --git a/src/python/grpcio/tests/qps/worker_server.py b/src/python/grpcio/tests/qps/worker_server.py
index 0b3acc1..1f9af54 100644
--- a/src/python/grpcio/tests/qps/worker_server.py
+++ b/src/python/grpcio/tests/qps/worker_server.py
@@ -146,8 +146,9 @@
       if config.rpc_type == control_pb2.UNARY:
         client = benchmark_client.UnarySyncBenchmarkClient(
             server, config, qps_data)
-      else:
-        raise Exception('STREAMING SYNC client not supported')
+      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(
diff --git a/tools/jenkins/docker_run_tests.sh b/src/python/grpcio/tests/stress/__init__.py
old mode 100755
new mode 100644
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to src/python/grpcio/tests/stress/__init__.py
index 2fc66c2..100a624
--- a/tools/jenkins/docker_run_tests.sh
+++ b/src/python/grpcio/tests/stress/__init__.py
@@ -1,5 +1,4 @@
-#!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +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.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
-
-set -e
-
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
-
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
diff --git a/src/python/grpcio/tests/stress/client.py b/src/python/grpcio/tests/stress/client.py
new file mode 100644
index 0000000..e2e0167
--- /dev/null
+++ b/src/python/grpcio/tests/stress/client.py
@@ -0,0 +1,135 @@
+# 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.
+
+"""Entry point for running stress tests."""
+
+import argparse
+import Queue
+import threading
+
+from grpc.beta import implementations
+from src.proto.grpc.testing import metrics_pb2
+from src.proto.grpc.testing import test_pb2
+
+from tests.interop import methods
+from tests.qps import histogram
+from tests.stress import metrics_server
+from tests.stress import test_runner
+
+
+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)
+  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))
+
+
+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
+
+
+def run_test(args):
+  test_cases = _parse_weighted_test_cases(args.test_cases)
+  test_servers = 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 = metrics_pb2.beta_create_MetricsService_server(
+      metrics_server.MetricsServer(hist))
+  server.add_insecure_port('[::]:{}'.format(args.metrics_port))
+  server.start()
+
+  for test_server in test_servers:
+    host, port = test_server.split(':', 1)
+    for _ in xrange(args.num_channels_per_server):
+      channel = implementations.insecure_channel(host, int(port))
+      for _ in xrange(args.num_stubs_per_channel):
+        stub = test_pb2.beta_create_TestService_stub(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(0)
+
+if __name__ == '__main__':
+  run_test(_args())
diff --git a/tools/jenkins/docker_run_tests.sh b/src/python/grpcio/tests/stress/metrics_server.py
old mode 100755
new mode 100644
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to src/python/grpcio/tests/stress/metrics_server.py
index 2fc66c2..b994e46
--- a/tools/jenkins/docker_run_tests.sh
+++ b/src/python/grpcio/tests/stress/metrics_server.py
@@ -1,5 +1,4 @@
-#!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +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.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+"""MetricsService for publishing stress test qps data."""
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+import time
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
+from src.proto.grpc.testing import metrics_pb2
 
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
+GAUGE_NAME = 'python_overall_qps'
 
-mkdir -p reports
 
-$POST_GIT_STEP
+class MetricsServer(metrics_pb2.BetaMetricsServiceServicer):
 
-exit_code=0
+  def __init__(self, histogram):
+    self._start_time = time.time()
+    self._histogram = histogram
 
-$RUN_TESTS_COMMAND || exit_code=$?
+  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)
 
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
+  def GetAllGauges(self, request, context):
+    qps = self._get_qps()
+    return [metrics_pb2.GaugeResponse(name=GAUGE_NAME, long_value=qps)]
 
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+  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/stress/test_runner.py b/src/python/grpcio/tests/stress/test_runner.py
new file mode 100644
index 0000000..88f1372
--- /dev/null
+++ b/src/python/grpcio/tests/stress/test_runner.py
@@ -0,0 +1,73 @@
+# 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.
+
+"""Thread that sends random weighted requests on a TestService stub."""
+
+import random
+import threading
+import time
+import traceback
+
+
+def _weighted_test_case_generator(weighted_cases):
+  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
+
+
+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 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/unit/_cython/_channel_test.py b/src/python/grpcio/tests/unit/_cython/_channel_test.py
index b414f8e..931cd90 100644
--- a/src/python/grpcio/tests/unit/_cython/_channel_test.py
+++ b/src/python/grpcio/tests/unit/_cython/_channel_test.py
@@ -33,8 +33,7 @@
 
 from grpc._cython import cygrpc
 
-# TODO(nathaniel): This should be at least one hundred. Why not one thousand?
-_PARALLELISM = 4
+from tests.unit.framework.common import test_constants
 
 
 def _channel_and_completion_queue():
@@ -61,7 +60,7 @@
 def _in_parallel(behavior, arguments):
   threads = tuple(
       threading.Thread(target=behavior, args=arguments)
-      for _ in range(_PARALLELISM))
+      for _ in range(test_constants.PARALLELISM))
   for thread in threads:
     thread.start()
   for thread in threads:
diff --git a/src/ruby/.rubocop.yml b/src/ruby/.rubocop.yml
index d13ce42..34bb477 100644
--- a/src/ruby/.rubocop.yml
+++ b/src/ruby/.rubocop.yml
@@ -11,10 +11,10 @@
     - 'pb/test/**/*'
 
 Metrics/CyclomaticComplexity:
-  Max: 8
+  Max: 9
 
 Metrics/PerceivedComplexity:
-  Max: 8
+  Max: 9
 
 Metrics/ClassLength:
   Max: 250
diff --git a/src/ruby/ext/grpc/extconf.rb b/src/ruby/ext/grpc/extconf.rb
index 82b6d31..6d65db8 100644
--- a/src/ruby/ext/grpc/extconf.rb
+++ b/src/ruby/ext/grpc/extconf.rb
@@ -60,31 +60,25 @@
 
 grpc_config = ENV['GRPC_CONFIG'] || 'opt'
 
-if ENV.key?('GRPC_LIB_DIR')
-  grpc_lib_dir = File.join(grpc_root, ENV['GRPC_LIB_DIR'])
-else
-  grpc_lib_dir = File.join(grpc_root, 'libs', grpc_config)
-end
-
 ENV['MACOSX_DEPLOYMENT_TARGET'] = '10.7'
 
-unless File.exist?(File.join(grpc_lib_dir, 'libgrpc.a')) or windows
-  ENV['AR'] = RbConfig::CONFIG['AR'] + ' rcs'
-  ENV['CC'] = RbConfig::CONFIG['CC']
-  ENV['LD'] = ENV['CC']
+ENV['AR'] = RbConfig::CONFIG['AR'] + ' rcs'
+ENV['CC'] = RbConfig::CONFIG['CC']
+ENV['LD'] = ENV['CC']
 
-  ENV['AR'] = 'libtool -o' if RUBY_PLATFORM =~ /darwin/
+ENV['AR'] = 'libtool -o' if RUBY_PLATFORM =~ /darwin/
 
-  ENV['EMBED_OPENSSL'] = 'true'
-  ENV['EMBED_ZLIB'] = 'true'
-  ENV['ARCH_FLAGS'] = RbConfig::CONFIG['ARCH_FLAG']
-  ENV['ARCH_FLAGS'] = '-arch i386 -arch x86_64' if RUBY_PLATFORM =~ /darwin/
-  ENV['CFLAGS'] = '-DGPR_BACKWARDS_COMPATIBILITY_MODE'
+ENV['EMBED_OPENSSL'] = 'true'
+ENV['EMBED_ZLIB'] = 'true'
+ENV['ARCH_FLAGS'] = RbConfig::CONFIG['ARCH_FLAG']
+ENV['ARCH_FLAGS'] = '-arch i386 -arch x86_64' if RUBY_PLATFORM =~ /darwin/
+ENV['CFLAGS'] = '-DGPR_BACKWARDS_COMPATIBILITY_MODE'
 
-  output_dir = File.expand_path(RbConfig::CONFIG['topdir'])
-  grpc_lib_dir = File.join(output_dir, 'libs', grpc_config)
-  ENV['BUILDDIR'] = output_dir
+output_dir = File.expand_path(RbConfig::CONFIG['topdir'])
+grpc_lib_dir = File.join(output_dir, 'libs', grpc_config)
+ENV['BUILDDIR'] = output_dir
 
+unless windows
   puts 'Building internal gRPC into ' + grpc_lib_dir
   system("make -j -C #{grpc_root} #{grpc_lib_dir}/libgrpc.a CONFIG=#{grpc_config}")
   exit 1 unless $? == 0
diff --git a/src/ruby/ext/grpc/rb_byte_buffer.c b/src/ruby/ext/grpc/rb_byte_buffer.c
index cba910d..1172691 100644
--- a/src/ruby/ext/grpc/rb_byte_buffer.c
+++ b/src/ruby/ext/grpc/rb_byte_buffer.c
@@ -32,11 +32,10 @@
  */
 
 #include <ruby/ruby.h>
+
 #include "rb_grpc_imports.generated.h"
 #include "rb_byte_buffer.h"
 
-#include <ruby/ruby.h>
-
 #include <grpc/grpc.h>
 #include <grpc/byte_buffer_reader.h>
 #include <grpc/support/slice.h>
diff --git a/src/ruby/ext/grpc/rb_call.c b/src/ruby/ext/grpc/rb_call.c
index 48c49a2..1b06273 100644
--- a/src/ruby/ext/grpc/rb_call.c
+++ b/src/ruby/ext/grpc/rb_call.c
@@ -32,11 +32,10 @@
  */
 
 #include <ruby/ruby.h>
+
 #include "rb_grpc_imports.generated.h"
 #include "rb_call.h"
 
-#include <ruby/ruby.h>
-
 #include <grpc/grpc.h>
 #include <grpc/support/alloc.h>
 
diff --git a/src/ruby/ext/grpc/rb_call_credentials.c b/src/ruby/ext/grpc/rb_call_credentials.c
index 38bf1f7..79ca5b3 100644
--- a/src/ruby/ext/grpc/rb_call_credentials.c
+++ b/src/ruby/ext/grpc/rb_call_credentials.c
@@ -32,10 +32,10 @@
  */
 
 #include <ruby/ruby.h>
+
 #include "rb_grpc_imports.generated.h"
 #include "rb_call_credentials.h"
 
-#include <ruby/ruby.h>
 #include <ruby/thread.h>
 
 #include <grpc/grpc.h>
@@ -86,11 +86,11 @@
       rb_funcall(exception_object, rb_intern("backtrace"), 0),
       rb_intern("join"),
       1, rb_str_new2("\n\tfrom "));
-  VALUE exception_info = rb_funcall(exception_object, rb_intern("to_s"), 0);
+  VALUE rb_exception_info = rb_funcall(exception_object, rb_intern("to_s"), 0);
   const char *exception_classname = rb_obj_classname(exception_object);
   (void)args;
   gpr_log(GPR_INFO, "Call credentials callback failed: %s: %s\n%s",
-          exception_classname, StringValueCStr(exception_info),
+          exception_classname, StringValueCStr(rb_exception_info),
           StringValueCStr(backtrace));
   rb_hash_aset(result, rb_str_new2("metadata"), Qnil);
   /* Currently only gives the exception class name. It should be possible get
diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c
index 984afad..013321f 100644
--- a/src/ruby/ext/grpc/rb_channel.c
+++ b/src/ruby/ext/grpc/rb_channel.c
@@ -32,11 +32,10 @@
  */
 
 #include <ruby/ruby.h>
+
 #include "rb_grpc_imports.generated.h"
 #include "rb_channel.h"
 
-#include <ruby/ruby.h>
-
 #include <grpc/grpc.h>
 #include <grpc/grpc_security.h>
 #include <grpc/support/alloc.h>
diff --git a/src/ruby/ext/grpc/rb_channel_args.c b/src/ruby/ext/grpc/rb_channel_args.c
index 2ffb8f4..87c0e0a 100644
--- a/src/ruby/ext/grpc/rb_channel_args.c
+++ b/src/ruby/ext/grpc/rb_channel_args.c
@@ -32,11 +32,10 @@
  */
 
 #include <ruby/ruby.h>
+
 #include "rb_grpc_imports.generated.h"
 #include "rb_channel_args.h"
 
-#include <ruby/ruby.h>
-
 #include <grpc/grpc.h>
 
 #include "rb_grpc.h"
diff --git a/src/ruby/ext/grpc/rb_channel_credentials.c b/src/ruby/ext/grpc/rb_channel_credentials.c
index 09bd309..cbb2388 100644
--- a/src/ruby/ext/grpc/rb_channel_credentials.c
+++ b/src/ruby/ext/grpc/rb_channel_credentials.c
@@ -31,14 +31,13 @@
  *
  */
 
+#include <ruby/ruby.h>
+
 #include <string.h>
 
-#include <ruby/ruby.h>
 #include "rb_grpc_imports.generated.h"
 #include "rb_channel_credentials.h"
 
-#include <ruby/ruby.h>
-
 #include <grpc/grpc.h>
 #include <grpc/grpc_security.h>
 #include <grpc/support/alloc.h>
diff --git a/src/ruby/ext/grpc/rb_completion_queue.c b/src/ruby/ext/grpc/rb_completion_queue.c
index 2a2eee1..4bb615f 100644
--- a/src/ruby/ext/grpc/rb_completion_queue.c
+++ b/src/ruby/ext/grpc/rb_completion_queue.c
@@ -32,10 +32,10 @@
  */
 
 #include <ruby/ruby.h>
+
 #include "rb_grpc_imports.generated.h"
 #include "rb_completion_queue.h"
 
-#include <ruby/ruby.h>
 #include <ruby/thread.h>
 
 #include <grpc/grpc.h>
diff --git a/src/ruby/ext/grpc/rb_event_thread.c b/src/ruby/ext/grpc/rb_event_thread.c
index 2649a10..9e85bbc 100644
--- a/src/ruby/ext/grpc/rb_event_thread.c
+++ b/src/ruby/ext/grpc/rb_event_thread.c
@@ -32,12 +32,12 @@
  */
 
 #include <ruby/ruby.h>
+
 #include "rb_grpc_imports.generated.h"
 #include "rb_event_thread.h"
 
 #include <stdbool.h>
 
-#include <ruby/ruby.h>
 #include <ruby/thread.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/sync.h>
diff --git a/src/ruby/ext/grpc/rb_grpc.c b/src/ruby/ext/grpc/rb_grpc.c
index acb47b0..5277148 100644
--- a/src/ruby/ext/grpc/rb_grpc.c
+++ b/src/ruby/ext/grpc/rb_grpc.c
@@ -32,11 +32,11 @@
  */
 
 #include <ruby/ruby.h>
+
 #include "rb_grpc_imports.generated.h"
 #include "rb_grpc.h"
 
 #include <math.h>
-#include <ruby/ruby.h>
 #include <ruby/vm.h>
 #include <sys/time.h>
 
@@ -50,6 +50,7 @@
 #include "rb_loader.h"
 #include "rb_server.h"
 #include "rb_server_credentials.h"
+#include "rb_signal.h"
 
 static VALUE grpc_rb_cTimeVal = Qnil;
 
@@ -332,6 +333,7 @@
   Init_grpc_channel_credentials();
   Init_grpc_server();
   Init_grpc_server_credentials();
+  Init_grpc_signals();
   Init_grpc_status_codes();
   Init_grpc_time_consts();
 }
diff --git a/src/ruby/ext/grpc/rb_grpc_imports.generated.c b/src/ruby/ext/grpc/rb_grpc_imports.generated.c
index bc43f9d..cebbe8c 100644
--- a/src/ruby/ext/grpc/rb_grpc_imports.generated.c
+++ b/src/ruby/ext/grpc/rb_grpc_imports.generated.c
@@ -125,6 +125,7 @@
 grpc_header_nonbin_value_is_legal_type grpc_header_nonbin_value_is_legal_import;
 grpc_is_binary_header_type grpc_is_binary_header_import;
 grpc_call_error_to_string_type grpc_call_error_to_string_import;
+grpc_cronet_secure_channel_create_type grpc_cronet_secure_channel_create_import;
 grpc_auth_property_iterator_next_type grpc_auth_property_iterator_next_import;
 grpc_auth_context_property_iterator_type grpc_auth_context_property_iterator_import;
 grpc_auth_context_peer_identity_type grpc_auth_context_peer_identity_import;
@@ -391,6 +392,7 @@
   grpc_header_nonbin_value_is_legal_import = (grpc_header_nonbin_value_is_legal_type) GetProcAddress(library, "grpc_header_nonbin_value_is_legal");
   grpc_is_binary_header_import = (grpc_is_binary_header_type) GetProcAddress(library, "grpc_is_binary_header");
   grpc_call_error_to_string_import = (grpc_call_error_to_string_type) GetProcAddress(library, "grpc_call_error_to_string");
+  grpc_cronet_secure_channel_create_import = (grpc_cronet_secure_channel_create_type) GetProcAddress(library, "grpc_cronet_secure_channel_create");
   grpc_auth_property_iterator_next_import = (grpc_auth_property_iterator_next_type) GetProcAddress(library, "grpc_auth_property_iterator_next");
   grpc_auth_context_property_iterator_import = (grpc_auth_context_property_iterator_type) GetProcAddress(library, "grpc_auth_context_property_iterator");
   grpc_auth_context_peer_identity_import = (grpc_auth_context_peer_identity_type) GetProcAddress(library, "grpc_auth_context_peer_identity");
diff --git a/src/ruby/ext/grpc/rb_grpc_imports.generated.h b/src/ruby/ext/grpc/rb_grpc_imports.generated.h
index b67361c..d7ea6c5 100644
--- a/src/ruby/ext/grpc/rb_grpc_imports.generated.h
+++ b/src/ruby/ext/grpc/rb_grpc_imports.generated.h
@@ -43,6 +43,7 @@
 #include <grpc/census.h>
 #include <grpc/compression.h>
 #include <grpc/grpc.h>
+#include <grpc/grpc_cronet.h>
 #include <grpc/grpc_security.h>
 #include <grpc/impl/codegen/alloc.h>
 #include <grpc/impl/codegen/byte_buffer.h>
@@ -325,6 +326,9 @@
 typedef const char *(*grpc_call_error_to_string_type)(grpc_call_error error);
 extern grpc_call_error_to_string_type grpc_call_error_to_string_import;
 #define grpc_call_error_to_string grpc_call_error_to_string_import
+typedef grpc_channel *(*grpc_cronet_secure_channel_create_type)(void *engine, const char *target, const grpc_channel_args *args, void *reserved);
+extern grpc_cronet_secure_channel_create_type grpc_cronet_secure_channel_create_import;
+#define grpc_cronet_secure_channel_create grpc_cronet_secure_channel_create_import
 typedef const grpc_auth_property *(*grpc_auth_property_iterator_next_type)(grpc_auth_property_iterator *it);
 extern grpc_auth_property_iterator_next_type grpc_auth_property_iterator_next_import;
 #define grpc_auth_property_iterator_next grpc_auth_property_iterator_next_import
diff --git a/src/ruby/ext/grpc/rb_server.c b/src/ruby/ext/grpc/rb_server.c
index 96e60c6..2b3acaa 100644
--- a/src/ruby/ext/grpc/rb_server.c
+++ b/src/ruby/ext/grpc/rb_server.c
@@ -32,11 +32,10 @@
  */
 
 #include <ruby/ruby.h>
+
 #include "rb_grpc_imports.generated.h"
 #include "rb_server.h"
 
-#include <ruby/ruby.h>
-
 #include <grpc/grpc.h>
 #include <grpc/grpc_security.h>
 #include "rb_call.h"
diff --git a/src/ruby/ext/grpc/rb_server_credentials.c b/src/ruby/ext/grpc/rb_server_credentials.c
index b2d7280..3b0fb6c 100644
--- a/src/ruby/ext/grpc/rb_server_credentials.c
+++ b/src/ruby/ext/grpc/rb_server_credentials.c
@@ -32,11 +32,10 @@
  */
 
 #include <ruby/ruby.h>
+
 #include "rb_grpc_imports.generated.h"
 #include "rb_server_credentials.h"
 
-#include <ruby/ruby.h>
-
 #include <grpc/grpc.h>
 #include <grpc/grpc_security.h>
 
diff --git a/src/ruby/ext/grpc/rb_signal.c b/src/ruby/ext/grpc/rb_signal.c
new file mode 100644
index 0000000..a9e5123
--- /dev/null
+++ b/src/ruby/ext/grpc/rb_signal.c
@@ -0,0 +1,70 @@
+/*
+ *
+ * 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 <ruby/ruby.h>
+#include <signal.h>
+#include <stdbool.h>
+
+#include <grpc/support/log.h>
+
+#include "rb_grpc.h"
+
+static void (*old_sigint_handler)(int);
+static void (*old_sigterm_handler)(int);
+
+static volatile bool signal_received = false;
+
+/* This has to be handled at the C level instead of Ruby, because Ruby signal
+ * handlers are constrained to run in the main interpreter thread. If that main
+ * thread is blocked on grpc_completion_queue_pluck, the signal handlers will
+ * never run */
+static void handle_signal(int signum) {
+  signal_received = true;
+  if (signum == SIGINT) {
+    old_sigint_handler(signum);
+  } else if (signum == SIGTERM) {
+    old_sigterm_handler(signum);
+  }
+}
+
+static VALUE grpc_rb_signal_received(VALUE self) {
+  (void)self;
+  return signal_received ? Qtrue : Qfalse;
+}
+
+void Init_grpc_signals() {
+  old_sigint_handler = signal(SIGINT, handle_signal);
+  old_sigterm_handler = signal(SIGTERM, handle_signal);
+  rb_define_singleton_method(grpc_rb_mGrpcCore, "signal_received?",
+                             grpc_rb_signal_received, 0);
+}
diff --git a/examples/node/greeter_client.js b/src/ruby/ext/grpc/rb_signal.h
similarity index 72%
copy from examples/node/greeter_client.js
copy to src/ruby/ext/grpc/rb_signal.h
index 2820acb..07e49c0 100644
--- a/examples/node/greeter_client.js
+++ b/src/ruby/ext/grpc/rb_signal.h
@@ -1,6 +1,6 @@
 /*
  *
- * Copyright 2015, Google Inc.
+ * Copyright 2016, Google Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,23 +31,9 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+#ifndef GRPC_RB_SIGNAL_H_
+#define GRPC_RB_SIGNAL_H_
 
-var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
+void Init_grpc_signals();
 
-function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
-                                       grpc.credentials.createInsecure());
-  var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
-  } else {
-    user = 'world';
-  }
-  client.sayHello({name: user}, function(err, response) {
-    console.log('Greeting:', response.message);
-  });
-}
-
-main();
+#endif  /* GRPC_RB_SIGNAL_H_ */
diff --git a/src/ruby/lib/grpc.rb b/src/ruby/lib/grpc.rb
index 79fa705..7c9aae3 100644
--- a/src/ruby/lib/grpc.rb
+++ b/src/ruby/lib/grpc.rb
@@ -33,6 +33,7 @@
 require_relative 'grpc/grpc'
 require_relative 'grpc/logconfig'
 require_relative 'grpc/notifier'
+require_relative 'grpc/signals'
 require_relative 'grpc/version'
 require_relative 'grpc/core/time_consts'
 require_relative 'grpc/generic/active_call'
@@ -47,3 +48,5 @@
 ensure
   file.close
 end
+
+GRPC::Signals.wait_for_signals
diff --git a/src/ruby/lib/grpc/generic/active_call.rb b/src/ruby/lib/grpc/generic/active_call.rb
index ecf3cc3..fd20a86 100644
--- a/src/ruby/lib/grpc/generic/active_call.rb
+++ b/src/ruby/lib/grpc/generic/active_call.rb
@@ -28,7 +28,9 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 require 'forwardable'
+require 'weakref'
 require_relative 'bidi_call'
+require_relative '../signals'
 
 class Struct
   # BatchResult is the struct returned by calls to call#start_batch.
@@ -121,6 +123,10 @@
       @unmarshal = unmarshal
       @metadata_tag = metadata_tag
       @op_notifier = nil
+      weak_self = WeakRef.new(self)
+      remove_handler = GRPC::Signals.register_handler(&weak_self
+                                                        .method(:cancel))
+      ObjectSpace.define_finalizer(self, remove_handler)
     end
 
     # output_metadata are provides access to hash that can be used to
diff --git a/src/ruby/lib/grpc/generic/client_stub.rb b/src/ruby/lib/grpc/generic/client_stub.rb
index 68e167a..12946fe 100644
--- a/src/ruby/lib/grpc/generic/client_stub.rb
+++ b/src/ruby/lib/grpc/generic/client_stub.rb
@@ -49,7 +49,12 @@
         fail(TypeError, '!Channel') unless alt_chan.is_a?(Core::Channel)
         return alt_chan
       end
-      kw['grpc.primary_user_agent'] = "grpc-ruby/#{VERSION}"
+      if kw['grpc.primary_user_agent'].nil?
+        kw['grpc.primary_user_agent'] = ''
+      else
+        kw['grpc.primary_user_agent'] += ' '
+      end
+      kw['grpc.primary_user_agent'] += "grpc-ruby/#{VERSION}"
       unless creds.is_a?(Core::ChannelCredentials) || creds.is_a?(Symbol)
         fail(TypeError, '!ChannelCredentials or Symbol')
       end
diff --git a/src/ruby/lib/grpc/generic/rpc_server.rb b/src/ruby/lib/grpc/generic/rpc_server.rb
index 7f3a38a..238aaa9 100644
--- a/src/ruby/lib/grpc/generic/rpc_server.rb
+++ b/src/ruby/lib/grpc/generic/rpc_server.rb
@@ -28,46 +28,13 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 require_relative '../grpc'
+require_relative '../signals'
 require_relative 'active_call'
 require_relative 'service'
 require 'thread'
 
-# A global that contains signals the gRPC servers should respond to.
-$grpc_signals = []
-
 # GRPC contains the General RPC module.
 module GRPC
-  # Handles the signals in $grpc_signals.
-  #
-  # @return false if the server should exit, true if not.
-  def handle_signals
-    loop do
-      sig = $grpc_signals.shift
-      case sig
-      when 'INT'
-        return false
-      when 'TERM'
-        return false
-      when nil
-        return true
-      end
-    end
-    true
-  end
-  module_function :handle_signals
-
-  # Sets up a signal handler that adds signals to the signal handling global.
-  #
-  # Signal handlers should do as little as humanly possible.
-  # Here, they just add themselves to $grpc_signals
-  #
-  # RpcServer (and later other parts of gRPC) monitors the signals
-  # $grpc_signals in its own non-signal context.
-  def trap_signals
-    %w(INT TERM).each { |sig| trap(sig) { $grpc_signals << sig } }
-  end
-  module_function :trap_signals
-
   # Pool is a simple thread pool.
   class Pool
     # Default keep alive period is 1s
@@ -328,25 +295,6 @@
       end
     end
 
-    # Runs the server in its own thread, then waits for signal INT or TERM on
-    # the current thread to terminate it.
-    def run_till_terminated
-      GRPC.trap_signals
-      stopped = false
-      t = Thread.new do
-        run
-        stopped = true
-      end
-      wait_till_running
-      loop do
-        sleep SIGNAL_CHECK_PERIOD
-        break if stopped
-        break unless GRPC.handle_signals
-      end
-      stop
-      t.join
-    end
-
     # handle registration of classes
     #
     # service is either a class that includes GRPC::GenericService and whose
@@ -405,9 +353,14 @@
         transition_running_state(:running)
         @run_cond.broadcast
       end
+      remove_signal_handler = GRPC::Signals.register_handler { stop }
       loop_handle_server_calls
+      # Remove signal handler when server stops
+      remove_signal_handler.call
     end
 
+    alias_method :run_till_terminated, :run
+
     # Sends RESOURCE_EXHAUSTED if there are too many unprocessed jobs
     def available?(an_rpc)
       jobs_count, max = @pool.jobs_waiting, @max_waiting_requests
@@ -416,7 +369,7 @@
       GRPC.logger.warn("NOT AVAILABLE: too many jobs_waiting: #{an_rpc}")
       noop = proc { |x| x }
       c = ActiveCall.new(an_rpc.call, @cq, noop, noop, an_rpc.deadline)
-      c.send_status(StatusCodes::RESOURCE_EXHAUSTED, '')
+      c.send_status(GRPC::Core::StatusCodes::RESOURCE_EXHAUSTED, '')
       nil
     end
 
@@ -427,7 +380,7 @@
       GRPC.logger.warn("UNIMPLEMENTED: #{an_rpc}")
       noop = proc { |x| x }
       c = ActiveCall.new(an_rpc.call, @cq, noop, noop, an_rpc.deadline)
-      c.send_status(StatusCodes::UNIMPLEMENTED, '')
+      c.send_status(GRPC::Core::StatusCodes::UNIMPLEMENTED, '')
       nil
     end
 
@@ -443,7 +396,12 @@
           unless active_call.nil?
             @pool.schedule(active_call) do |ac|
               c, mth = ac
-              rpc_descs[mth].run_server_method(c, rpc_handlers[mth])
+              begin
+                rpc_descs[mth].run_server_method(c, rpc_handlers[mth])
+              rescue StandardError
+                c.send_status(GRPC::Core::StatusCodes::INTERNAL,
+                              'Server handler failed')
+              end
             end
           end
         rescue Core::CallError, RuntimeError => e
@@ -500,10 +458,8 @@
       unless cls.include?(GenericService)
         fail "#{cls} must 'include GenericService'"
       end
-      if cls.rpc_descs.size.zero?
-        fail "#{cls} should specify some rpc descriptions"
-      end
-      cls.assert_rpc_descs_have_methods
+      fail "#{cls} should specify some rpc descriptions" if
+        cls.rpc_descs.size.zero?
     end
 
     # This should be called while holding @run_mutex
diff --git a/src/ruby/lib/grpc/generic/service.rb b/src/ruby/lib/grpc/generic/service.rb
index 8e940b5..0a166e8 100644
--- a/src/ruby/lib/grpc/generic/service.rb
+++ b/src/ruby/lib/grpc/generic/service.rb
@@ -110,6 +110,9 @@
         rpc_descs[name] = RpcDesc.new(name, input, output,
                                       marshal_class_method,
                                       unmarshal_class_method)
+        define_method(name) do
+          fail GRPC::BadStatus, GRPC::Core::StatusCodes::UNIMPLEMENTED
+        end
       end
 
       def inherited(subclass)
@@ -199,19 +202,6 @@
           end
         end
       end
-
-      # Asserts that the appropriate methods are defined for each added rpc
-      # spec. Is intended to aid verifying that server classes are correctly
-      # implemented.
-      def assert_rpc_descs_have_methods
-        rpc_descs.each_pair do |m, spec|
-          mth_name = GenericService.underscore(m.to_s).to_sym
-          unless instance_methods.include?(mth_name)
-            fail "#{self} does not provide instance method '#{mth_name}'"
-          end
-          spec.assert_arity_matches(instance_method(mth_name))
-        end
-      end
     end
 
     def self.included(o)
diff --git a/src/ruby/lib/grpc/signals.rb b/src/ruby/lib/grpc/signals.rb
new file mode 100644
index 0000000..2ab85c8
--- /dev/null
+++ b/src/ruby/lib/grpc/signals.rb
@@ -0,0 +1,69 @@
+# 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.
+
+require 'thread'
+require_relative 'grpc'
+
+# GRPC contains the General RPC module.
+module GRPC
+  # Signals contains gRPC functions related to signal handling
+  module Signals
+    @interpreter_exiting = false
+    @signal_handlers = []
+    @handlers_mutex = Mutex.new
+
+    def register_handler(&handler)
+      @handlers_mutex.synchronize do
+        @signal_handlers.push(handler)
+        handler.call if @exit_signal_received
+      end
+      # Returns a function to remove the handler
+      lambda do
+        @handlers_mutex.synchronize { @signal_handlers.delete(handler) }
+      end
+    end
+    module_function :register_handler
+
+    def wait_for_signals
+      t = Thread.new do
+        sleep 0.1 until GRPC::Core.signal_received? || @interpreter_exiting
+        unless @interpreter_exiting
+          @handlers_mutex.synchronize do
+            @signal_handlers.each(&:call)
+          end
+        end
+      end
+      at_exit do
+        @interpreter_exiting = true
+        t.join
+      end
+    end
+    module_function :wait_for_signals
+  end
+end
diff --git a/src/ruby/lib/grpc/version.rb b/src/ruby/lib/grpc/version.rb
index 67c6a5d..01c8c5a 100644
--- a/src/ruby/lib/grpc/version.rb
+++ b/src/ruby/lib/grpc/version.rb
@@ -29,5 +29,5 @@
 
 # GRPC contains the General RPC module.
 module GRPC
-  VERSION = '0.14.0.dev'
+  VERSION = '0.15.0.dev'
 end
diff --git a/src/ruby/spec/generic/rpc_server_spec.rb b/src/ruby/spec/generic/rpc_server_spec.rb
index e688057..2a42736 100644
--- a/src/ruby/spec/generic/rpc_server_spec.rb
+++ b/src/ruby/spec/generic/rpc_server_spec.rb
@@ -308,10 +308,6 @@
       expect { @srv.handle(EmptyService) }.to raise_error
     end
 
-    it 'raises if the service does not define its rpc methods' do
-      expect { @srv.handle(NoRpcImplementation) }.to raise_error
-    end
-
     it 'raises if a handler method is already registered' do
       @srv.handle(EchoService)
       expect { r.handle(EchoService) }.to raise_error
@@ -349,6 +345,25 @@
         t.join
       end
 
+      it 'should return UNIMPLEMENTED on unimplemented methods', server: true do
+        @srv.handle(NoRpcImplementation)
+        t = Thread.new { @srv.run }
+        @srv.wait_till_running
+        req = EchoMsg.new
+        blk = proc do
+          cq = GRPC::Core::CompletionQueue.new
+          stub = GRPC::ClientStub.new(@host, cq, :this_channel_is_insecure,
+                                      **client_opts)
+          stub.request_response('/an_rpc', req, marshal, unmarshal)
+        end
+        expect(&blk).to raise_error do |error|
+          expect(error).to be_a(GRPC::BadStatus)
+          expect(error.code).to be(GRPC::Core::StatusCodes::UNIMPLEMENTED)
+        end
+        @srv.stop
+        t.join
+      end
+
       it 'should handle multiple sequential requests', server: true do
         @srv.handle(EchoService)
         t = Thread.new { @srv.run }
diff --git a/src/ruby/spec/generic/service_spec.rb b/src/ruby/spec/generic/service_spec.rb
index 5e7b6c7..76034e4 100644
--- a/src/ruby/spec/generic/service_spec.rb
+++ b/src/ruby/spec/generic/service_spec.rb
@@ -273,73 +273,4 @@
       end
     end
   end
-
-  describe '#assert_rpc_descs_have_methods' do
-    it 'fails if there is no instance method for an rpc descriptor' do
-      c1 = Class.new do
-        include GenericService
-        rpc :AnRpc, GoodMsg, GoodMsg
-      end
-      expect { c1.assert_rpc_descs_have_methods }.to raise_error
-
-      c2 = Class.new do
-        include GenericService
-        rpc :AnRpc, GoodMsg, GoodMsg
-        rpc :AnotherRpc, GoodMsg, GoodMsg
-
-        def an_rpc
-        end
-      end
-      expect { c2.assert_rpc_descs_have_methods }.to raise_error
-    end
-
-    it 'passes if there are corresponding methods for each descriptor' do
-      c = Class.new do
-        include GenericService
-        rpc :AnRpc, GoodMsg, GoodMsg
-        rpc :AServerStreamer, GoodMsg, stream(GoodMsg)
-        rpc :AClientStreamer, stream(GoodMsg), GoodMsg
-        rpc :ABidiStreamer, stream(GoodMsg), stream(GoodMsg)
-
-        def an_rpc(_req, _call)
-        end
-
-        def a_server_streamer(_req, _call)
-        end
-
-        def a_client_streamer(_call)
-        end
-
-        def a_bidi_streamer(_call)
-        end
-      end
-      expect { c.assert_rpc_descs_have_methods }.to_not raise_error
-    end
-
-    it 'passes for subclasses of that include GenericService' do
-      base = Class.new do
-        include GenericService
-        rpc :AnRpc, GoodMsg, GoodMsg
-
-        def an_rpc(_req, _call)
-        end
-      end
-      c = Class.new(base)
-      expect { c.assert_rpc_descs_have_methods }.to_not raise_error
-      expect(c.include?(GenericService)).to be(true)
-    end
-
-    it 'passes if subclasses define the rpc methods' do
-      base = Class.new do
-        include GenericService
-        rpc :AnRpc, GoodMsg, GoodMsg
-      end
-      c = Class.new(base) do
-        def an_rpc(_req, _call)
-        end
-      end
-      expect { c.assert_rpc_descs_have_methods }.to_not raise_error
-      expect(c.include?(GenericService)).to be(true)
-    end
-  end
 end
diff --git a/src/ruby/tools/README.md b/src/ruby/tools/README.md
new file mode 100644
index 0000000..e43f223
--- /dev/null
+++ b/src/ruby/tools/README.md
@@ -0,0 +1,12 @@
+# Ruby gRPC Tools
+
+This package distributes protoc and the Ruby gRPC protoc plugin for Windows, Linux, and Mac.
+
+Before this package is published, the following directories should be filled with the corresponding `protoc` and `grpc_ruby_plugin` executables.
+
+ - `bin/x86-linux`
+ - `bin/x86_64-linux`
+ - `bin/x86-macos`
+ - `bin/x86_64-macos`
+ - `bin/x86-windows`
+ - `bin/x86_64-windows`
diff --git a/tools/jenkins/docker_run_tests.sh b/src/ruby/tools/bin/grpc_tools_ruby_protoc.rb
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to src/ruby/tools/bin/grpc_tools_ruby_protoc.rb
index 2fc66c2..3a2a5b8 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/src/ruby/tools/bin/grpc_tools_ruby_protoc.rb
@@ -1,5 +1,5 @@
-#!/bin/bash
-# Copyright 2015, Google Inc.
+#!/usr/bin/env ruby
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +27,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.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+require 'rbconfig'
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+require_relative '../os_check'
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
+protoc_name = 'protoc' + RbConfig::CONFIG['EXEEXT']
 
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
+protoc_path = File.join(File.dirname(__FILE__),
+                        RbConfig::CONFIG['host_cpu'] + '-' + OS.os_name,
+                        protoc_name)
 
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+exec([ protoc_path, protoc_path ], *ARGV)
diff --git a/tools/jenkins/docker_run_tests.sh b/src/ruby/tools/bin/grpc_tools_ruby_protoc_plugin.rb
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to src/ruby/tools/bin/grpc_tools_ruby_protoc_plugin.rb
index 2fc66c2..4b296de 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/src/ruby/tools/bin/grpc_tools_ruby_protoc_plugin.rb
@@ -1,5 +1,5 @@
-#!/bin/bash
-# Copyright 2015, Google Inc.
+#!/usr/bin/env ruby
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +27,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.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+require 'rbconfig'
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+require_relative '../os_check'
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
+plugin_name = 'grpc_ruby_plugin' + RbConfig::CONFIG['EXEEXT']
 
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
+plugin_path = File.join(File.dirname(__FILE__),
+                        RbConfig::CONFIG['host_cpu'] + '-' + OS.os_name,
+                        plugin_name)
 
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+exec([ plugin_path, plugin_path ], *ARGV)
diff --git a/src/ruby/tools/grpc-tools.gemspec b/src/ruby/tools/grpc-tools.gemspec
new file mode 100644
index 0000000..9fa4b66
--- /dev/null
+++ b/src/ruby/tools/grpc-tools.gemspec
@@ -0,0 +1,22 @@
+# -*- ruby -*-
+# encoding: utf-8
+require_relative 'version.rb'
+Gem::Specification.new do |s|
+  s.name = 'grpc-tools'
+  s.version = GRPC::Tools::VERSION
+  s.authors = ['grpc Authors']
+  s.email = 'grpc-io@googlegroups.com'
+  s.homepage = 'https://github.com/google/grpc/tree/master/src/ruby/tools'
+  s.summary = 'Development tools for Ruby gRPC'
+  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 += Dir.glob('bin/**/*')
+
+  s.bindir = 'bin'
+
+  s.platform = Gem::Platform::RUBY
+
+  s.executables = %w( grpc_tools_ruby_protoc.rb grpc_tools_ruby_protoc_plugin.rb )
+end
diff --git a/tools/jenkins/docker_run_tests.sh b/src/ruby/tools/os_check.rb
old mode 100755
new mode 100644
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to src/ruby/tools/os_check.rb
index 2fc66c2..2677306
--- a/tools/jenkins/docker_run_tests.sh
+++ b/src/ruby/tools/os_check.rb
@@ -1,5 +1,4 @@
-#!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +26,20 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+require 'rbconfig'
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+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
diff --git a/tools/jenkins/docker_run_tests.sh b/src/ruby/tools/version.rb
old mode 100755
new mode 100644
similarity index 61%
copy from tools/jenkins/docker_run_tests.sh
copy to src/ruby/tools/version.rb
index 2fc66c2..dca7fd7
--- a/tools/jenkins/docker_run_tests.sh
+++ b/src/ruby/tools/version.rb
@@ -1,4 +1,3 @@
-#!/bin/bash
 # Copyright 2015, Google Inc.
 # All rights reserved.
 #
@@ -27,41 +26,9 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
-
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
-
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+module GRPC
+  module Tools
+    VERSION = '0.15.0.dev'
+  end
+end
diff --git a/templates/Makefile.template b/templates/Makefile.template
index e84ceeb..0d5f0ec 100644
--- a/templates/Makefile.template
+++ b/templates/Makefile.template
@@ -49,6 +49,19 @@
 
     sources_that_need_openssl = set()
     sources_that_don_t_need_openssl = set()
+
+    # warnings we'd like, but that dont exist in all compilers
+    PREFERRED_WARNINGS=['shadow', 'extra-semi']
+    CHECK_WARNINGS=PREFERRED_WARNINGS + ['no-shift-negative-value']
+
+    def warning_var(fmt, warning):
+      return fmt % warning.replace('-', '_').upper()
+
+    def neg_warning(warning):
+      if warning[0:3] == 'no-':
+        return warning[3:]
+      else:
+        return 'no-' + warning
   %>
 
 
@@ -187,17 +200,14 @@
   CXX11_CHECK_CMD = $(CXX) -std=c++11 -o $(TMPOUT) -c test/build/c++11.cc
   HAS_CXX11 = $(shell $(CXX11_CHECK_CMD) 2> /dev/null && echo true || echo false)
 
-  CHECK_SHADOW_WORKS_CMD = $(CC) -std=c99 -Werror -Wshadow -o $(TMPOUT) -c test/build/shadow.c
-  HAS_WORKING_SHADOW = $(shell $(CHECK_SHADOW_WORKS_CMD) 2> /dev/null && echo true || echo false)
-  ifeq ($(HAS_WORKING_SHADOW),true)
-  W_SHADOW=-Wshadow
+  %for warning in CHECK_WARNINGS:
+  ${warning_var('CHECK_%s_WORKS_CMD', warning)} = $(CC) -std=c99 -Werror -W${warning} -o $(TMPOUT) -c test/build/${warning}.c
+  ${warning_var('HAS_WORKING_%s', warning)} = $(shell $(${warning_var('CHECK_%s_WORKS_CMD', warning)}) 2> /dev/null && echo true || echo false)
+  ifeq ($(${warning_var('HAS_WORKING_%s', warning)}),true)
+  ${warning_var('W_%s', warning)}=-W${warning}
+  ${warning_var('NO_W_%s', warning)}=-W${neg_warning(warning)}
   endif
-
-  CHECK_NO_SHIFT_NEGATIVE_VALUE_CMD = $(CC) -std=c99 -Werror -Wno-shift-negative-value -o $(TMPOUT) -c test/build/empty.c
-  HAS_NO_SHIFT_NEGATIVE_VALUE = $(shell $(CHECK_NO_SHIFT_NEGATIVE_VALUE_CMD) 2> /dev/null && echo true || echo false)
-  ifeq ($(HAS_NO_SHIFT_NEGATIVE_VALUE),true)
-  W_NO_SHIFT_NEGATIVE_VALUE=-Wno-shift-negative-value
-  endif
+  %endfor
 
   # The HOST compiler settings are used to compile the protoc plugins.
   # In most cases, you won't have to change anything, but if you are
@@ -213,7 +223,7 @@
   DEFINES += $(EXTRA_DEFINES)
   endif
 
-  CFLAGS += -std=c99 -Wsign-conversion -Wconversion $(W_SHADOW)
+  CFLAGS += -std=c99 -Wsign-conversion -Wconversion ${' '.join(warning_var('$(W_%s)', warning) for warning in PREFERRED_WARNINGS)}
   ifeq ($(HAS_CXX11),true)
   CXXFLAGS += -std=c++11
   else
@@ -1698,7 +1708,7 @@
   # 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
-  $(${tgt.name.upper()}_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value
+  $(${tgt.name.upper()}_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
   $(${tgt.name.upper()}_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
   $(${tgt.name.upper()}_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
   % else:
diff --git a/templates/gRPC.podspec.template b/templates/gRPC.podspec.template
index a9948a4..979cb1e 100644
--- a/templates/gRPC.podspec.template
+++ b/templates/gRPC.podspec.template
@@ -54,7 +54,7 @@
   %>
   Pod::Spec.new do |s|
     s.name     = 'gRPC'
-    version = '0.12.0'
+    version = '0.14.0'
     s.version  = version
     s.summary  = 'gRPC client library for iOS/OSX'
     s.homepage = 'http://www.grpc.io'
@@ -62,7 +62,8 @@
     s.authors  = { 'The gRPC contributors' => 'grpc-packages@google.com' }
 
     s.source = { :git => 'https://github.com/grpc/grpc.git',
-                 :tag => "release-#{version.gsub(/\./, '_')}-objectivec-#{version}" }
+                 :tag => "release-#{version.gsub(/\./, '_')}-objectivec-#{version}",
+                 :submodules => true }
 
   
     s.ios.deployment_target = '7.1'
@@ -97,7 +98,7 @@
 
       ss.requires_arc = false
       ss.libraries = 'z'
-      ss.dependency 'BoringSSL', '~> 2.0'
+      ss.dependency 'BoringSSL', '~> 3.0'
 
       # ss.compiler_flags = '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w'
     end
diff --git a/templates/package.json.template b/templates/package.json.template
index 11718b1..9d19ca0 100644
--- a/templates/package.json.template
+++ b/templates/package.json.template
@@ -69,6 +69,8 @@
       "src/node/ext",
       "include/grpc",
       "src/core",
+      "src/boringssl",
+      "src/zlib",
       "third_party/nanopb",
       "third_party/zlib",
       "third_party/boringssl",
diff --git a/templates/src/node/tools/package.json.template b/templates/src/node/tools/package.json.template
index 4f673c4..69ad71a 100644
--- a/templates/src/node/tools/package.json.template
+++ b/templates/src/node/tools/package.json.template
@@ -18,8 +18,8 @@
       }
     ],
     "bin": {
-      "grpc-tools-protoc": "./bin/protoc.js",
-      "grpc-tools-plugin": "./bin/protoc_plugin.js"
+      "grpc_tools_node_protoc": "./bin/protoc.js",
+      "grpc_tools_node_protoc_plugin": "./bin/protoc_plugin.js"
     },
     "scripts": {
       "install": "./node_modules/.bin/node-pre-gyp install"
diff --git a/templates/src/ruby/tools/version.rb.template b/templates/src/ruby/tools/version.rb.template
new file mode 100644
index 0000000..dbc5f48
--- /dev/null
+++ b/templates/src/ruby/tools/version.rb.template
@@ -0,0 +1,36 @@
+%YAML 1.2
+--- |
+  # 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.
+
+  module GRPC
+    module Tools
+      VERSION = '${settings.ruby_version.ruby()}'
+    end
+  end
diff --git a/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template b/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template
new file mode 100644
index 0000000..200905d
--- /dev/null
+++ b/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template
@@ -0,0 +1,34 @@
+%YAML 1.2
+--- |
+  # 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.
+
+  # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!!
+
+  VERSION='${settings.python_version.pep440()}'
diff --git a/templates/tools/dockerfile/node_deps.include b/templates/tools/dockerfile/node_deps.include
index 7d37d67..7855fbf 100644
--- a/templates/tools/dockerfile/node_deps.include
+++ b/templates/tools/dockerfile/node_deps.include
@@ -4,4 +4,8 @@
 # Install nvm
 RUN touch .profile
 RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
+# Install all versions of node that we want to test
 RUN /bin/bash -l -c "nvm install 0.12 && npm config set cache /tmp/npm-cache"
+RUN /bin/bash -l -c "nvm install 4 && npm config set cache /tmp/npm-cache"
+RUN /bin/bash -l -c "nvm install 5 && npm config set cache /tmp/npm-cache"
+RUN /bin/bash -l -c "nvm alias default 4"
\ No newline at end of file
diff --git a/templates/tools/dockerfile/stress_test/grpc_interop_stress_csharp/Dockerfile.template b/templates/tools/dockerfile/stress_test/grpc_interop_stress_csharp/Dockerfile.template
new file mode 100644
index 0000000..0741782
--- /dev/null
+++ b/templates/tools/dockerfile/stress_test/grpc_interop_stress_csharp/Dockerfile.template
@@ -0,0 +1,41 @@
+%YAML 1.2
+--- |
+  # 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.
+  
+  FROM debian:jessie
+  
+  <%include file="../../apt_get_basic.include"/>
+  <%include file="../../ccache_setup.include"/>
+  <%include file="../../cxx_deps.include"/>
+  <%include file="../../gcp_api_libraries.include"/>
+  <%include file="../../csharp_deps.include"/>
+  # Define the default command.
+  CMD ["bash"]
+  
diff --git a/templates/tools/dockerfile/stress_test/grpc_interop_stress_python/Dockerfile.template b/templates/tools/dockerfile/stress_test/grpc_interop_stress_python/Dockerfile.template
new file mode 100644
index 0000000..27e9eee
--- /dev/null
+++ b/templates/tools/dockerfile/stress_test/grpc_interop_stress_python/Dockerfile.template
@@ -0,0 +1,45 @@
+%YAML 1.2
+--- |
+  # 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.
+  
+  FROM debian:jessie
+  
+  <%include file="../../apt_get_basic.include"/>
+  <%include file="../../ccache_setup.include"/>
+  <%include file="../../cxx_deps.include"/>
+  <%include file="../../gcp_api_libraries.include"/>
+  <%include file="../../python_deps.include"/>
+
+  RUN pip install coverage
+  RUN pip install oauth2client
+
+  # Define the default command.
+  CMD ["bash"]
+  
diff --git a/templates/tools/dockerfile/stress_test/grpc_interop_stress_ruby/Dockerfile.template b/templates/tools/dockerfile/stress_test/grpc_interop_stress_ruby/Dockerfile.template
new file mode 100644
index 0000000..8b933aa
--- /dev/null
+++ b/templates/tools/dockerfile/stress_test/grpc_interop_stress_ruby/Dockerfile.template
@@ -0,0 +1,41 @@
+%YAML 1.2
+--- |
+  # 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.
+  
+  FROM debian:jessie
+  
+  <%include file="../../apt_get_basic.include"/>
+  <%include file="../../ccache_setup.include"/>
+  <%include file="../../cxx_deps.include"/>
+  <%include file="../../gcp_api_libraries.include"/>
+  <%include file="../../ruby_deps.include"/>
+  # Define the default command.
+  CMD ["bash"]
+  
diff --git a/templates/tools/dockerfile/test/sanity/Dockerfile.template b/templates/tools/dockerfile/test/sanity/Dockerfile.template
index 8d6f52d..8e2140e 100644
--- a/templates/tools/dockerfile/test/sanity/Dockerfile.template
+++ b/templates/tools/dockerfile/test/sanity/Dockerfile.template
@@ -43,7 +43,17 @@
         python-virtualenv ${"\\"}
         python-lxml
   RUN pip install simplejson mako
-
+  
+  #======================================
+  # More sanity test dependencies (bazel)
+  RUN echo "deb http://httpredir.debian.org/debian jessie-backports main" > \
+    /etc/apt/sources.list.d/backports.list
+  RUN apt-get update
+  RUN apt-get -t jessie-backports install -y openjdk-8-jdk
+  RUN git clone https://github.com/bazelbuild/bazel.git /bazel
+  RUN cd /bazel && ./compile.sh
+  RUN ln -s /bazel/output/bazel /bin/
+  
   #===================
   # Docker "inception"
   # Note this is quite the ugly hack.
diff --git a/examples/node/greeter_client.js b/test/build/extra-semi.c
similarity index 72%
copy from examples/node/greeter_client.js
copy to test/build/extra-semi.c
index 2820acb..60466dd 100644
--- a/examples/node/greeter_client.js
+++ b/test/build/extra-semi.c
@@ -1,6 +1,6 @@
 /*
  *
- * Copyright 2015, Google Inc.
+ * Copyright 2016, Google Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,23 +31,4 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
-
-var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
-
-function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
-                                       grpc.credentials.createInsecure());
-  var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
-  } else {
-    user = 'world';
-  }
-  client.sayHello({name: user}, function(err, response) {
-    console.log('Greeting:', response.message);
-  });
-}
-
-main();
+int main(void) {}
diff --git a/examples/node/greeter_client.js b/test/build/no-shift-negative-value.c
similarity index 74%
copy from examples/node/greeter_client.js
copy to test/build/no-shift-negative-value.c
index 2820acb..58e4698 100644
--- a/examples/node/greeter_client.js
+++ b/test/build/no-shift-negative-value.c
@@ -31,23 +31,4 @@
  *
  */
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
-
-var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
-
-function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
-                                       grpc.credentials.createInsecure());
-  var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
-  } else {
-    user = 'world';
-  }
-  client.sayHello({name: user}, function(err, response) {
-    console.log('Greeting:', response.message);
-  });
-}
-
-main();
+int main(void) {}
diff --git a/test/core/bad_client/bad_client.c b/test/core/bad_client/bad_client.c
index cd5b541..e582068 100644
--- a/test/core/bad_client/bad_client.c
+++ b/test/core/bad_client/bad_client.c
@@ -75,9 +75,22 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-void grpc_run_bad_client_test(grpc_bad_client_server_side_validator validator,
-                              const char *client_payload,
-                              size_t client_payload_length, uint32_t flags) {
+typedef struct {
+  grpc_bad_client_client_stream_validator validator;
+  gpr_slice_buffer incoming;
+  gpr_event read_done;
+} read_args;
+
+static void read_done(grpc_exec_ctx *exec_ctx, void *arg, bool success) {
+  read_args *a = arg;
+  a->validator(&a->incoming);
+  gpr_event_set(&a->read_done, (void *)1);
+}
+
+void grpc_run_bad_client_test(
+    grpc_bad_client_server_side_validator server_validator,
+    grpc_bad_client_client_stream_validator client_validator,
+    const char *client_payload, size_t client_payload_length, uint32_t flags) {
   grpc_endpoint_pair sfd;
   thd_args a;
   gpr_thd_id id;
@@ -108,7 +121,7 @@
   a.cq = grpc_completion_queue_create(NULL);
   gpr_event_init(&a.done_thd);
   gpr_event_init(&a.done_write);
-  a.validator = validator;
+  a.validator = server_validator;
   grpc_server_register_completion_queue(a.server, a.cq, NULL);
   a.registered_method =
       grpc_server_register_method(a.server, GRPC_BAD_CLIENT_REGISTERED_METHOD,
@@ -151,8 +164,23 @@
 
   GPR_ASSERT(gpr_event_wait(&a.done_thd, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5)));
 
-  /* Shutdown */
-  if (sfd.client) {
+  if (sfd.client != NULL) {
+    // Validate client stream, if requested.
+    if (client_validator != NULL) {
+      read_args args;
+      args.validator = client_validator;
+      gpr_slice_buffer_init(&args.incoming);
+      gpr_event_init(&args.read_done);
+      grpc_closure read_done_closure;
+      grpc_closure_init(&read_done_closure, read_done, &args);
+      grpc_endpoint_read(&exec_ctx, sfd.client, &args.incoming,
+                         &read_done_closure);
+      grpc_exec_ctx_finish(&exec_ctx);
+      GPR_ASSERT(
+          gpr_event_wait(&args.read_done, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5)));
+      gpr_slice_buffer_destroy(&args.incoming);
+    }
+    // Shutdown.
     grpc_endpoint_shutdown(&exec_ctx, sfd.client);
     grpc_endpoint_destroy(&exec_ctx, sfd.client);
     grpc_exec_ctx_finish(&exec_ctx);
diff --git a/test/core/bad_client/bad_client.h b/test/core/bad_client/bad_client.h
index 19ddba8..c8b2a41 100644
--- a/test/core/bad_client/bad_client.h
+++ b/test/core/bad_client/bad_client.h
@@ -44,18 +44,24 @@
                                                       grpc_completion_queue *cq,
                                                       void *registered_method);
 
+typedef void (*grpc_bad_client_client_stream_validator)(
+    gpr_slice_buffer *incoming);
+
 #define GRPC_BAD_CLIENT_DISCONNECT 1
 
 /* Test runner.
 
    Create a server, and send client_payload to it as bytes from a client.
-   Execute validator in a separate thread to assert that the bytes are
+   Execute server_validator in a separate thread to assert that the bytes are
    handled as expected. */
-void grpc_run_bad_client_test(grpc_bad_client_server_side_validator validator,
-                              const char *client_payload,
-                              size_t client_payload_length, uint32_t flags);
+void grpc_run_bad_client_test(
+    grpc_bad_client_server_side_validator server_validator,
+    grpc_bad_client_client_stream_validator client_validator,
+    const char *client_payload, size_t client_payload_length, uint32_t flags);
 
-#define GRPC_RUN_BAD_CLIENT_TEST(validator, payload, flags) \
-  grpc_run_bad_client_test(validator, payload, sizeof(payload) - 1, flags)
+#define GRPC_RUN_BAD_CLIENT_TEST(server_validator, client_validator, payload, \
+                                 flags)                                       \
+  grpc_run_bad_client_test(server_validator, client_validator, payload,       \
+                           sizeof(payload) - 1, flags)
 
 #endif /* GRPC_TEST_CORE_BAD_CLIENT_BAD_CLIENT_H */
diff --git a/test/core/bad_client/gen_build_yaml.py b/test/core/bad_client/gen_build_yaml.py
index d49858e..fb86525 100755
--- a/test/core/bad_client/gen_build_yaml.py
+++ b/test/core/bad_client/gen_build_yaml.py
@@ -29,7 +29,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-"""Generates the appropriate build.json data for all the end2end tests."""
+"""Generates the appropriate build.json data for all the bad_client tests."""
 
 
 import collections
@@ -45,6 +45,7 @@
     'headers': default_test_options._replace(cpu_cost=0.2),
     'initial_settings_frame': default_test_options._replace(cpu_cost=0.2),
     'head_of_line_blocking': default_test_options,
+    'large_metadata': default_test_options,
     'server_registered_method': default_test_options,
     'simple_request': default_test_options,
     'window_overflow': default_test_options,
diff --git a/test/core/bad_client/tests/badreq.c b/test/core/bad_client/tests/badreq.c
index b17e3b3..5d9ffef 100644
--- a/test/core/bad_client/tests/badreq.c
+++ b/test/core/bad_client/tests/badreq.c
@@ -56,7 +56,7 @@
 
   /* invalid content type */
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier, PFX_STR
+      verifier, NULL, PFX_STR
       "\x00\x00\xc2\x01\x04\x00\x00\x00\x01"
       "\x10\x05:path\x08/foo/bar"
       "\x10\x07:scheme\x04http"
@@ -71,7 +71,7 @@
 
   /* invalid te */
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier, PFX_STR
+      verifier, NULL, PFX_STR
       "\x00\x00\xcb\x01\x04\x00\x00\x00\x01"
       "\x10\x05:path\x08/foo/bar"
       "\x10\x07:scheme\x04http"
@@ -88,7 +88,7 @@
 
   /* two path headers */
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier, PFX_STR
+      verifier, NULL, PFX_STR
       "\x00\x00\xd9\x01\x04\x00\x00\x00\x01"
       "\x10\x05:path\x08/foo/bar"
       "\x10\x05:path\x08/foo/bah"
@@ -105,7 +105,7 @@
 
   /* bad accept-encoding algorithm */
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier, PFX_STR
+      verifier, NULL, PFX_STR
       "\x00\x00\xd2\x01\x04\x00\x00\x00\x01"
       "\x10\x05:path\x08/foo/bar"
       "\x10\x07:scheme\x04http"
@@ -121,7 +121,7 @@
 
   /* bad grpc-encoding algorithm */
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier, PFX_STR
+      verifier, NULL, PFX_STR
       "\x00\x00\xf5\x01\x04\x00\x00\x00\x01"
       "\x10\x05:path\x08/foo/bar"
       "\x10\x07:scheme\x04http"
diff --git a/test/core/bad_client/tests/connection_prefix.c b/test/core/bad_client/tests/connection_prefix.c
index 9a30aad..bc5ed2e 100644
--- a/test/core/bad_client/tests/connection_prefix.c
+++ b/test/core/bad_client/tests/connection_prefix.c
@@ -46,29 +46,30 @@
 int main(int argc, char **argv) {
   grpc_test_init(argc, argv);
 
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "X", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRIX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI X", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI *X", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * X", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTPX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/X", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2X", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2.X", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2.0X", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2.0\rX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2.0\r\nX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2.0\r\n\rX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2.0\r\n\r\nX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2.0\r\n\r\nSX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2.0\r\n\r\nSMX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2.0\r\n\r\nSM\rX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2.0\r\n\r\nSM\r\nX", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, "PRI * HTTP/2.0\r\n\r\nSM\r\n\rX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "X", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRIX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI X", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI *X", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * X", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTPX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/X", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2X", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2.X", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2.0X", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2.0\rX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2.0\r\nX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2.0\r\n\rX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2.0\r\n\r\nX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2.0\r\n\r\nSX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2.0\r\n\r\nSMX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2.0\r\n\r\nSM\rX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2.0\r\n\r\nSM\r\nX", 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "PRI * HTTP/2.0\r\n\r\nSM\r\n\rX",
+                           0);
   return 0;
 }
diff --git a/test/core/bad_client/tests/head_of_line_blocking.c b/test/core/bad_client/tests/head_of_line_blocking.c
index 53cd453..e4051bb 100644
--- a/test/core/bad_client/tests/head_of_line_blocking.c
+++ b/test/core/bad_client/tests/head_of_line_blocking.c
@@ -144,7 +144,7 @@
     addbuf(hdr, sizeof(hdr));
     addbuf(msg, FRAME_SIZE);
   }
-  grpc_run_bad_client_test(verifier, g_buffer, g_count, 0);
+  grpc_run_bad_client_test(verifier, NULL, g_buffer, g_count, 0);
   gpr_free(g_buffer);
 
   return 0;
diff --git a/test/core/bad_client/tests/headers.c b/test/core/bad_client/tests/headers.c
index 4c1a767..f872e50 100644
--- a/test/core/bad_client/tests/headers.c
+++ b/test/core/bad_client/tests/headers.c
@@ -51,249 +51,251 @@
   grpc_test_init(argc, argv);
 
   /* partial http2 header prefixes */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x01",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00\x01",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x01\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00\x01\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x01\x04",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00\x01\x04",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x01\x05",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00\x01\x05",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x01\x04\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00\x01\x04\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x01\x04\x00\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR "\x00\x00\x00\x01\x04\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x01\x04\x00\x00\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR "\x00\x00\x00\x01\x04\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x00\x01\x04\x00\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x00\x01\x04\x00\x00\x00\x01",
                            GRPC_BAD_CLIENT_DISCONNECT);
 
   /* test adding prioritization data */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x01\x01\x24\x00\x00\x00\x01"
                            "\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x02\x01\x24\x00\x00\x00\x01"
                            "\x00\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x03\x01\x24\x00\x00\x00\x01"
                            "\x00\x00\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x04\x01\x24\x00\x00\x00\x01"
                            "\x00\x00\x00\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "\x00\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "\x00\x00\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
 
   /* test looking up an invalid index */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x01\x01\x04\x00\x00\x00\x01"
                            "\xfe",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x04\x01\x04\x00\x00\x00\x01"
                            "\x7f\x7f\x01"
                            "a",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x04\x01\x04\x00\x00\x00\x01"
                            "\x0f\x7f\x01"
                            "a",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x04\x01\x04\x00\x00\x00\x01"
                            "\x1f\x7f\x01"
                            "a",
                            0);
   /* test nvr, not indexed in static table */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\x01\x01"
                            "a",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\x11\x01"
                            "a",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* illegal op code */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x01\x01\x04\x00\x00\x00\x01"
                            "\x80",
                            0);
   /* parse some long indices */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x02\x01\x04\x00\x00\x00\x01"
                            "\xff\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x04\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x05\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x06\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x07\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x80\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x80\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x80\x80\x00",
                            0);
   /* overflow on byte 4 */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x06\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x7f",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x06\x01\x04\x00\x00\x00\x01"
                            "\xff\xff\xff\xff\xff\x0f",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* overflow after byte 4 */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x80\x80\x02",
                            0);
   /* end of headers mid-opcode */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x01\x01\x04\x00\x00\x00\x01"
                            "\x01",
                            GRPC_BAD_CLIENT_DISCONNECT);
 
   /* dynamic table size update: set to default */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\x3f\xe1\x1f",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* dynamic table size update: set too large */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\x3f\xf1\x1f",
                            0);
   /* dynamic table size update: set twice */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x04\x01\x04\x00\x00\x00\x01"
                            "\x20\x3f\xe1\x1f",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* dynamic table size update: set thrice */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\x20\x20\x20",
                            0);
 
   /* non-ending header followed by continuation frame */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x00\x01\x00\x00\x00\x00\x01"
                            "\x00\x00\x00\x09\x04\x00\x00\x00\x01",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* non-ending header followed by non-continuation frame */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x00\x01\x00\x00\x00\x00\x01"
                            "\x00\x00\x00\x00\x04\x00\x00\x00\x01",
                            0);
   /* non-ending header followed by a continuation frame for a different stream
    */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x00\x01\x04\x00\x00\x00\x01"
                            "\x00\x00\x00\x01\x00\x00\x00\x00\x03"
                            "\x00\x00\x00\x09\x04\x00\x00\x00\x01",
                            0);
   /* opening with a continuation frame */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x00\x09\x04\x00\x00\x00\x01", 0);
   /* three header frames */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x00\x01\x04\x00\x00\x00\x01"
                            "\x00\x00\x00\x01\x04\x00\x00\x00\x01"
                            "\x00\x00\x00\x01\x04\x00\x00\x00\x01",
                            GRPC_BAD_CLIENT_DISCONNECT);
 
   /* an invalid header found with fuzzing */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x00\x01\x39\x67\xed\x1d\x64",
                            GRPC_BAD_CLIENT_DISCONNECT);
 
   /* a badly encoded timeout value */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x19\x01\x04\x00\x00\x00\x01"
                            "\x10\x0cgrpc-timeout\x0a"
                            "15 seconds",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* a badly encoded timeout value: twice (catches caching) */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x19\x01\x04\x00\x00\x00\x01"
                            "\x10\x0cgrpc-timeout\x0a"
                            "15 seconds"
diff --git a/test/core/bad_client/tests/initial_settings_frame.c b/test/core/bad_client/tests/initial_settings_frame.c
index 63a770d..b84b67a 100644
--- a/test/core/bad_client/tests/initial_settings_frame.c
+++ b/test/core/bad_client/tests/initial_settings_frame.c
@@ -50,70 +50,72 @@
   grpc_test_init(argc, argv);
 
   /* various partial prefixes */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x06",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x06",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x06",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x06",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x06",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x06",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x04",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00\x04",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x04\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00\x04\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x04\x01",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00\x04\x01",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x04\xff",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00\x04\xff",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x04\x00\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR "\x00\x00\x00\x04\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x04\x00\x00\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR "\x00\x00\x00\x04\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR "\x00\x00\x00\x04\x00\x00\x00\x00",
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR "\x00\x00\x00\x04\x00\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* must not send frames with stream id != 0 */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x00\x04\x00\x00\x00\x00\x01", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x00\x04\x00\x40\x00\x00\x00", 0);
   /* settings frame must be a multiple of six bytes long */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x01\x04\x00\x00\x00\x00\x00", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x02\x04\x00\x00\x00\x00\x00", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x03\x04\x00\x00\x00\x00\x00", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x04\x04\x00\x00\x00\x00\x00", 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x05\x04\x00\x00\x00\x00\x00", 0);
   /* some settings values are illegal */
   /* max frame size = 0 */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR ONE_SETTING_HDR "\x00\x05\x00\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR ONE_SETTING_HDR "\x00\x06\xff\xff\xff\xff",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* update intiial window size */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR ONE_SETTING_HDR "\x00\x04\x00\x01\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* ack with data */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x00\x04\x00\x00\x00\x00\x00"
                            "\x00\x00\x01\x04\x01\x00\x00\x00\x00",
                            0);
   /* settings frame with invalid flags */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x00\x04\x10\x00\x00\x00\x00", 0);
   /* unknown settings should be ignored */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR ONE_SETTING_HDR "\x00\x99\x00\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
 
diff --git a/test/core/bad_client/tests/large_metadata.c b/test/core/bad_client/tests/large_metadata.c
new file mode 100644
index 0000000..1a8d2a2
--- /dev/null
+++ b/test/core/bad_client/tests/large_metadata.c
@@ -0,0 +1,489 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "test/core/bad_client/bad_client.h"
+
+#include <string.h>
+
+#include <grpc/support/alloc.h>
+#include "src/core/lib/surface/server.h"
+#include "test/core/end2end/cq_verifier.h"
+
+#define PFX_TOO_MUCH_METADATA_FROM_CLIENT_STR                              \
+  "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"     /* settings frame */              \
+  "\x00\x00\x00\x04\x00\x00\x00\x00\x00" /* headers: generated from        \
+                                            large_metadata.headers in this \
+                                            directory */                   \
+  "\x00"                                                                   \
+  "5{\x01\x05\x00\x00\x00\x01"                                             \
+  "\x10\x05:path\x08/foo/bar"                                              \
+  "\x10\x07:scheme\x04http"                                                \
+  "\x10\x07:method\x04POST"                                                \
+  "\x10\x0a:authority\x09localhost"                                        \
+  "\x10\x0c"                                                               \
+  "content-type\x10"                                                       \
+  "application/grpc"                                                       \
+  "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip"                  \
+  "\x10\x02te\x08trailers"                                                 \
+  "\x10\x0auser-agent\"bad-client grpc-c/0.12.0.0 (linux)"                 \
+  "\x10\x0duser-header00~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header01~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header02~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header03~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header04~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header05~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header06~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header07~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header08~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header09~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header10~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header11~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header12~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header13~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header14~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header15~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header16~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header17~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header18~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header19~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header20~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header21~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header22~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header23~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header24~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header25~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header26~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header27~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header28~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header29~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header30~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header31~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header32~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header33~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header34~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header35~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header36~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header37~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header38~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header39~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header40~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header41~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header42~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header43~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header44~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header45~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header46~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header47~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header48~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header49~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header50~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header51~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header52~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header53~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header54~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header55~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header56~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header57~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header58~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header59~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header60~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header61~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header62~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header63~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header64~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header65~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header66~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header67~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header68~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header69~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header70~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header71~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header72~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header73~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header74~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header75~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header76~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header77~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header78~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header79~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header80~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header81~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header82~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header83~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header84~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header85~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header86~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header87~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header88~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header89~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header90~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header91~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header92~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header93~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"                                                               \
+  "\x10\x0duser-header94~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
+  "aaaaaaaa"
+
+#define PFX_TOO_MUCH_METADATA_FROM_SERVER_STR                                              \
+  "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" /* settings frame: sets                               \
+                                        MAX_HEADER_LIST_SIZE to 16K */                     \
+  "\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x06\x00\x00\x40\x00" /* headers:               \
+                                                                    generated              \
+                                                                    from                   \
+                                                                    simple_request.headers \
+                                                                    in this                \
+                                                                    directory              \
+                                                                    */                     \
+  "\x00\x00\xc9\x01\x04\x00\x00\x00\x01"                                                   \
+  "\x10\x05:path\x08/foo/bar"                                                              \
+  "\x10\x07:scheme\x04http"                                                                \
+  "\x10\x07:method\x04POST"                                                                \
+  "\x10\x0a:authority\x09localhost"                                                        \
+  "\x10\x0c"                                                                               \
+  "content-type\x10"                                                                       \
+  "application/grpc"                                                                       \
+  "\x10\x14grpc-accept-encoding\x15"                                                       \
+  "deflate,identity,gzip"                                                                  \
+  "\x10\x02te\x08trailers"                                                                 \
+  "\x10\x0auser-agent\"bad-client grpc-c/0.12.0.0 (linux)"
+
+static void *tag(intptr_t t) { return (void *)t; }
+
+static void server_verifier(grpc_server *server, grpc_completion_queue *cq,
+                            void *registered_method) {
+  grpc_call_error error;
+  grpc_call *s;
+  grpc_call_details call_details;
+  cq_verifier *cqv = cq_verifier_create(cq);
+  grpc_metadata_array request_metadata_recv;
+
+  grpc_call_details_init(&call_details);
+  grpc_metadata_array_init(&request_metadata_recv);
+
+  error = grpc_server_request_call(server, &s, &call_details,
+                                   &request_metadata_recv, cq, cq, tag(101));
+  GPR_ASSERT(GRPC_CALL_OK == error);
+  cq_expect_completion(cqv, tag(101), 1);
+  cq_verify(cqv);
+
+  GPR_ASSERT(0 == strcmp(call_details.host, "localhost"));
+  GPR_ASSERT(0 == strcmp(call_details.method, "/foo/bar"));
+
+  grpc_metadata_array_destroy(&request_metadata_recv);
+  grpc_call_details_destroy(&call_details);
+  grpc_call_destroy(s);
+  cq_verifier_destroy(cqv);
+}
+
+static void server_verifier_sends_too_much_metadata(grpc_server *server,
+                                                    grpc_completion_queue *cq,
+                                                    void *registered_method) {
+  grpc_call_error error;
+  grpc_call *s;
+  grpc_call_details call_details;
+  cq_verifier *cqv = cq_verifier_create(cq);
+  grpc_metadata_array request_metadata_recv;
+
+  grpc_call_details_init(&call_details);
+  grpc_metadata_array_init(&request_metadata_recv);
+
+  error = grpc_server_request_call(server, &s, &call_details,
+                                   &request_metadata_recv, cq, cq, tag(101));
+  GPR_ASSERT(GRPC_CALL_OK == error);
+  cq_expect_completion(cqv, tag(101), 1);
+  cq_verify(cqv);
+
+  GPR_ASSERT(0 == strcmp(call_details.host, "localhost"));
+  GPR_ASSERT(0 == strcmp(call_details.method, "/foo/bar"));
+
+  const size_t metadata_value_size = 16 * 1024;
+  grpc_metadata meta;
+  meta.key = "key";
+  meta.value = gpr_malloc(metadata_value_size + 1);
+  memset((char *)meta.value, 'a', metadata_value_size);
+  ((char *)meta.value)[metadata_value_size] = 0;
+  meta.value_length = metadata_value_size;
+
+  grpc_op op;
+  op.op = GRPC_OP_SEND_INITIAL_METADATA;
+  op.data.send_initial_metadata.count = 1;
+  op.data.send_initial_metadata.metadata = &meta;
+  op.flags = 0;
+  op.reserved = NULL;
+  error = grpc_call_start_batch(s, &op, 1, tag(102), NULL);
+  GPR_ASSERT(GRPC_CALL_OK == error);
+  cq_expect_completion(cqv, tag(102), 0);  // Operation fails.
+  cq_verify(cqv);
+
+  gpr_free((char *)meta.value);
+  grpc_metadata_array_destroy(&request_metadata_recv);
+  grpc_call_details_destroy(&call_details);
+  grpc_call_destroy(s);
+  cq_verifier_destroy(cqv);
+}
+
+static void client_validator(gpr_slice_buffer *incoming) {
+  // Get last frame from incoming slice buffer.
+  gpr_slice_buffer last_frame_buffer;
+  gpr_slice_buffer_init(&last_frame_buffer);
+  gpr_slice_buffer_trim_end(incoming, 13, &last_frame_buffer);
+  GPR_ASSERT(last_frame_buffer.count == 1);
+  gpr_slice last_frame = last_frame_buffer.slices[0];
+  // Construct expected frame.
+  gpr_slice expected = gpr_slice_malloc(13);
+  uint8_t *p = GPR_SLICE_START_PTR(expected);
+  // Length.
+  *p++ = 0;
+  *p++ = 0;
+  *p++ = 4;
+  // Frame type (RST_STREAM).
+  *p++ = 3;
+  // Flags.
+  *p++ = 0;
+  // Stream ID.
+  *p++ = 0;
+  *p++ = 0;
+  *p++ = 0;
+  *p++ = 1;
+  // Payload (error code).
+  *p++ = 0;
+  *p++ = 0;
+  *p++ = 0;
+  *p++ = 11;
+  // Compare actual and expected.
+  GPR_ASSERT(gpr_slice_cmp(last_frame, expected) == 0);
+  gpr_slice_buffer_destroy(&last_frame_buffer);
+}
+
+int main(int argc, char **argv) {
+  grpc_test_init(argc, argv);
+
+  // Test sending more metadata than the server will accept.
+  GRPC_RUN_BAD_CLIENT_TEST(server_verifier, client_validator,
+                           PFX_TOO_MUCH_METADATA_FROM_CLIENT_STR, 0);
+
+  // Test sending more metadata than the client will accept.
+  GRPC_RUN_BAD_CLIENT_TEST(server_verifier_sends_too_much_metadata,
+                           client_validator,
+                           PFX_TOO_MUCH_METADATA_FROM_SERVER_STR, 0);
+
+  return 0;
+}
diff --git a/test/core/bad_client/tests/large_metadata.headers b/test/core/bad_client/tests/large_metadata.headers
new file mode 100644
index 0000000..75de3ef
--- /dev/null
+++ b/test/core/bad_client/tests/large_metadata.headers
@@ -0,0 +1,106 @@
+# headers used in simple_request.c
+# use tools/codegen/core/gen_header_frame.py --set_end_stream to generate
+# the binary strings contained in the source code
+:path: /foo/bar
+:scheme: http
+:method: POST
+:authority: localhost
+content-type: application/grpc
+grpc-accept-encoding: identity,deflate,gzip
+te: trailers
+user-agent: bad-client grpc-c/0.12.0.0 (linux)
+user-header00: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header01: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header02: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header03: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header04: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header05: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header06: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header07: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header08: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header09: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header22: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header23: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header24: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header25: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header26: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header27: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header28: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header29: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header30: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header31: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header32: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header33: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header34: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header35: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header36: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header37: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header38: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header39: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header40: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header41: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header42: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header43: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header44: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header45: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header46: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header47: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header48: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header49: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header50: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header51: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header52: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header53: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header54: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header55: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header56: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header57: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header58: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header59: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header60: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header61: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header62: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header63: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header64: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header65: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header66: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header67: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header68: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header69: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header70: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header71: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header72: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header73: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header74: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header75: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header76: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header77: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header78: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header79: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header80: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header81: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header82: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header83: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header84: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header85: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header86: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header87: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header88: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header89: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header90: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header91: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header92: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header93: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+user-header94: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/test/core/bad_client/tests/server_registered_method.c b/test/core/bad_client/tests/server_registered_method.c
index 60d3b89..6216553 100644
--- a/test/core/bad_client/tests/server_registered_method.c
+++ b/test/core/bad_client/tests/server_registered_method.c
@@ -111,43 +111,43 @@
 
   /* body generated with
    * tools/codegen/core/gen_server_registered_method_bad_client_test_body.py */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails, NULL,
                            PFX_STR "\x00\x00\x00\x00\x00\x00\x00\x00\x01",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails, NULL,
                            PFX_STR "\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails, NULL, PFX_STR
                            "\x00\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails, NULL, PFX_STR
                            "\x00\x00\x03\x00\x00\x00\x00\x00\x01\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier_fails,
+      verifier_fails, NULL,
       PFX_STR "\x00\x00\x04\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00",
       GRPC_BAD_CLIENT_DISCONNECT);
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier_succeeds,
+      verifier_succeeds, NULL,
       PFX_STR "\x00\x00\x05\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00", 0);
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier_fails,
+      verifier_fails, NULL,
       PFX_STR "\x00\x00\x05\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x01",
       GRPC_BAD_CLIENT_DISCONNECT);
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier_succeeds,
+      verifier_succeeds, NULL,
       PFX_STR "\x00\x00\x06\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00",
       0);
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier_fails,
+      verifier_fails, NULL,
       PFX_STR "\x00\x00\x05\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x02",
       GRPC_BAD_CLIENT_DISCONNECT);
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier_fails,
+      verifier_fails, NULL,
       PFX_STR "\x00\x00\x06\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x02\x00",
       GRPC_BAD_CLIENT_DISCONNECT);
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier_succeeds, PFX_STR
+      verifier_succeeds, NULL, PFX_STR
       "\x00\x00\x07\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x02\x00\x00",
       0);
 
diff --git a/test/core/bad_client/tests/simple_request.c b/test/core/bad_client/tests/simple_request.c
index 3ae6eb3..25bbe96 100644
--- a/test/core/bad_client/tests/simple_request.c
+++ b/test/core/bad_client/tests/simple_request.c
@@ -139,42 +139,42 @@
   grpc_test_init(argc, argv);
 
   /* basic request: check that things are working */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR, 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR_UNUSUAL, 0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR_UNUSUAL2, 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR, 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR_UNUSUAL, 0);
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR_UNUSUAL2, 0);
 
   /* push an illegal data frame */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
                            "\x00\x00\x05\x00\x00\x00\x00\x00\x01"
                            "\x34\x00\x00\x00\x00",
                            0);
 
   /* push a data frame with bad flags */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x00\x00\x02\x00\x00\x00\x01", 0);
   /* push a window update with a bad length */
-  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier, NULL,
                            PFX_STR "\x00\x00\x01\x08\x00\x00\x00\x00\x01", 0);
   /* push a window update with bad flags */
-  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier, NULL,
                            PFX_STR "\x00\x00\x00\x08\x10\x00\x00\x00\x01", 0);
   /* push a window update with bad data */
-  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier, NULL, PFX_STR
                            "\x00\x00\x04\x08\x00\x00\x00\x00\x01"
                            "\xff\xff\xff\xff",
                            0);
   /* push a short goaway */
-  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier, NULL,
                            PFX_STR "\x00\x00\x04\x07\x00\x00\x00\x00\x00", 0);
   /* disconnect before sending goaway */
-  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier, NULL,
                            PFX_STR "\x00\x01\x12\x07\x00\x00\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* push a rst_stream with a bad length */
-  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier, NULL,
                            PFX_STR "\x00\x00\x01\x03\x00\x00\x00\x00\x01", 0);
   /* push a rst_stream with bad flags */
-  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier, NULL,
                            PFX_STR "\x00\x00\x00\x03\x10\x00\x00\x00\x01", 0);
 
   return 0;
diff --git a/test/core/bad_client/tests/unknown_frame.c b/test/core/bad_client/tests/unknown_frame.c
index f3870a1..4f483d2 100644
--- a/test/core/bad_client/tests/unknown_frame.c
+++ b/test/core/bad_client/tests/unknown_frame.c
@@ -51,7 +51,7 @@
   grpc_test_init(argc, argv);
 
   /* test adding prioritization data */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier,
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x00\x88\x00\x00\x00\x00\x01",
                            GRPC_BAD_CLIENT_DISCONNECT);
 
diff --git a/test/core/bad_client/tests/window_overflow.c b/test/core/bad_client/tests/window_overflow.c
index 16f11e7..0d17dbe 100644
--- a/test/core/bad_client/tests/window_overflow.c
+++ b/test/core/bad_client/tests/window_overflow.c
@@ -105,7 +105,7 @@
       addbuf(message, sizeof(message));
     }
   }
-  grpc_run_bad_client_test(verifier, g_buffer, g_count, 0);
+  grpc_run_bad_client_test(verifier, NULL, g_buffer, g_count, 0);
   gpr_free(g_buffer);
 
   return 0;
diff --git a/test/core/channel/channel_args_test.c b/test/core/channel/channel_args_test.c
index c7fc259..c2fc050 100644
--- a/test/core/channel/channel_args_test.c
+++ b/test/core/channel/channel_args_test.c
@@ -77,7 +77,8 @@
   ch_args =
       grpc_channel_args_set_compression_algorithm(NULL, GRPC_COMPRESS_GZIP);
   GPR_ASSERT(ch_args->num_args == 1);
-  GPR_ASSERT(strcmp(ch_args->args[0].key, GRPC_COMPRESSION_ALGORITHM_ARG) == 0);
+  GPR_ASSERT(strcmp(ch_args->args[0].key,
+                    GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM) == 0);
   GPR_ASSERT(ch_args->args[0].type == GRPC_ARG_INTEGER);
 
   grpc_channel_args_destroy(ch_args);
diff --git a/test/core/client_config/lb_policies_test.c b/test/core/client_config/lb_policies_test.c
index e766672..2ec4612 100644
--- a/test/core/client_config/lb_policies_test.c
+++ b/test/core/client_config/lb_policies_test.c
@@ -438,9 +438,9 @@
   return calls;
 }
 
-static void assert_channel_connectivity(
-    grpc_channel *ch, size_t num_accepted_conn_states,
-    grpc_connectivity_state accepted_conn_state, ...) {
+static void assert_channel_connectivity(grpc_channel *ch,
+                                        size_t num_accepted_conn_states,
+                                        int accepted_conn_state, ...) {
   size_t i;
   grpc_channel_stack *client_stack;
   grpc_channel_element *client_channel_filter;
@@ -456,7 +456,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
   va_start(ap, accepted_conn_state);
   for (i = 0; i < num_accepted_conn_states; i++) {
-    if (actual_conn_state == accepted_conn_state) {
+    if ((int)actual_conn_state == accepted_conn_state) {
       break;
     }
     accepted_conn_state = va_arg(ap, grpc_connectivity_state);
diff --git a/test/core/client_config/set_initial_connect_string_test.c b/test/core/client_config/set_initial_connect_string_test.c
index 83058d9..c1b8452 100644
--- a/test/core/client_config/set_initial_connect_string_test.c
+++ b/test/core/client_config/set_initial_connect_string_test.c
@@ -37,6 +37,7 @@
 #include <grpc/support/host_port.h>
 #include <grpc/support/log.h>
 #include <grpc/support/slice.h>
+#include <grpc/support/thd.h>
 
 #include "src/core/ext/client_config/initial_connect_string.h"
 #include "src/core/lib/iomgr/sockaddr.h"
@@ -56,7 +57,7 @@
   gpr_slice_buffer incoming_buffer;
   gpr_slice_buffer temp_incoming_buffer;
   grpc_endpoint *tcp;
-  int done;
+  gpr_atm done_atm;
 };
 
 static const char *magic_connect_string = "magic initial string";
@@ -69,7 +70,7 @@
   gpr_slice_buffer_move_into(&state.temp_incoming_buffer,
                              &state.incoming_buffer);
   if (state.incoming_buffer.length > strlen(magic_connect_string)) {
-    state.done = 1;
+    gpr_atm_rel_store(&state.done_atm, 1);
     grpc_endpoint_shutdown(exec_ctx, state.tcp);
     grpc_endpoint_destroy(exec_ctx, state.tcp);
   } else {
@@ -116,7 +117,7 @@
 }
 
 static void start_rpc(int use_creds, int target_port) {
-  state.done = 0;
+  gpr_atm_rel_store(&state.done_atm, 0);
   state.cq = grpc_completion_queue_create(NULL);
   if (use_creds) {
     state.creds = grpc_fake_transport_security_credentials_create();
@@ -139,7 +140,7 @@
   state.op.reserved = NULL;
   GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(state.call, &state.op,
                                                    (size_t)(1), NULL, NULL));
-  grpc_completion_queue_next(state.cq, n_sec_deadline(1), NULL);
+  grpc_completion_queue_next(state.cq, n_sec_deadline(5), NULL);
 }
 
 static void cleanup_rpc(void) {
@@ -157,12 +158,29 @@
   gpr_free(state.target);
 }
 
-static void poll_server_until_read_done(test_tcp_server *server) {
-  gpr_timespec deadline = n_sec_deadline(5);
-  while (state.done == 0 &&
+typedef struct {
+  test_tcp_server *server;
+  gpr_event *signal_when_done;
+} poll_args;
+
+static void actually_poll_server(void *arg) {
+  poll_args *pa = arg;
+  gpr_timespec deadline = n_sec_deadline(10);
+  while (gpr_atm_acq_load(&state.done_atm) == 0 &&
          gpr_time_cmp(gpr_now(GPR_CLOCK_REALTIME), deadline) < 0) {
-    test_tcp_server_poll(server, 1);
+    test_tcp_server_poll(pa->server, 1);
   }
+  gpr_event_set(pa->signal_when_done, (void *)1);
+  gpr_free(pa);
+}
+
+static void poll_server_until_read_done(test_tcp_server *server,
+                                        gpr_event *signal_when_done) {
+  gpr_thd_id id;
+  poll_args *pa = gpr_malloc(sizeof(*pa));
+  pa->server = server;
+  pa->signal_when_done = signal_when_done;
+  gpr_thd_new(&id, actually_poll_server, pa, NULL);
 }
 
 static void match_initial_magic_string(gpr_slice_buffer *buffer) {
@@ -180,20 +198,26 @@
 }
 
 static void test_initial_string(test_tcp_server *server, int secure) {
+  gpr_event ev;
+  gpr_event_init(&ev);
   grpc_test_set_initial_connect_string_function(set_magic_initial_string);
+  poll_server_until_read_done(server, &ev);
   start_rpc(secure, server_port);
-  poll_server_until_read_done(server);
+  gpr_event_wait(&ev, gpr_inf_future(GPR_CLOCK_REALTIME));
   match_initial_magic_string(&state.incoming_buffer);
   cleanup_rpc();
 }
 
 static void test_initial_string_with_redirect(test_tcp_server *server,
                                               int secure) {
+  gpr_event ev;
+  gpr_event_init(&ev);
   int another_port = grpc_pick_unused_port_or_die();
   grpc_test_set_initial_connect_string_function(
       reset_addr_and_set_magic_string);
+  poll_server_until_read_done(server, &ev);
   start_rpc(secure, another_port);
-  poll_server_until_read_done(server);
+  gpr_event_wait(&ev, gpr_inf_future(GPR_CLOCK_REALTIME));
   match_initial_magic_string(&state.incoming_buffer);
   cleanup_rpc();
 }
diff --git a/test/core/end2end/fixtures/h2_census.c b/test/core/end2end/fixtures/h2_census.c
index ff2f028..e46b39e 100644
--- a/test/core/end2end/fixtures/h2_census.c
+++ b/test/core/end2end/fixtures/h2_census.c
@@ -111,7 +111,7 @@
 
 /* All test configurations */
 static grpc_end2end_test_config configs[] = {
-    {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION,
+    {"chttp2/fullstack+census", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION,
      chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
      chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
 };
diff --git a/test/core/end2end/fixtures/h2_proxy.c b/test/core/end2end/fixtures/h2_proxy.c
index 863673a..8c50eeb 100644
--- a/test/core/end2end/fixtures/h2_proxy.c
+++ b/test/core/end2end/fixtures/h2_proxy.c
@@ -55,14 +55,16 @@
   grpc_end2end_proxy *proxy;
 } fullstack_fixture_data;
 
-static grpc_server *create_proxy_server(const char *port) {
-  grpc_server *s = grpc_server_create(NULL, NULL);
+static grpc_server *create_proxy_server(const char *port,
+                                        grpc_channel_args *server_args) {
+  grpc_server *s = grpc_server_create(server_args, NULL);
   GPR_ASSERT(grpc_server_add_insecure_http2_port(s, port));
   return s;
 }
 
-static grpc_channel *create_proxy_client(const char *target) {
-  return grpc_insecure_channel_create(target, NULL, NULL);
+static grpc_channel *create_proxy_client(const char *target,
+                                         grpc_channel_args *client_args) {
+  return grpc_insecure_channel_create(target, client_args, NULL);
 }
 
 static const grpc_end2end_proxy_def proxy_def = {create_proxy_server,
@@ -74,7 +76,7 @@
   fullstack_fixture_data *ffd = gpr_malloc(sizeof(fullstack_fixture_data));
   memset(&f, 0, sizeof(f));
 
-  ffd->proxy = grpc_end2end_proxy_create(&proxy_def);
+  ffd->proxy = grpc_end2end_proxy_create(&proxy_def, client_args, server_args);
 
   f.fixture_data = ffd;
   f.cq = grpc_completion_queue_create(NULL);
diff --git a/test/core/end2end/fixtures/h2_ssl_cert.c b/test/core/end2end/fixtures/h2_ssl_cert.c
index cd031ca..f4dea2c 100644
--- a/test/core/end2end/fixtures/h2_ssl_cert.c
+++ b/test/core/end2end/fixtures/h2_ssl_cert.c
@@ -143,11 +143,11 @@
     chttp2_init_server_secure_fullstack(f, server_args, ssl_creds);         \
   }
 
-SERVER_INIT(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE);
-SERVER_INIT(GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_BUT_DONT_VERIFY);
-SERVER_INIT(GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY);
-SERVER_INIT(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_BUT_DONT_VERIFY);
-SERVER_INIT(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
+SERVER_INIT(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE)
+SERVER_INIT(GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_BUT_DONT_VERIFY)
+SERVER_INIT(GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY)
+SERVER_INIT(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_BUT_DONT_VERIFY)
+SERVER_INIT(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY)
 
 #define CLIENT_INIT_NAME(cert_type) \
   chttp2_init_client_simple_ssl_secure_fullstack_##cert_type
@@ -189,10 +189,10 @@
     grpc_channel_args_destroy(new_client_args);                              \
   }
 
-CLIENT_INIT(NONE);
-CLIENT_INIT(SELF_SIGNED);
-CLIENT_INIT(SIGNED);
-CLIENT_INIT(BAD_CERT_PAIR);
+CLIENT_INIT(NONE)
+CLIENT_INIT(SELF_SIGNED)
+CLIENT_INIT(SIGNED)
+CLIENT_INIT(BAD_CERT_PAIR)
 
 #define TEST_NAME(enum_name, cert_type, result) \
   "chttp2/ssl_" #enum_name "_" #cert_type "_" #result "_"
diff --git a/test/core/end2end/fixtures/h2_ssl_proxy.c b/test/core/end2end/fixtures/h2_ssl_proxy.c
index 1403b76..151a86c 100644
--- a/test/core/end2end/fixtures/h2_ssl_proxy.c
+++ b/test/core/end2end/fixtures/h2_ssl_proxy.c
@@ -54,8 +54,9 @@
   grpc_end2end_proxy *proxy;
 } fullstack_secure_fixture_data;
 
-static grpc_server *create_proxy_server(const char *port) {
-  grpc_server *s = grpc_server_create(NULL, NULL);
+static grpc_server *create_proxy_server(const char *port,
+                                        grpc_channel_args *server_args) {
+  grpc_server *s = grpc_server_create(server_args, NULL);
   grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key,
                                                   test_server1_cert};
   grpc_server_credentials *ssl_creds =
@@ -65,18 +66,20 @@
   return s;
 }
 
-static grpc_channel *create_proxy_client(const char *target) {
+static grpc_channel *create_proxy_client(const char *target,
+                                         grpc_channel_args *client_args) {
   grpc_channel *channel;
   grpc_channel_credentials *ssl_creds =
       grpc_ssl_credentials_create(NULL, NULL, NULL);
   grpc_arg ssl_name_override = {GRPC_ARG_STRING,
                                 GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
                                 {"foo.test.google.fr"}};
-  grpc_channel_args client_args;
-  client_args.num_args = 1;
-  client_args.args = &ssl_name_override;
-  channel = grpc_secure_channel_create(ssl_creds, target, &client_args, NULL);
+  grpc_channel_args *new_client_args =
+      grpc_channel_args_copy_and_add(client_args, &ssl_name_override, 1);
+  channel =
+      grpc_secure_channel_create(ssl_creds, target, new_client_args, NULL);
   grpc_channel_credentials_release(ssl_creds);
+  grpc_channel_args_destroy(new_client_args);
   return channel;
 }
 
@@ -90,7 +93,7 @@
       gpr_malloc(sizeof(fullstack_secure_fixture_data));
   memset(&f, 0, sizeof(f));
 
-  ffd->proxy = grpc_end2end_proxy_create(&proxy_def);
+  ffd->proxy = grpc_end2end_proxy_create(&proxy_def, client_args, server_args);
 
   f.fixture_data = ffd;
   f.cq = grpc_completion_queue_create(NULL);
diff --git a/test/core/end2end/fixtures/proxy.c b/test/core/end2end/fixtures/proxy.c
index a6487a1..f6e01ec 100644
--- a/test/core/end2end/fixtures/proxy.c
+++ b/test/core/end2end/fixtures/proxy.c
@@ -89,8 +89,9 @@
 static void thread_main(void *arg);
 static void request_call(grpc_end2end_proxy *proxy);
 
-grpc_end2end_proxy *grpc_end2end_proxy_create(
-    const grpc_end2end_proxy_def *def) {
+grpc_end2end_proxy *grpc_end2end_proxy_create(const grpc_end2end_proxy_def *def,
+                                              grpc_channel_args *client_args,
+                                              grpc_channel_args *server_args) {
   gpr_thd_options opt = gpr_thd_options_default();
   int proxy_port = grpc_pick_unused_port_or_die();
   int server_port = grpc_pick_unused_port_or_die();
@@ -105,8 +106,8 @@
           proxy->server_port);
 
   proxy->cq = grpc_completion_queue_create(NULL);
-  proxy->server = def->create_server(proxy->proxy_port);
-  proxy->client = def->create_client(proxy->server_port);
+  proxy->server = def->create_server(proxy->proxy_port, server_args);
+  proxy->client = def->create_client(proxy->server_port, client_args);
 
   grpc_server_register_completion_queue(proxy->server, proxy->cq, NULL);
   grpc_server_start(proxy->server);
diff --git a/test/core/end2end/fixtures/proxy.h b/test/core/end2end/fixtures/proxy.h
index c1cf01d..75b75d1 100644
--- a/test/core/end2end/fixtures/proxy.h
+++ b/test/core/end2end/fixtures/proxy.h
@@ -41,12 +41,15 @@
 typedef struct grpc_end2end_proxy grpc_end2end_proxy;
 
 typedef struct grpc_end2end_proxy_def {
-  grpc_server *(*create_server)(const char *port);
-  grpc_channel *(*create_client)(const char *target);
+  grpc_server *(*create_server)(const char *port,
+                                grpc_channel_args *server_args);
+  grpc_channel *(*create_client)(const char *target,
+                                 grpc_channel_args *client_args);
 } grpc_end2end_proxy_def;
 
-grpc_end2end_proxy *grpc_end2end_proxy_create(
-    const grpc_end2end_proxy_def *def);
+grpc_end2end_proxy *grpc_end2end_proxy_create(const grpc_end2end_proxy_def *def,
+                                              grpc_channel_args *client_args,
+                                              grpc_channel_args *server_args);
 void grpc_end2end_proxy_destroy(grpc_end2end_proxy *proxy);
 
 const char *grpc_end2end_proxy_get_client_target(grpc_end2end_proxy *proxy);
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/03a72675e1969f836094f1ecfec2a7b34418e306 b/test/core/end2end/fuzzers/server_fuzzer_corpus/03a72675e1969f836094f1ecfec2a7b34418e306
new file mode 100644
index 0000000..503af15
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/03a72675e1969f836094f1ecfec2a7b34418e306
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/0416afd6875d9ba55f1e5f86a6456a5445d5e576 b/test/core/end2end/fuzzers/server_fuzzer_corpus/0416afd6875d9ba55f1e5f86a6456a5445d5e576
new file mode 100644
index 0000000..30229f9
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/0416afd6875d9ba55f1e5f86a6456a5445d5e576
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/08c42ef29eff83052c5887855f2fa3e07ebe470c b/test/core/end2end/fuzzers/server_fuzzer_corpus/08c42ef29eff83052c5887855f2fa3e07ebe470c
new file mode 100644
index 0000000..828275e
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/08c42ef29eff83052c5887855f2fa3e07ebe470c
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/1ba889ea1543297824e99e641e6ca8b91f45732e b/test/core/end2end/fuzzers/server_fuzzer_corpus/1ba889ea1543297824e99e641e6ca8b91f45732e
new file mode 100644
index 0000000..6ed060d
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/1ba889ea1543297824e99e641e6ca8b91f45732e
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/3b09bf453c6f93983c24c4d5481e55d66213f93a b/test/core/end2end/fuzzers/server_fuzzer_corpus/3b09bf453c6f93983c24c4d5481e55d66213f93a
new file mode 100644
index 0000000..1a7a213
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/3b09bf453c6f93983c24c4d5481e55d66213f93a
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/49cb33cbb60f041e8e99dd718993acd2c3354416 b/test/core/end2end/fuzzers/server_fuzzer_corpus/49cb33cbb60f041e8e99dd718993acd2c3354416
new file mode 100644
index 0000000..7f97525
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/49cb33cbb60f041e8e99dd718993acd2c3354416
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/59743fe120be6ae1aed1c02230ee1bb460f621ee b/test/core/end2end/fuzzers/server_fuzzer_corpus/59743fe120be6ae1aed1c02230ee1bb460f621ee
new file mode 100644
index 0000000..3038fde
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/59743fe120be6ae1aed1c02230ee1bb460f621ee
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/a5ccb8f124d8ddb5350b90bc0d6b96db280cb7c9 b/test/core/end2end/fuzzers/server_fuzzer_corpus/a5ccb8f124d8ddb5350b90bc0d6b96db280cb7c9
new file mode 100644
index 0000000..9d39854
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/a5ccb8f124d8ddb5350b90bc0d6b96db280cb7c9
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/a7fac1265a384fe9e45a9ee3d708b79c4e80505e b/test/core/end2end/fuzzers/server_fuzzer_corpus/a7fac1265a384fe9e45a9ee3d708b79c4e80505e
new file mode 100644
index 0000000..338f61b
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/a7fac1265a384fe9e45a9ee3d708b79c4e80505e
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/aaf049720c707d4e14e47e7eb31d6a2dda60e66a b/test/core/end2end/fuzzers/server_fuzzer_corpus/aaf049720c707d4e14e47e7eb31d6a2dda60e66a
new file mode 100644
index 0000000..dab9c75
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/aaf049720c707d4e14e47e7eb31d6a2dda60e66a
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/c4e4c7572e005e18d56eac407033da058737a5ab b/test/core/end2end/fuzzers/server_fuzzer_corpus/c4e4c7572e005e18d56eac407033da058737a5ab
new file mode 100644
index 0000000..070a581
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/c4e4c7572e005e18d56eac407033da058737a5ab
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/crash-dae0f07934a527989f23f06e630710ff6ca8c809 b/test/core/end2end/fuzzers/server_fuzzer_corpus/crash-dae0f07934a527989f23f06e630710ff6ca8c809
new file mode 100644
index 0000000..b6dfd77
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/crash-dae0f07934a527989f23f06e630710ff6ca8c809
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/e96ad9c17795e52edc810a08d4fc61fe8790002a b/test/core/end2end/fuzzers/server_fuzzer_corpus/e96ad9c17795e52edc810a08d4fc61fe8790002a
new file mode 100644
index 0000000..df9241d
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/e96ad9c17795e52edc810a08d4fc61fe8790002a
Binary files differ
diff --git a/test/core/end2end/fuzzers/server_fuzzer_corpus/fa202a5f51cd49f8ea5af60c5f403f797c01c504 b/test/core/end2end/fuzzers/server_fuzzer_corpus/fa202a5f51cd49f8ea5af60c5f403f797c01c504
new file mode 100644
index 0000000..0ba5935
--- /dev/null
+++ b/test/core/end2end/fuzzers/server_fuzzer_corpus/fa202a5f51cd49f8ea5af60c5f403f797c01c504
Binary files differ
diff --git a/test/core/end2end/gen_build_yaml.py b/test/core/end2end/gen_build_yaml.py
index cffe599..3e10ad5 100755
--- a/test/core/end2end/gen_build_yaml.py
+++ b/test/core/end2end/gen_build_yaml.py
@@ -39,9 +39,9 @@
 
 FixtureOptions = collections.namedtuple(
     'FixtureOptions',
-    'fullstack includes_proxy dns_resolver secure platforms ci_mac tracing')
+    'fullstack includes_proxy dns_resolver secure platforms ci_mac tracing exclude_configs')
 default_unsecure_fixture_options = FixtureOptions(
-    True, False, True, False, ['windows', 'linux', 'mac', 'posix'], True, False)
+    True, False, True, False, ['windows', 'linux', 'mac', 'posix'], True, False, [])
 socketpair_unsecure_fixture_options = default_unsecure_fixture_options._replace(fullstack=False, dns_resolver=False)
 default_secure_fixture_options = default_unsecure_fixture_options._replace(secure=True)
 uds_fixture_options = default_unsecure_fixture_options._replace(dns_resolver=False, platforms=['linux', 'mac', 'posix'])
@@ -60,7 +60,7 @@
     'h2_proxy': default_unsecure_fixture_options._replace(includes_proxy=True,
                                                           ci_mac=False),
     'h2_sockpair_1byte': socketpair_unsecure_fixture_options._replace(
-        ci_mac=False),
+        ci_mac=False, exclude_configs=['msan']),
     'h2_sockpair': socketpair_unsecure_fixture_options._replace(ci_mac=False),
     'h2_sockpair+trace': socketpair_unsecure_fixture_options._replace(
         ci_mac=False, tracing=True),
@@ -246,7 +246,7 @@
           {
               'name': '%s_nosec_test' % f,
               'args': [t],
-              'exclude_configs': [],
+              'exclude_configs': END2END_FIXTURES[f].exclude_configs,
               'platforms': END2END_FIXTURES[f].platforms,
               'ci_platforms': (END2END_FIXTURES[f].platforms
                                if END2END_FIXTURES[f].ci_mac else without(
diff --git a/test/core/end2end/tests/large_metadata.c b/test/core/end2end/tests/large_metadata.c
index 0e5d6b4..ae1f68a 100644
--- a/test/core/end2end/tests/large_metadata.c
+++ b/test/core/end2end/tests/large_metadata.c
@@ -97,7 +97,7 @@
   grpc_completion_queue_destroy(f->cq);
 }
 
-/* Request with a large amount of metadata.*/
+// Request with a large amount of metadata.
 static void test_request_with_large_metadata(grpc_end2end_test_config config) {
   grpc_call *c;
   grpc_call *s;
@@ -106,8 +106,13 @@
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   gpr_timespec deadline = five_seconds_time();
   grpc_metadata meta;
+  const size_t large_size = 64 * 1024;
+  grpc_arg arg = {GRPC_ARG_INTEGER,
+                  GRPC_ARG_MAX_METADATA_SIZE,
+                  {.integer = (int)large_size + 1024}};
+  grpc_channel_args args = {1, &arg};
   grpc_end2end_test_fixture f =
-      begin_test(config, "test_request_with_large_metadata", NULL, NULL);
+      begin_test(config, "test_request_with_large_metadata", &args, &args);
   cq_verifier *cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
   grpc_op *op;
@@ -121,7 +126,6 @@
   char *details = NULL;
   size_t details_capacity = 0;
   int was_cancelled = 2;
-  const size_t large_size = 64 * 1024;
 
   c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
                                "/foo", "foo.test.google.fr", deadline, NULL);
@@ -138,6 +142,7 @@
   grpc_metadata_array_init(&request_metadata_recv);
   grpc_call_details_init(&call_details);
 
+  // Client: send request.
   op = ops;
   op->op = GRPC_OP_SEND_INITIAL_METADATA;
   op->data.send_initial_metadata.count = 1;
@@ -174,9 +179,11 @@
       grpc_server_request_call(f.server, &s, &call_details,
                                &request_metadata_recv, f.cq, f.cq, tag(101));
   GPR_ASSERT(GRPC_CALL_OK == error);
+
   cq_expect_completion(cqv, tag(101), 1);
   cq_verify(cqv);
 
+  // Server: send initial metadata and receive request.
   op = ops;
   op->op = GRPC_OP_SEND_INITIAL_METADATA;
   op->data.send_initial_metadata.count = 0;
@@ -194,6 +201,8 @@
   cq_expect_completion(cqv, tag(102), 1);
   cq_verify(cqv);
 
+  // Server: receive close and send status.  This should trigger
+  // completion of request on client.
   op = ops;
   op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
   op->data.recv_close_on_server.cancelled = &was_cancelled;
diff --git a/test/core/end2end/tests/max_message_length.c b/test/core/end2end/tests/max_message_length.c
index b5dbc13..4f57278 100644
--- a/test/core/end2end/tests/max_message_length.c
+++ b/test/core/end2end/tests/max_message_length.c
@@ -53,7 +53,10 @@
                                             grpc_channel_args *server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
-  f = config.create_fixture(client_args, server_args);
+  // We intentionally do not pass the client and server args to
+  // create_fixture(), since we don't want the limit enforced on the
+  // proxy, only on the backend server.
+  f = config.create_fixture(NULL, NULL);
   config.init_server(&f, server_args);
   config.init_client(&f, client_args);
   return f;
diff --git a/test/core/iomgr/udp_server_test.c b/test/core/iomgr/udp_server_test.c
index 5248b61..1e7e4fa 100644
--- a/test/core/iomgr/udp_server_test.c
+++ b/test/core/iomgr/udp_server_test.c
@@ -32,20 +32,22 @@
  */
 
 #include "src/core/lib/iomgr/udp_server.h"
-#include <grpc/grpc.h>
-#include <grpc/support/alloc.h>
-#include <grpc/support/log.h>
-#include <grpc/support/sync.h>
-#include <grpc/support/time.h>
-#include "src/core/lib/iomgr/ev_posix.h"
-#include "src/core/lib/iomgr/iomgr.h"
-#include "test/core/util/test_config.h"
 
 #include <netinet/in.h>
 #include <string.h>
 #include <sys/socket.h>
 #include <unistd.h>
 
+#include <grpc/grpc.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/sync.h>
+#include <grpc/support/time.h>
+
+#include "src/core/lib/iomgr/ev_posix.h"
+#include "src/core/lib/iomgr/iomgr.h"
+#include "test/core/util/test_config.h"
+
 #ifdef GRPC_NEED_UDP
 
 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", #x)
@@ -54,6 +56,7 @@
 static gpr_mu *g_mu;
 static int g_number_of_reads = 0;
 static int g_number_of_bytes_read = 0;
+static int g_number_of_orphan_calls = 0;
 
 static void on_read(grpc_exec_ctx *exec_ctx, grpc_fd *emfd,
                     grpc_server *server) {
@@ -71,6 +74,12 @@
   gpr_mu_unlock(g_mu);
 }
 
+static void on_fd_orphaned(grpc_fd *emfd) {
+  gpr_log(GPR_INFO, "gRPC FD about to be orphaned: %d",
+          grpc_fd_wrapped_fd(emfd));
+  g_number_of_orphan_calls++;
+}
+
 static void test_no_op(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_udp_server *s = grpc_udp_server_create();
@@ -88,6 +97,7 @@
 }
 
 static void test_no_op_with_port(void) {
+  g_number_of_orphan_calls = 0;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   struct sockaddr_in addr;
   grpc_udp_server *s = grpc_udp_server_create();
@@ -96,13 +106,17 @@
   memset(&addr, 0, sizeof(addr));
   addr.sin_family = AF_INET;
   GPR_ASSERT(grpc_udp_server_add_port(s, (struct sockaddr *)&addr, sizeof(addr),
-                                      on_read));
+                                      on_read, on_fd_orphaned));
 
   grpc_udp_server_destroy(&exec_ctx, s, NULL);
   grpc_exec_ctx_finish(&exec_ctx);
+
+  /* The server had a single FD, which should be orphaned. */
+  GPR_ASSERT(g_number_of_orphan_calls == 1);
 }
 
 static void test_no_op_with_port_and_start(void) {
+  g_number_of_orphan_calls = 0;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   struct sockaddr_in addr;
   grpc_udp_server *s = grpc_udp_server_create();
@@ -111,12 +125,15 @@
   memset(&addr, 0, sizeof(addr));
   addr.sin_family = AF_INET;
   GPR_ASSERT(grpc_udp_server_add_port(s, (struct sockaddr *)&addr, sizeof(addr),
-                                      on_read));
+                                      on_read, on_fd_orphaned));
 
   grpc_udp_server_start(&exec_ctx, s, NULL, 0, NULL);
 
   grpc_udp_server_destroy(&exec_ctx, s, NULL);
   grpc_exec_ctx_finish(&exec_ctx);
+
+  /* The server had a single FD which should be orphaned. */
+  GPR_ASSERT(g_number_of_orphan_calls == 1);
 }
 
 static void test_receive(int number_of_clients) {
@@ -133,11 +150,12 @@
   gpr_log(GPR_INFO, "clients=%d", number_of_clients);
 
   g_number_of_bytes_read = 0;
+  g_number_of_orphan_calls = 0;
 
   memset(&addr, 0, sizeof(addr));
   addr.ss_family = AF_INET;
-  GPR_ASSERT(
-      grpc_udp_server_add_port(s, (struct sockaddr *)&addr, addr_len, on_read));
+  GPR_ASSERT(grpc_udp_server_add_port(s, (struct sockaddr *)&addr, addr_len,
+                                      on_read, on_fd_orphaned));
 
   svrfd = grpc_udp_server_get_fd(s, 0);
   GPR_ASSERT(svrfd >= 0);
@@ -176,6 +194,8 @@
 
   grpc_udp_server_destroy(&exec_ctx, s, NULL);
   grpc_exec_ctx_finish(&exec_ctx);
+
+  GPR_ASSERT(g_number_of_orphan_calls == 5);
 }
 
 static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p, bool success) {
diff --git a/test/core/iomgr/workqueue_test.c b/test/core/iomgr/workqueue_test.c
index 874e696..953cc35 100644
--- a/test/core/iomgr/workqueue_test.c
+++ b/test/core/iomgr/workqueue_test.c
@@ -73,8 +73,10 @@
 
   gpr_mu_lock(g_mu);
   GPR_ASSERT(!done);
-  grpc_pollset_work(&exec_ctx, g_pollset, &worker, gpr_now(deadline.clock_type),
-                    deadline);
+  while (!done) {
+    grpc_pollset_work(&exec_ctx, g_pollset, &worker,
+                      gpr_now(deadline.clock_type), deadline);
+  }
   gpr_mu_unlock(g_mu);
   grpc_exec_ctx_finish(&exec_ctx);
   GPR_ASSERT(done);
@@ -97,9 +99,10 @@
   grpc_workqueue_add_to_pollset(&exec_ctx, wq, g_pollset);
 
   gpr_mu_lock(g_mu);
-  GPR_ASSERT(!done);
-  grpc_pollset_work(&exec_ctx, g_pollset, &worker, gpr_now(deadline.clock_type),
-                    deadline);
+  while (!done) {
+    grpc_pollset_work(&exec_ctx, g_pollset, &worker,
+                      gpr_now(deadline.clock_type), deadline);
+  }
   gpr_mu_unlock(g_mu);
   grpc_exec_ctx_finish(&exec_ctx);
   GPR_ASSERT(done);
diff --git a/test/core/surface/public_headers_must_be_c89.c b/test/core/surface/public_headers_must_be_c89.c
index 0eede6c..fd6ff2c 100644
--- a/test/core/surface/public_headers_must_be_c89.c
+++ b/test/core/surface/public_headers_must_be_c89.c
@@ -36,11 +36,13 @@
 #include <grpc/census.h>
 #include <grpc/compression.h>
 #include <grpc/grpc.h>
+#include <grpc/grpc_cronet.h>
 #include <grpc/grpc_security.h>
 #include <grpc/grpc_security_constants.h>
 #include <grpc/impl/codegen/alloc.h>
 #include <grpc/impl/codegen/atm.h>
 #include <grpc/impl/codegen/byte_buffer.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/grpc_types.h>
diff --git a/test/cpp/end2end/async_end2end_test.cc b/test/cpp/end2end/async_end2end_test.cc
index 7e4d604..e0649bd 100644
--- a/test/cpp/end2end/async_end2end_test.cc
+++ b/test/cpp/end2end/async_end2end_test.cc
@@ -51,6 +51,7 @@
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/util/string_ref_helper.h"
+#include "test/cpp/util/test_credentials_provider.h"
 
 #ifdef GPR_POSIX_SOCKET
 #include "src/core/lib/iomgr/ev_posix.h"
@@ -58,6 +59,7 @@
 
 using grpc::testing::EchoRequest;
 using grpc::testing::EchoResponse;
+using grpc::testing::kTlsCredentialsType;
 using std::chrono::system_clock;
 
 GPR_TLS_DECL(g_is_async_end2end_test);
@@ -197,22 +199,67 @@
   bool spin_;
 };
 
-class AsyncEnd2endTest : public ::testing::TestWithParam<bool> {
+// This class disables the server builder plugins that may add sync services to
+// the server. If there are sync services, UnimplementedRpc test will triger
+// the sync unkown rpc routine on the server side, rather than the async one
+// that needs to be tested here.
+class ServerBuilderSyncPluginDisabler : public ::grpc::ServerBuilderOption {
+ public:
+  void UpdateArguments(ChannelArguments* arg) GRPC_OVERRIDE {}
+
+  void UpdatePlugins(
+      std::map<grpc::string, std::unique_ptr<ServerBuilderPlugin>>* plugins)
+      GRPC_OVERRIDE {
+    auto plugin = plugins->begin();
+    while (plugin != plugins->end()) {
+      if ((*plugin).second->has_sync_methods()) {
+        plugins->erase(plugin++);
+      } else {
+        plugin++;
+      }
+    }
+  }
+};
+
+class TestScenario {
+ public:
+  TestScenario(bool non_block, const grpc::string& creds_type,
+               const grpc::string& content)
+      : disable_blocking(non_block),
+        credentials_type(creds_type),
+        message_content(content) {}
+  void Log() const {
+    gpr_log(GPR_INFO,
+            "Scenario: disable_blocking %d, credentials %s, message size %d",
+            disable_blocking, credentials_type.c_str(), message_content.size());
+  }
+  bool disable_blocking;
+  const grpc::string credentials_type;
+  const grpc::string message_content;
+};
+
+class AsyncEnd2endTest : public ::testing::TestWithParam<TestScenario> {
  protected:
-  AsyncEnd2endTest() {}
+  AsyncEnd2endTest() { GetParam().Log(); }
 
   void SetUp() GRPC_OVERRIDE {
-    poll_overrider_.reset(new PollingOverrider(!GetParam()));
+    poll_overrider_.reset(new PollingOverrider(!GetParam().disable_blocking));
 
     int port = grpc_pick_unused_port_or_die();
     server_address_ << "localhost:" << port;
 
     // Setup server
     ServerBuilder builder;
-    builder.AddListeningPort(server_address_.str(),
-                             grpc::InsecureServerCredentials());
+    auto server_creds = GetServerCredentials(GetParam().credentials_type);
+    builder.AddListeningPort(server_address_.str(), server_creds);
     builder.RegisterService(&service_);
     cq_ = builder.AddCompletionQueue();
+
+    // TODO(zyc): make a test option to choose wheather sync plugins should be
+    // deleted
+    std::unique_ptr<ServerBuilderOption> sync_plugin_disabler(
+        new ServerBuilderSyncPluginDisabler());
+    builder.SetOption(move(sync_plugin_disabler));
     server_ = builder.BuildAndStart();
 
     gpr_tls_set(&g_is_async_end2end_test, 1);
@@ -230,8 +277,11 @@
   }
 
   void ResetStub() {
+    ChannelArguments args;
+    auto channel_creds =
+        GetChannelCredentials(GetParam().credentials_type, &args);
     std::shared_ptr<Channel> channel =
-        CreateChannel(server_address_.str(), InsecureChannelCredentials());
+        CreateCustomChannel(server_address_.str(), channel_creds, args);
     stub_ = grpc::testing::EchoTestService::NewStub(channel);
   }
 
@@ -247,22 +297,23 @@
       ServerContext srv_ctx;
       grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
 
-      send_request.set_message("Hello");
+      send_request.set_message(GetParam().message_content);
       std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
           stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
 
       service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
                            cq_.get(), tag(2));
 
-      Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
+      Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
       EXPECT_EQ(send_request.message(), recv_request.message());
 
       send_response.set_message(recv_request.message());
       response_writer.Finish(send_response, Status::OK, tag(3));
-      Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
-
       response_reader->Finish(&recv_response, &recv_status, tag(4));
-      Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
+      Verifier(GetParam().disable_blocking)
+          .Expect(3, true)
+          .Expect(4, true)
+          .Verify(cq_.get());
 
       EXPECT_EQ(send_response.message(), recv_response.message());
       EXPECT_TRUE(recv_status.ok());
@@ -302,7 +353,7 @@
   ServerContext srv_ctx;
   grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
 
-  send_request.set_message("Hello");
+  send_request.set_message(GetParam().message_content);
   std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
       stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
 
@@ -310,23 +361,22 @@
       std::chrono::system_clock::now());
   std::chrono::system_clock::time_point time_limit(
       std::chrono::system_clock::now() + std::chrono::seconds(10));
-  Verifier(GetParam()).Verify(cq_.get(), time_now);
-  Verifier(GetParam()).Verify(cq_.get(), time_now);
+  Verifier(GetParam().disable_blocking).Verify(cq_.get(), time_now);
+  Verifier(GetParam().disable_blocking).Verify(cq_.get(), time_now);
 
   service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
                        cq_.get(), tag(2));
 
-  Verifier(GetParam()).Expect(2, true).Verify(cq_.get(), time_limit);
+  Verifier(GetParam().disable_blocking)
+      .Expect(2, true)
+      .Verify(cq_.get(), time_limit);
   EXPECT_EQ(send_request.message(), recv_request.message());
 
   send_response.set_message(recv_request.message());
   response_writer.Finish(send_response, Status::OK, tag(3));
-  Verifier(GetParam())
-      .Expect(3, true)
-      .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
-
   response_reader->Finish(&recv_response, &recv_status, tag(4));
-  Verifier(GetParam())
+  Verifier(GetParam().disable_blocking)
+      .Expect(3, true)
       .Expect(4, true)
       .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
 
@@ -347,41 +397,48 @@
   ServerContext srv_ctx;
   ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
 
-  send_request.set_message("Hello");
+  send_request.set_message(GetParam().message_content);
   std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
       stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
 
   service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
                                 tag(2));
 
-  Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(2, true)
+      .Expect(1, true)
+      .Verify(cq_.get());
 
   cli_stream->Write(send_request, tag(3));
-  Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
-
   srv_stream.Read(&recv_request, tag(4));
-  Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(3, true)
+      .Expect(4, true)
+      .Verify(cq_.get());
   EXPECT_EQ(send_request.message(), recv_request.message());
 
   cli_stream->Write(send_request, tag(5));
-  Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
-
   srv_stream.Read(&recv_request, tag(6));
-  Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(5, true)
+      .Expect(6, true)
+      .Verify(cq_.get());
 
   EXPECT_EQ(send_request.message(), recv_request.message());
   cli_stream->WritesDone(tag(7));
-  Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
-
   srv_stream.Read(&recv_request, tag(8));
-  Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(7, true)
+      .Expect(8, false)
+      .Verify(cq_.get());
 
   send_response.set_message(recv_request.message());
   srv_stream.Finish(send_response, Status::OK, tag(9));
-  Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
-
   cli_stream->Finish(&recv_status, tag(10));
-  Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(9, true)
+      .Expect(10, true)
+      .Verify(cq_.get());
 
   EXPECT_EQ(send_response.message(), recv_response.message());
   EXPECT_TRUE(recv_status.ok());
@@ -400,39 +457,45 @@
   ServerContext srv_ctx;
   ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
 
-  send_request.set_message("Hello");
+  send_request.set_message(GetParam().message_content);
   std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
       stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
 
   service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
                                  cq_.get(), cq_.get(), tag(2));
 
-  Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(1, true)
+      .Expect(2, true)
+      .Verify(cq_.get());
   EXPECT_EQ(send_request.message(), recv_request.message());
 
   send_response.set_message(recv_request.message());
   srv_stream.Write(send_response, tag(3));
-  Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
-
   cli_stream->Read(&recv_response, tag(4));
-  Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(3, true)
+      .Expect(4, true)
+      .Verify(cq_.get());
   EXPECT_EQ(send_response.message(), recv_response.message());
 
   srv_stream.Write(send_response, tag(5));
-  Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
-
   cli_stream->Read(&recv_response, tag(6));
-  Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(5, true)
+      .Expect(6, true)
+      .Verify(cq_.get());
   EXPECT_EQ(send_response.message(), recv_response.message());
 
   srv_stream.Finish(Status::OK, tag(7));
-  Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
-
   cli_stream->Read(&recv_response, tag(8));
-  Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(7, true)
+      .Expect(8, false)
+      .Verify(cq_.get());
 
   cli_stream->Finish(&recv_status, tag(9));
-  Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(9, true).Verify(cq_.get());
 
   EXPECT_TRUE(recv_status.ok());
 }
@@ -450,41 +513,48 @@
   ServerContext srv_ctx;
   ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
 
-  send_request.set_message("Hello");
+  send_request.set_message(GetParam().message_content);
   std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
       cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
 
   service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
                              tag(2));
 
-  Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(1, true)
+      .Expect(2, true)
+      .Verify(cq_.get());
 
   cli_stream->Write(send_request, tag(3));
-  Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
-
   srv_stream.Read(&recv_request, tag(4));
-  Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(3, true)
+      .Expect(4, true)
+      .Verify(cq_.get());
   EXPECT_EQ(send_request.message(), recv_request.message());
 
   send_response.set_message(recv_request.message());
   srv_stream.Write(send_response, tag(5));
-  Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
-
   cli_stream->Read(&recv_response, tag(6));
-  Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(5, true)
+      .Expect(6, true)
+      .Verify(cq_.get());
   EXPECT_EQ(send_response.message(), recv_response.message());
 
   cli_stream->WritesDone(tag(7));
-  Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
-
   srv_stream.Read(&recv_request, tag(8));
-  Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(7, true)
+      .Expect(8, false)
+      .Verify(cq_.get());
 
   srv_stream.Finish(Status::OK, tag(9));
-  Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
-
   cli_stream->Finish(&recv_status, tag(10));
-  Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(9, true)
+      .Expect(10, true)
+      .Verify(cq_.get());
 
   EXPECT_TRUE(recv_status.ok());
 }
@@ -503,7 +573,7 @@
   ServerContext srv_ctx;
   grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
 
-  send_request.set_message("Hello");
+  send_request.set_message(GetParam().message_content);
   std::pair<grpc::string, grpc::string> meta1("key1", "val1");
   std::pair<grpc::string, grpc::string> meta2("key2", "val2");
   std::pair<grpc::string, grpc::string> meta3("g.r.d-bin", "xyz");
@@ -516,7 +586,7 @@
 
   service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
                        cq_.get(), tag(2));
-  Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
   EXPECT_EQ(send_request.message(), recv_request.message());
   auto client_initial_metadata = srv_ctx.client_metadata();
   EXPECT_EQ(meta1.second,
@@ -529,11 +599,11 @@
 
   send_response.set_message(recv_request.message());
   response_writer.Finish(send_response, Status::OK, tag(3));
-
-  Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
-
   response_reader->Finish(&recv_response, &recv_status, tag(4));
-  Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(3, true)
+      .Expect(4, true)
+      .Verify(cq_.get());
 
   EXPECT_EQ(send_response.message(), recv_response.message());
   EXPECT_TRUE(recv_status.ok());
@@ -552,7 +622,7 @@
   ServerContext srv_ctx;
   grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
 
-  send_request.set_message("Hello");
+  send_request.set_message(GetParam().message_content);
   std::pair<grpc::string, grpc::string> meta1("key1", "val1");
   std::pair<grpc::string, grpc::string> meta2("key2", "val2");
 
@@ -561,15 +631,15 @@
 
   service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
                        cq_.get(), tag(2));
-  Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
   EXPECT_EQ(send_request.message(), recv_request.message());
   srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
   srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
   response_writer.SendInitialMetadata(tag(3));
-  Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
 
   response_reader->ReadInitialMetadata(tag(4));
-  Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
   auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
   EXPECT_EQ(meta1.second,
             ToString(server_initial_metadata.find(meta1.first)->second));
@@ -579,10 +649,11 @@
 
   send_response.set_message(recv_request.message());
   response_writer.Finish(send_response, Status::OK, tag(5));
-  Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
-
   response_reader->Finish(&recv_response, &recv_status, tag(6));
-  Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(5, true)
+      .Expect(6, true)
+      .Verify(cq_.get());
 
   EXPECT_EQ(send_response.message(), recv_response.message());
   EXPECT_TRUE(recv_status.ok());
@@ -601,7 +672,7 @@
   ServerContext srv_ctx;
   grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
 
-  send_request.set_message("Hello");
+  send_request.set_message(GetParam().message_content);
   std::pair<grpc::string, grpc::string> meta1("key1", "val1");
   std::pair<grpc::string, grpc::string> meta2("key2", "val2");
 
@@ -610,20 +681,22 @@
 
   service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
                        cq_.get(), tag(2));
-  Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
   EXPECT_EQ(send_request.message(), recv_request.message());
   response_writer.SendInitialMetadata(tag(3));
-  Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
 
   send_response.set_message(recv_request.message());
   srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
   srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
   response_writer.Finish(send_response, Status::OK, tag(4));
-
-  Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
-
   response_reader->Finish(&recv_response, &recv_status, tag(5));
-  Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
+
+  Verifier(GetParam().disable_blocking)
+      .Expect(4, true)
+      .Expect(5, true)
+      .Verify(cq_.get());
+
   EXPECT_EQ(send_response.message(), recv_response.message());
   EXPECT_TRUE(recv_status.ok());
   auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
@@ -647,7 +720,7 @@
   ServerContext srv_ctx;
   grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
 
-  send_request.set_message("Hello");
+  send_request.set_message(GetParam().message_content);
   std::pair<grpc::string, grpc::string> meta1("key1", "val1");
   std::pair<grpc::string, grpc::string> meta2(
       "key2-bin",
@@ -671,7 +744,7 @@
 
   service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
                        cq_.get(), tag(2));
-  Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
   EXPECT_EQ(send_request.message(), recv_request.message());
   auto client_initial_metadata = srv_ctx.client_metadata();
   EXPECT_EQ(meta1.second,
@@ -683,9 +756,9 @@
   srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
   srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
   response_writer.SendInitialMetadata(tag(3));
-  Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
   response_reader->ReadInitialMetadata(tag(4));
-  Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
   auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
   EXPECT_EQ(meta3.second,
             ToString(server_initial_metadata.find(meta3.first)->second));
@@ -697,11 +770,13 @@
   srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
   srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
   response_writer.Finish(send_response, Status::OK, tag(5));
-
-  Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
-
   response_reader->Finish(&recv_response, &recv_status, tag(6));
-  Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
+
+  Verifier(GetParam().disable_blocking)
+      .Expect(5, true)
+      .Expect(6, true)
+      .Verify(cq_.get());
+
   EXPECT_EQ(send_response.message(), recv_response.message());
   EXPECT_TRUE(recv_status.ok());
   auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
@@ -726,7 +801,7 @@
   ServerContext srv_ctx;
   grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
 
-  send_request.set_message("Hello");
+  send_request.set_message(GetParam().message_content);
   std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
       stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
 
@@ -734,15 +809,15 @@
   service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
                        cq_.get(), tag(2));
 
-  Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
   EXPECT_EQ(send_request.message(), recv_request.message());
 
   cli_ctx.TryCancel();
-  Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(5, true).Verify(cq_.get());
   EXPECT_TRUE(srv_ctx.IsCancelled());
 
   response_reader->Finish(&recv_response, &recv_status, tag(4));
-  Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(4, false).Verify(cq_.get());
 
   EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
 }
@@ -761,7 +836,7 @@
   ServerContext srv_ctx;
   grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
 
-  send_request.set_message("Hello");
+  send_request.set_message(GetParam().message_content);
   std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
       stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
 
@@ -769,25 +844,29 @@
   service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
                        cq_.get(), tag(2));
 
-  Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
   EXPECT_EQ(send_request.message(), recv_request.message());
 
   send_response.set_message(recv_request.message());
   response_writer.Finish(send_response, Status::OK, tag(3));
-  Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
-  Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
-  EXPECT_FALSE(srv_ctx.IsCancelled());
-
   response_reader->Finish(&recv_response, &recv_status, tag(4));
-  Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking)
+      .Expect(3, true)
+      .Expect(4, true)
+      .Expect(5, true)
+      .Verify(cq_.get());
+  EXPECT_FALSE(srv_ctx.IsCancelled());
 
   EXPECT_EQ(send_response.message(), recv_response.message());
   EXPECT_TRUE(recv_status.ok());
 }
 
 TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
+  ChannelArguments args;
+  auto channel_creds =
+      GetChannelCredentials(GetParam().credentials_type, &args);
   std::shared_ptr<Channel> channel =
-      CreateChannel(server_address_.str(), InsecureChannelCredentials());
+      CreateCustomChannel(server_address_.str(), channel_creds, args);
   std::unique_ptr<grpc::testing::UnimplementedService::Stub> stub;
   stub = grpc::testing::UnimplementedService::NewStub(channel);
   EchoRequest send_request;
@@ -795,12 +874,12 @@
   Status recv_status;
 
   ClientContext cli_ctx;
-  send_request.set_message("Hello");
+  send_request.set_message(GetParam().message_content);
   std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
       stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
 
   response_reader->Finish(&recv_response, &recv_status, tag(4));
-  Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
+  Verifier(GetParam().disable_blocking).Expect(4, false).Verify(cq_.get());
 
   EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
   EXPECT_EQ("", recv_status.error_message());
@@ -847,23 +926,25 @@
     // Initiate the 'RequestStream' call on client
     std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
         stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
-    Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
 
     // On the server, request to be notified of 'RequestStream' calls
     // and receive the 'RequestStream' call just made by the client
     srv_ctx.AsyncNotifyWhenDone(tag(11));
     service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
                                   tag(2));
-    Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
 
     // Client sends 3 messages (tags 3, 4 and 5)
     for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
       send_request.set_message("Ping " + std::to_string(tag_idx));
       cli_stream->Write(send_request, tag(tag_idx));
-      Verifier(GetParam()).Expect(tag_idx, true).Verify(cq_.get());
+      Verifier(GetParam().disable_blocking)
+          .Expect(tag_idx, true)
+          .Verify(cq_.get());
     }
     cli_stream->WritesDone(tag(6));
-    Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(6, true).Verify(cq_.get());
 
     bool expected_server_cq_result = true;
     bool ignore_cq_result = false;
@@ -871,7 +952,7 @@
 
     if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
       srv_ctx.TryCancel();
-      Verifier(GetParam()).Expect(11, true).Verify(cq_.get());
+      Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
       EXPECT_TRUE(srv_ctx.IsCancelled());
 
       // Since cancellation is done before server reads any results, we know
@@ -881,7 +962,7 @@
 
     std::thread* server_try_cancel_thd = NULL;
 
-    auto verif = Verifier(GetParam());
+    auto verif = Verifier(GetParam().disable_blocking);
 
     if (server_try_cancel == CANCEL_DURING_PROCESSING) {
       server_try_cancel_thd =
@@ -939,13 +1020,13 @@
     // Server sends the final message and cancelled status (but the RPC is
     // already cancelled at this point. So we expect the operation to fail)
     srv_stream.Finish(send_response, Status::CANCELLED, tag(9));
-    Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
 
     // Client will see the cancellation
     cli_stream->Finish(&recv_status, tag(10));
     // TODO(sreek): The expectation here should be true. This is a bug (github
     // issue #4972)
-    Verifier(GetParam()).Expect(10, false).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(10, false).Verify(cq_.get());
     EXPECT_FALSE(recv_status.ok());
     EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
   }
@@ -979,13 +1060,13 @@
     // Initiate the 'ResponseStream' call on the client
     std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
         stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
-    Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
     // On the server, request to be notified of 'ResponseStream' calls and
     // receive the call just made by the client
     srv_ctx.AsyncNotifyWhenDone(tag(11));
     service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
                                    cq_.get(), cq_.get(), tag(2));
-    Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
     EXPECT_EQ(send_request.message(), recv_request.message());
 
     bool expected_cq_result = true;
@@ -994,7 +1075,7 @@
 
     if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
       srv_ctx.TryCancel();
-      Verifier(GetParam()).Expect(11, true).Verify(cq_.get());
+      Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
       EXPECT_TRUE(srv_ctx.IsCancelled());
 
       // We know for sure that all cq results will be false from this point
@@ -1004,7 +1085,7 @@
 
     std::thread* server_try_cancel_thd = NULL;
 
-    auto verif = Verifier(GetParam());
+    auto verif = Verifier(GetParam().disable_blocking);
 
     if (server_try_cancel == CANCEL_DURING_PROCESSING) {
       server_try_cancel_thd =
@@ -1064,7 +1145,7 @@
     // Client attemts to read the three messages from the server
     for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
       cli_stream->Read(&recv_response, tag(tag_idx));
-      Verifier(GetParam())
+      Verifier(GetParam().disable_blocking)
           .Expect(tag_idx, expected_cq_result)
           .Verify(cq_.get(), ignore_cq_result);
     }
@@ -1075,11 +1156,11 @@
 
     // Server finishes the stream (but the RPC is already cancelled)
     srv_stream.Finish(Status::CANCELLED, tag(9));
-    Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
 
     // Client will see the cancellation
     cli_stream->Finish(&recv_status, tag(10));
-    Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
     EXPECT_FALSE(recv_status.ok());
     EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
   }
@@ -1114,19 +1195,19 @@
     // Initiate the call from the client side
     std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
         cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
-    Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
 
     // On the server, request to be notified of the 'BidiStream' call and
     // receive the call just made by the client
     srv_ctx.AsyncNotifyWhenDone(tag(11));
     service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
                                tag(2));
-    Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
 
     // Client sends the first and the only message
     send_request.set_message("Ping");
     cli_stream->Write(send_request, tag(3));
-    Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
 
     bool expected_cq_result = true;
     bool ignore_cq_result = false;
@@ -1134,7 +1215,7 @@
 
     if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
       srv_ctx.TryCancel();
-      Verifier(GetParam()).Expect(11, true).Verify(cq_.get());
+      Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
       EXPECT_TRUE(srv_ctx.IsCancelled());
 
       // We know for sure that all cq results will be false from this point
@@ -1144,7 +1225,7 @@
 
     std::thread* server_try_cancel_thd = NULL;
 
-    auto verif = Verifier(GetParam());
+    auto verif = Verifier(GetParam().disable_blocking);
 
     if (server_try_cancel == CANCEL_DURING_PROCESSING) {
       server_try_cancel_thd =
@@ -1244,10 +1325,10 @@
     // know that cq results are supposed to return false on server.
 
     srv_stream.Finish(Status::CANCELLED, tag(9));
-    Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
 
     cli_stream->Finish(&recv_status, tag(10));
-    Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
+    Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
     EXPECT_FALSE(recv_status.ok());
     EXPECT_EQ(grpc::StatusCode::CANCELLED, recv_status.error_code());
   }
@@ -1289,11 +1370,48 @@
   TestBidiStreamingServerCancel(CANCEL_AFTER_PROCESSING);
 }
 
+std::vector<TestScenario> CreateTestScenarios(bool test_disable_blocking,
+                                              bool test_secure,
+                                              int test_big_limit) {
+  std::vector<TestScenario> scenarios;
+  std::vector<grpc::string> credentials_types;
+  std::vector<grpc::string> messages;
+
+  credentials_types.push_back(kInsecureCredentialsType);
+  auto sec_list = GetSecureCredentialsTypeList();
+  for (auto sec = sec_list.begin(); sec != sec_list.end(); sec++) {
+    credentials_types.push_back(*sec);
+  }
+
+  messages.push_back("Hello");
+  for (int sz = 1; sz < test_big_limit; sz *= 2) {
+    grpc::string big_msg;
+    for (int i = 0; i < sz * 1024; i++) {
+      char c = 'a' + (i % 26);
+      big_msg += c;
+    }
+    messages.push_back(big_msg);
+  }
+
+  for (auto cred = credentials_types.begin(); cred != credentials_types.end();
+       ++cred) {
+    for (auto msg = messages.begin(); msg != messages.end(); msg++) {
+      scenarios.push_back(TestScenario(false, *cred, *msg));
+      if (test_disable_blocking) {
+        scenarios.push_back(TestScenario(true, *cred, *msg));
+      }
+    }
+  }
+  return scenarios;
+}
+
 INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
-                        ::testing::Values(false, true));
+                        ::testing::ValuesIn(CreateTestScenarios(true, true,
+                                                                1024)));
 INSTANTIATE_TEST_CASE_P(AsyncEnd2endServerTryCancel,
                         AsyncEnd2endServerTryCancelTest,
-                        ::testing::Values(false));
+                        ::testing::ValuesIn(CreateTestScenarios(false, false,
+                                                                0)));
 
 }  // namespace
 }  // namespace testing
diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc
index 0c9313f..e3408bf 100644
--- a/test/cpp/end2end/end2end_test.cc
+++ b/test/cpp/end2end/end2end_test.cc
@@ -975,6 +975,34 @@
   EXPECT_EQ("", s.error_message());
 }
 
+// Ask the server to send back a serialized proto in trailer.
+// This is an example of setting error details.
+TEST_P(End2endTest, BinaryTrailerTest) {
+  ResetStub();
+  EchoRequest request;
+  EchoResponse response;
+  ClientContext context;
+
+  request.mutable_param()->set_echo_metadata(true);
+  DebugInfo* info = request.mutable_param()->mutable_debug_info();
+  info->add_stack_entries("stack_entry_1");
+  info->add_stack_entries("stack_entry_2");
+  info->add_stack_entries("stack_entry_3");
+  info->set_detail("detailed debug info");
+  grpc::string expected_string = info->SerializeAsString();
+  request.set_message("Hello");
+
+  Status s = stub_->Echo(&context, request, &response);
+  EXPECT_FALSE(s.ok());
+  auto trailers = context.GetServerTrailingMetadata();
+  EXPECT_EQ(1u, trailers.count(kDebugInfoTrailerKey));
+  auto iter = trailers.find(kDebugInfoTrailerKey);
+  EXPECT_EQ(expected_string, iter->second);
+  // Parse the returned trailer into a DebugInfo proto.
+  DebugInfo returned_info;
+  EXPECT_TRUE(returned_info.ParseFromString(ToString(iter->second)));
+}
+
 //////////////////////////////////////////////////////////////////////////
 // Test with and without a proxy.
 class ProxyEnd2endTest : public End2endTest {
diff --git a/test/cpp/end2end/server_builder_plugin_test.cc b/test/cpp/end2end/server_builder_plugin_test.cc
new file mode 100644
index 0000000..87e3709
--- /dev/null
+++ b/test/cpp/end2end/server_builder_plugin_test.cc
@@ -0,0 +1,256 @@
+/*
+ *
+ * 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 <grpc++/channel.h>
+#include <grpc++/client_context.h>
+#include <grpc++/create_channel.h>
+#include <grpc++/impl/server_builder_option.h>
+#include <grpc++/impl/server_builder_plugin.h>
+#include <grpc++/impl/server_initializer.h>
+#include <grpc++/security/credentials.h>
+#include <grpc++/security/server_credentials.h>
+#include <grpc++/server.h>
+#include <grpc++/server_builder.h>
+#include <grpc++/server_context.h>
+#include <grpc/grpc.h>
+#include <gtest/gtest.h>
+
+#include "src/proto/grpc/testing/echo.grpc.pb.h"
+#include "test/core/util/port.h"
+#include "test/core/util/test_config.h"
+#include "test/cpp/end2end/test_service_impl.h"
+
+#define PLUGIN_NAME "TestServerBuilderPlugin"
+
+namespace grpc {
+namespace testing {
+
+class TestServerBuilderPlugin : public ServerBuilderPlugin {
+ public:
+  TestServerBuilderPlugin() : service_(new TestServiceImpl()) {
+    init_server_is_called_ = false;
+    finish_is_called_ = false;
+    change_arguments_is_called_ = false;
+  }
+
+  grpc::string name() GRPC_OVERRIDE { return PLUGIN_NAME; }
+
+  void InitServer(ServerInitializer* si) GRPC_OVERRIDE {
+    init_server_is_called_ = true;
+    if (register_service_) {
+      si->RegisterService(service_);
+    }
+  }
+
+  void Finish(ServerInitializer* si) GRPC_OVERRIDE { finish_is_called_ = true; }
+
+  void ChangeArguments(const grpc::string& name, void* value) GRPC_OVERRIDE {
+    change_arguments_is_called_ = true;
+  }
+
+  bool has_async_methods() const GRPC_OVERRIDE {
+    if (register_service_) {
+      return service_->has_async_methods();
+    }
+    return false;
+  }
+
+  bool has_sync_methods() const GRPC_OVERRIDE {
+    if (register_service_) {
+      return service_->has_synchronous_methods();
+    }
+    return false;
+  }
+
+  void SetRegisterService() { register_service_ = true; }
+
+  bool init_server_is_called() { return init_server_is_called_; }
+  bool finish_is_called() { return finish_is_called_; }
+  bool change_arguments_is_called() { return change_arguments_is_called_; }
+
+ private:
+  bool init_server_is_called_;
+  bool finish_is_called_;
+  bool change_arguments_is_called_;
+  bool register_service_;
+  std::shared_ptr<TestServiceImpl> service_;
+};
+
+class InsertPluginServerBuilderOption : public ServerBuilderOption {
+ public:
+  InsertPluginServerBuilderOption() { register_service_ = false; }
+
+  void UpdateArguments(ChannelArguments* arg) GRPC_OVERRIDE {}
+
+  void UpdatePlugins(
+      std::map<grpc::string, std::unique_ptr<ServerBuilderPlugin>>* plugins)
+      GRPC_OVERRIDE {
+    plugins->clear();
+
+    std::unique_ptr<TestServerBuilderPlugin> plugin(
+        new TestServerBuilderPlugin());
+    if (register_service_) plugin->SetRegisterService();
+    (*plugins)[plugin->name()] = std::move(plugin);
+  }
+
+  void SetRegisterService() { register_service_ = true; }
+
+ private:
+  bool register_service_;
+};
+
+std::unique_ptr<ServerBuilderPlugin> CreateTestServerBuilderPlugin() {
+  return std::unique_ptr<ServerBuilderPlugin>(new TestServerBuilderPlugin());
+}
+
+void AddTestServerBuilderPlugin() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  ::grpc::ServerBuilder::InternalAddPluginFactory(
+      &CreateTestServerBuilderPlugin);
+}
+
+// Force AddServerBuilderPlugin() to be called at static initialization time.
+struct StaticTestPluginInitializer {
+  StaticTestPluginInitializer() { AddTestServerBuilderPlugin(); }
+} static_plugin_initializer_test_;
+
+// When the param boolean is true, the ServerBuilder plugin will be added at the
+// time of static initialization. When it's false, the ServerBuilder plugin will
+// be added using ServerBuilder::SetOption().
+class ServerBuilderPluginTest : public ::testing::TestWithParam<bool> {
+ public:
+  ServerBuilderPluginTest() {}
+
+  void SetUp() GRPC_OVERRIDE {
+    port_ = grpc_pick_unused_port_or_die();
+    builder_.reset(new ServerBuilder());
+  }
+
+  void InsertPlugin() {
+    if (GetParam()) {
+      // Add ServerBuilder plugin in static initialization
+      EXPECT_TRUE(builder_->plugins_[PLUGIN_NAME] != nullptr);
+    } else {
+      // Add ServerBuilder plugin using ServerBuilder::SetOption()
+      builder_->SetOption(std::unique_ptr<ServerBuilderOption>(
+          new InsertPluginServerBuilderOption()));
+    }
+  }
+
+  void InsertPluginWithTestService() {
+    if (GetParam()) {
+      // Add ServerBuilder plugin in static initialization
+      EXPECT_TRUE(builder_->plugins_[PLUGIN_NAME] != nullptr);
+      auto plugin = static_cast<TestServerBuilderPlugin*>(
+          builder_->plugins_[PLUGIN_NAME].get());
+      EXPECT_TRUE(plugin != nullptr);
+      plugin->SetRegisterService();
+    } else {
+      // Add ServerBuilder plugin using ServerBuilder::SetOption()
+      std::unique_ptr<InsertPluginServerBuilderOption> option(
+          new InsertPluginServerBuilderOption());
+      option->SetRegisterService();
+      builder_->SetOption(std::move(option));
+    }
+  }
+
+  void StartServer() {
+    grpc::string server_address = "localhost:" + to_string(port_);
+    builder_->AddListeningPort(server_address, InsecureServerCredentials());
+    server_ = builder_->BuildAndStart();
+    EXPECT_TRUE(builder_->plugins_[PLUGIN_NAME] != nullptr);
+  }
+
+  void ResetStub() {
+    string target = "dns:localhost:" + to_string(port_);
+    channel_ = CreateChannel(target, InsecureChannelCredentials());
+    stub_ = grpc::testing::EchoTestService::NewStub(channel_);
+  }
+
+  void TearDown() GRPC_OVERRIDE {
+    EXPECT_TRUE(builder_->plugins_[PLUGIN_NAME] != nullptr);
+    auto plugin = static_cast<TestServerBuilderPlugin*>(
+        builder_->plugins_[PLUGIN_NAME].get());
+    EXPECT_TRUE(plugin != nullptr);
+    EXPECT_TRUE(plugin->init_server_is_called());
+    EXPECT_TRUE(plugin->finish_is_called());
+  }
+
+  string to_string(const int number) {
+    std::stringstream strs;
+    strs << number;
+    return strs.str();
+  }
+
+ protected:
+  std::shared_ptr<Channel> channel_;
+  std::unique_ptr<ServerBuilder> builder_;
+  std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
+  std::unique_ptr<Server> server_;
+  TestServiceImpl service_;
+  int port_;
+};
+
+TEST_P(ServerBuilderPluginTest, PluginWithoutServiceTest) {
+  InsertPlugin();
+  StartServer();
+}
+
+TEST_P(ServerBuilderPluginTest, PluginWithServiceTest) {
+  InsertPluginWithTestService();
+  StartServer();
+  ResetStub();
+
+  EchoRequest request;
+  EchoResponse response;
+  request.set_message("Hello hello hello hello");
+  ClientContext context;
+  context.set_compression_algorithm(GRPC_COMPRESS_GZIP);
+  Status s = stub_->Echo(&context, request, &response);
+  EXPECT_EQ(response.message(), request.message());
+  EXPECT_TRUE(s.ok());
+}
+
+INSTANTIATE_TEST_CASE_P(ServerBuilderPluginTest, ServerBuilderPluginTest,
+                        ::testing::Values(false, true));
+
+}  // namespace testing
+}  // namespace grpc
+
+int main(int argc, char** argv) {
+  grpc_test_init(argc, argv);
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/cpp/end2end/test_service_impl.cc b/test/cpp/end2end/test_service_impl.cc
index 2f5dd6d..cbaee92 100644
--- a/test/cpp/end2end/test_service_impl.cc
+++ b/test/cpp/end2end/test_service_impl.cc
@@ -135,6 +135,14 @@
       context->AddTrailingMetadata(ToString(iter->first),
                                    ToString(iter->second));
     }
+    // Terminate rpc with error and debug info in trailer.
+    if (request->param().debug_info().stack_entries_size() ||
+        !request->param().debug_info().detail().empty()) {
+      grpc::string serialized_debug_info =
+          request->param().debug_info().SerializeAsString();
+      context->AddTrailingMetadata(kDebugInfoTrailerKey, serialized_debug_info);
+      return Status::CANCELLED;
+    }
   }
   if (request->has_param() &&
       (request->param().expected_client_identity().length() > 0 ||
diff --git a/test/cpp/end2end/test_service_impl.h b/test/cpp/end2end/test_service_impl.h
index 1ab6ced..c89f88c 100644
--- a/test/cpp/end2end/test_service_impl.h
+++ b/test/cpp/end2end/test_service_impl.h
@@ -47,6 +47,7 @@
 const int kNumResponseStreamsMsgs = 3;
 const char* const kServerCancelAfterReads = "cancel_after_reads";
 const char* const kServerTryCancelRequest = "server_try_cancel";
+const char* const kDebugInfoTrailerKey = "debug-info-bin";
 
 typedef enum {
   DO_NOT_CANCEL = 0,
diff --git a/test/cpp/grpclb/grpclb_api_test.cc b/test/cpp/grpclb/grpclb_api_test.cc
index 92f93c8..bf77878 100644
--- a/test/cpp/grpclb/grpclb_api_test.cc
+++ b/test/cpp/grpclb/grpclb_api_test.cc
@@ -35,13 +35,13 @@
 #include <string>
 
 #include "src/core/ext/lb_policy/grpclb/load_balancer_api.h"
-#include "src/proto/grpc/lb/v0/load_balancer.pb.h"  // C++ version
+#include "src/proto/grpc/lb/v1/load_balancer.pb.h"  // C++ version
 
 namespace grpc {
 namespace {
 
-using grpc::lb::v0::LoadBalanceRequest;
-using grpc::lb::v0::LoadBalanceResponse;
+using grpc::lb::v1::LoadBalanceRequest;
+using grpc::lb::v1::LoadBalanceResponse;
 
 class GrpclbTest : public ::testing::Test {};
 
@@ -60,9 +60,7 @@
 
 TEST_F(GrpclbTest, ParseResponse) {
   LoadBalanceResponse response;
-  const std::string client_config_str = "I'm a client config";
   auto* initial_response = response.mutable_initial_response();
-  initial_response->set_client_config(client_config_str);
   auto* client_stats_report_interval =
       initial_response->mutable_client_stats_report_interval();
   client_stats_report_interval->set_seconds(123);
@@ -73,10 +71,7 @@
       gpr_slice_from_copied_string(encoded_response.c_str());
   grpc_grpclb_response* c_response = grpc_grpclb_response_parse(encoded_slice);
   EXPECT_TRUE(c_response->has_initial_response);
-  EXPECT_TRUE(c_response->initial_response.has_client_config);
   EXPECT_FALSE(c_response->initial_response.has_load_balancer_delegate);
-  EXPECT_TRUE(strcmp(c_response->initial_response.client_config,
-                     client_config_str.c_str()) == 0);
   EXPECT_EQ(c_response->initial_response.client_stats_report_interval.seconds,
             123);
   EXPECT_EQ(c_response->initial_response.client_stats_report_interval.nanos,
diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc
index 9af6a88..7727824 100644
--- a/test/cpp/interop/client.cc
+++ b/test/cpp/interop/client.cc
@@ -81,6 +81,14 @@
 DEFINE_string(service_account_key_file, "",
               "Path to service account json key file.");
 DEFINE_string(oauth_scope, "", "Scope for OAuth tokens.");
+DEFINE_bool(do_not_abort_on_transient_failures, false,
+            "If set to 'true', abort() is not called in case of transient "
+            "failures (i.e failures that are temporary and will likely go away "
+            "on retrying; like a temporary connection failure) and an error "
+            "message is printed instead. Note that this flag just controls "
+            "whether abort() is called or not. It does not control whether the "
+            "test is retried in case of transient failures (and currently the "
+            "interop tests are not retried even if this flag is set to true)");
 
 using grpc::testing::CreateChannelForTestCase;
 using grpc::testing::GetServiceAccountJsonKey;
@@ -89,8 +97,9 @@
   grpc::testing::InitTest(&argc, &argv, true);
   gpr_log(GPR_INFO, "Testing these cases: %s", FLAGS_test_case.c_str());
   int ret = 0;
-  grpc::testing::InteropClient client(
-      CreateChannelForTestCase(FLAGS_test_case));
+  grpc::testing::InteropClient client(CreateChannelForTestCase(FLAGS_test_case),
+                                      true,
+                                      FLAGS_do_not_abort_on_transient_failures);
   if (FLAGS_test_case == "empty_unary") {
     client.DoEmpty();
   } else if (FLAGS_test_case == "large_unary") {
diff --git a/test/cpp/interop/interop_client.cc b/test/cpp/interop/interop_client.cc
index 22293d2..cba52b1 100644
--- a/test/cpp/interop/interop_client.cc
+++ b/test/cpp/interop/interop_client.cc
@@ -134,23 +134,43 @@
   serviceStub_.Reset(channel);
 }
 
-InteropClient::InteropClient(std::shared_ptr<Channel> channel)
-    : serviceStub_(channel, true) {}
-
 InteropClient::InteropClient(std::shared_ptr<Channel> channel,
-                             bool new_stub_every_test_case)
-    : serviceStub_(channel, new_stub_every_test_case) {}
+                             bool new_stub_every_test_case,
+                             bool do_not_abort_on_transient_failures)
+    : serviceStub_(channel, new_stub_every_test_case),
+      do_not_abort_on_transient_failures_(do_not_abort_on_transient_failures) {}
 
-void InteropClient::AssertOkOrPrintErrorStatus(const Status& s) {
+bool InteropClient::AssertStatusOk(const Status& s) {
   if (s.ok()) {
-    return;
+    return true;
   }
-  gpr_log(GPR_ERROR, "Error status code: %d, message: %s", s.error_code(),
-          s.error_message().c_str());
-  GPR_ASSERT(0);
+
+  // Note: At this point, s.error_code is definitely not StatusCode::OK (we
+  // already checked for s.ok() above). So, the following will call abort()
+  // (unless s.error_code() corresponds to a transient failure and
+  // 'do_not_abort_on_transient_failures' is true)
+  return AssertStatusCode(s, StatusCode::OK);
 }
 
-void InteropClient::DoEmpty() {
+bool InteropClient::AssertStatusCode(const Status& s,
+                                     StatusCode expected_code) {
+  if (s.error_code() == expected_code) {
+    return true;
+  }
+
+  gpr_log(GPR_ERROR, "Error status code: %d (expected: %d), message: %s",
+          s.error_code(), expected_code, s.error_message().c_str());
+
+  // In case of transient transient/retryable failures (like a broken
+  // connection) we may or may not abort (see TransientFailureOrAbort())
+  if (s.error_code() == grpc::StatusCode::UNAVAILABLE) {
+    return TransientFailureOrAbort();
+  }
+
+  abort();
+}
+
+bool InteropClient::DoEmpty() {
   gpr_log(GPR_DEBUG, "Sending an empty rpc...");
 
   Empty request = Empty::default_instance();
@@ -158,17 +178,21 @@
   ClientContext context;
 
   Status s = serviceStub_.Get()->EmptyCall(&context, request, &response);
-  AssertOkOrPrintErrorStatus(s);
+
+  if (!AssertStatusOk(s)) {
+    return false;
+  }
 
   gpr_log(GPR_DEBUG, "Empty rpc done.");
+  return true;
 }
 
-void InteropClient::PerformLargeUnary(SimpleRequest* request,
+bool InteropClient::PerformLargeUnary(SimpleRequest* request,
                                       SimpleResponse* response) {
-  PerformLargeUnary(request, response, NoopChecks);
+  return PerformLargeUnary(request, response, NoopChecks);
 }
 
-void InteropClient::PerformLargeUnary(SimpleRequest* request,
+bool InteropClient::PerformLargeUnary(SimpleRequest* request,
                                       SimpleResponse* response,
                                       CheckerFn custom_checks_fn) {
   ClientContext context;
@@ -180,7 +204,9 @@
   request->mutable_payload()->set_body(payload.c_str(), kLargeRequestSize);
 
   Status s = serviceStub_.Get()->UnaryCall(&context, *request, response);
-  AssertOkOrPrintErrorStatus(s);
+  if (!AssertStatusOk(s)) {
+    return false;
+  }
 
   custom_checks_fn(inspector, request, response);
 
@@ -203,9 +229,11 @@
     default:
       GPR_ASSERT(false);
   }
+
+  return true;
 }
 
-void InteropClient::DoComputeEngineCreds(
+bool InteropClient::DoComputeEngineCreds(
     const grpc::string& default_service_account,
     const grpc::string& oauth_scope) {
   gpr_log(GPR_DEBUG,
@@ -215,7 +243,11 @@
   request.set_fill_username(true);
   request.set_fill_oauth_scope(true);
   request.set_response_type(PayloadType::COMPRESSABLE);
-  PerformLargeUnary(&request, &response);
+
+  if (!PerformLargeUnary(&request, &response)) {
+    return false;
+  }
+
   gpr_log(GPR_DEBUG, "Got username %s", response.username().c_str());
   gpr_log(GPR_DEBUG, "Got oauth_scope %s", response.oauth_scope().c_str());
   GPR_ASSERT(!response.username().empty());
@@ -224,9 +256,10 @@
   const char* oauth_scope_str = response.oauth_scope().c_str();
   GPR_ASSERT(oauth_scope.find(oauth_scope_str) != grpc::string::npos);
   gpr_log(GPR_DEBUG, "Large unary with compute engine creds done.");
+  return true;
 }
 
-void InteropClient::DoOauth2AuthToken(const grpc::string& username,
+bool InteropClient::DoOauth2AuthToken(const grpc::string& username,
                                       const grpc::string& oauth_scope) {
   gpr_log(GPR_DEBUG,
           "Sending a unary rpc with raw oauth2 access token credentials ...");
@@ -239,16 +272,20 @@
 
   Status s = serviceStub_.Get()->UnaryCall(&context, request, &response);
 
-  AssertOkOrPrintErrorStatus(s);
+  if (!AssertStatusOk(s)) {
+    return false;
+  }
+
   GPR_ASSERT(!response.username().empty());
   GPR_ASSERT(!response.oauth_scope().empty());
   GPR_ASSERT(username == response.username());
   const char* oauth_scope_str = response.oauth_scope().c_str();
   GPR_ASSERT(oauth_scope.find(oauth_scope_str) != grpc::string::npos);
   gpr_log(GPR_DEBUG, "Unary with oauth2 access token credentials done.");
+  return true;
 }
 
-void InteropClient::DoPerRpcCreds(const grpc::string& json_key) {
+bool InteropClient::DoPerRpcCreds(const grpc::string& json_key) {
   gpr_log(GPR_DEBUG, "Sending a unary rpc with per-rpc JWT access token ...");
   SimpleRequest request;
   SimpleResponse response;
@@ -263,35 +300,47 @@
 
   Status s = serviceStub_.Get()->UnaryCall(&context, request, &response);
 
-  AssertOkOrPrintErrorStatus(s);
+  if (!AssertStatusOk(s)) {
+    return false;
+  }
+
   GPR_ASSERT(!response.username().empty());
   GPR_ASSERT(json_key.find(response.username()) != grpc::string::npos);
   gpr_log(GPR_DEBUG, "Unary with per-rpc JWT access token done.");
+  return true;
 }
 
-void InteropClient::DoJwtTokenCreds(const grpc::string& username) {
+bool InteropClient::DoJwtTokenCreds(const grpc::string& username) {
   gpr_log(GPR_DEBUG,
           "Sending a large unary rpc with JWT token credentials ...");
   SimpleRequest request;
   SimpleResponse response;
   request.set_fill_username(true);
   request.set_response_type(PayloadType::COMPRESSABLE);
-  PerformLargeUnary(&request, &response);
+
+  if (!PerformLargeUnary(&request, &response)) {
+    return false;
+  }
+
   GPR_ASSERT(!response.username().empty());
   GPR_ASSERT(username.find(response.username()) != grpc::string::npos);
   gpr_log(GPR_DEBUG, "Large unary with JWT token creds done.");
+  return true;
 }
 
-void InteropClient::DoLargeUnary() {
+bool InteropClient::DoLargeUnary() {
   gpr_log(GPR_DEBUG, "Sending a large unary rpc...");
   SimpleRequest request;
   SimpleResponse response;
   request.set_response_type(PayloadType::COMPRESSABLE);
-  PerformLargeUnary(&request, &response);
+  if (!PerformLargeUnary(&request, &response)) {
+    return false;
+  }
   gpr_log(GPR_DEBUG, "Large unary done.");
+  return true;
 }
 
-void InteropClient::DoLargeCompressedUnary() {
+bool InteropClient::DoLargeCompressedUnary() {
   const CompressionType compression_types[] = {NONE, GZIP, DEFLATE};
   const PayloadType payload_types[] = {COMPRESSABLE, UNCOMPRESSABLE, RANDOM};
   for (size_t i = 0; i < GPR_ARRAY_SIZE(payload_types); i++) {
@@ -307,14 +356,32 @@
       SimpleResponse response;
       request.set_response_type(payload_types[i]);
       request.set_response_compression(compression_types[j]);
-      PerformLargeUnary(&request, &response, CompressionChecks);
+
+      if (!PerformLargeUnary(&request, &response, CompressionChecks)) {
+        gpr_log(GPR_ERROR, "Large compressed unary failed %s", log_suffix);
+        gpr_free(log_suffix);
+        return false;
+      }
+
       gpr_log(GPR_DEBUG, "Large compressed unary done %s.", log_suffix);
       gpr_free(log_suffix);
     }
   }
+
+  return true;
 }
 
-void InteropClient::DoRequestStreaming() {
+// Either abort() (unless do_not_abort_on_transient_failures_ is true) or return
+// false
+bool InteropClient::TransientFailureOrAbort() {
+  if (do_not_abort_on_transient_failures_) {
+    return false;
+  }
+
+  abort();
+}
+
+bool InteropClient::DoRequestStreaming() {
   gpr_log(GPR_DEBUG, "Sending request steaming rpc ...");
 
   ClientContext context;
@@ -328,19 +395,25 @@
   for (unsigned int i = 0; i < request_stream_sizes.size(); ++i) {
     Payload* payload = request.mutable_payload();
     payload->set_body(grpc::string(request_stream_sizes[i], '\0'));
-    GPR_ASSERT(stream->Write(request));
+    if (!stream->Write(request)) {
+      gpr_log(GPR_ERROR, "DoRequestStreaming(): stream->Write() failed");
+      return TransientFailureOrAbort();
+    }
     aggregated_payload_size += request_stream_sizes[i];
   }
   stream->WritesDone();
+
   Status s = stream->Finish();
+  if (!AssertStatusOk(s)) {
+    return false;
+  }
 
   GPR_ASSERT(response.aggregated_payload_size() == aggregated_payload_size);
-  AssertOkOrPrintErrorStatus(s);
-  gpr_log(GPR_DEBUG, "Request streaming done.");
+  return true;
 }
 
-void InteropClient::DoResponseStreaming() {
-  gpr_log(GPR_DEBUG, "Receiving response steaming rpc ...");
+bool InteropClient::DoResponseStreaming() {
+  gpr_log(GPR_DEBUG, "Receiving response streaming rpc ...");
 
   ClientContext context;
   StreamingOutputCallRequest request;
@@ -358,13 +431,27 @@
                grpc::string(response_stream_sizes[i], '\0'));
     ++i;
   }
-  GPR_ASSERT(response_stream_sizes.size() == i);
+
+  if (i < response_stream_sizes.size()) {
+    // stream->Read() failed before reading all the expected messages. This is
+    // most likely due to connection failure.
+    gpr_log(GPR_ERROR,
+            "DoResponseStreaming(): Read fewer streams (%d) than "
+            "response_stream_sizes.size() (%d)",
+            i, response_stream_sizes.size());
+    return TransientFailureOrAbort();
+  }
+
   Status s = stream->Finish();
-  AssertOkOrPrintErrorStatus(s);
+  if (!AssertStatusOk(s)) {
+    return false;
+  }
+
   gpr_log(GPR_DEBUG, "Response streaming done.");
+  return true;
 }
 
-void InteropClient::DoResponseCompressedStreaming() {
+bool InteropClient::DoResponseCompressedStreaming() {
   const CompressionType compression_types[] = {NONE, GZIP, DEFLATE};
   const PayloadType payload_types[] = {COMPRESSABLE, UNCOMPRESSABLE, RANDOM};
   for (size_t i = 0; i < GPR_ARRAY_SIZE(payload_types); i++) {
@@ -378,7 +465,7 @@
                    CompressionType_Name(compression_types[j]).c_str(),
                    PayloadType_Name(payload_types[i]).c_str());
 
-      gpr_log(GPR_DEBUG, "Receiving response steaming rpc %s.", log_suffix);
+      gpr_log(GPR_DEBUG, "Receiving response streaming rpc %s.", log_suffix);
 
       request.set_response_type(payload_types[i]);
       request.set_response_compression(compression_types[j]);
@@ -432,18 +519,32 @@
         ++k;
       }
 
-      GPR_ASSERT(response_stream_sizes.size() == k);
-      Status s = stream->Finish();
-
-      AssertOkOrPrintErrorStatus(s);
       gpr_log(GPR_DEBUG, "Response streaming done %s.", log_suffix);
       gpr_free(log_suffix);
+
+      if (k < response_stream_sizes.size()) {
+        // stream->Read() failed before reading all the expected messages. This
+        // is most likely due to a connection failure.
+        gpr_log(GPR_ERROR,
+                "DoResponseCompressedStreaming(): Responses read (k=%d) is "
+                "less than the expected messages (i.e "
+                "response_stream_sizes.size() (%d)). (i=%d, j=%d)",
+                k, response_stream_sizes.size(), i, j);
+        return TransientFailureOrAbort();
+      }
+
+      Status s = stream->Finish();
+      if (!AssertStatusOk(s)) {
+        return false;
+      }
     }
   }
+
+  return true;
 }
 
-void InteropClient::DoResponseStreamingWithSlowConsumer() {
-  gpr_log(GPR_DEBUG, "Receiving response steaming rpc with slow consumer ...");
+bool InteropClient::DoResponseStreamingWithSlowConsumer() {
+  gpr_log(GPR_DEBUG, "Receiving response streaming rpc with slow consumer ...");
 
   ClientContext context;
   StreamingOutputCallRequest request;
@@ -464,14 +565,26 @@
     usleep(kReceiveDelayMilliSeconds * 1000);
     ++i;
   }
-  GPR_ASSERT(kNumResponseMessages == i);
-  Status s = stream->Finish();
 
-  AssertOkOrPrintErrorStatus(s);
+  if (i < kNumResponseMessages) {
+    gpr_log(GPR_ERROR,
+            "DoResponseStreamingWithSlowConsumer(): Responses read (i=%d) is "
+            "less than the expected messages (i.e kNumResponseMessages = %d)",
+            i, kNumResponseMessages);
+
+    return TransientFailureOrAbort();
+  }
+
+  Status s = stream->Finish();
+  if (!AssertStatusOk(s)) {
+    return false;
+  }
+
   gpr_log(GPR_DEBUG, "Response streaming done.");
+  return true;
 }
 
-void InteropClient::DoHalfDuplex() {
+bool InteropClient::DoHalfDuplex() {
   gpr_log(GPR_DEBUG, "Sending half-duplex streaming rpc ...");
 
   ClientContext context;
@@ -483,7 +596,11 @@
   ResponseParameters* response_parameter = request.add_response_parameters();
   for (unsigned int i = 0; i < response_stream_sizes.size(); ++i) {
     response_parameter->set_size(response_stream_sizes[i]);
-    GPR_ASSERT(stream->Write(request));
+
+    if (!stream->Write(request)) {
+      gpr_log(GPR_ERROR, "DoHalfDuplex(): stream->Write() failed. i=%d", i);
+      return TransientFailureOrAbort();
+    }
   }
   stream->WritesDone();
 
@@ -494,13 +611,27 @@
                grpc::string(response_stream_sizes[i], '\0'));
     ++i;
   }
-  GPR_ASSERT(response_stream_sizes.size() == i);
+
+  if (i < response_stream_sizes.size()) {
+    // stream->Read() failed before reading all the expected messages. This is
+    // most likely due to a connection failure
+    gpr_log(GPR_ERROR,
+            "DoHalfDuplex(): Responses read (i=%d) are less than the expected "
+            "number of messages response_stream_sizes.size() (%d)",
+            i, response_stream_sizes.size());
+    return TransientFailureOrAbort();
+  }
+
   Status s = stream->Finish();
-  AssertOkOrPrintErrorStatus(s);
+  if (!AssertStatusOk(s)) {
+    return false;
+  }
+
   gpr_log(GPR_DEBUG, "Half-duplex streaming rpc done.");
+  return true;
 }
 
-void InteropClient::DoPingPong() {
+bool InteropClient::DoPingPong() {
   gpr_log(GPR_DEBUG, "Sending Ping Pong streaming rpc ...");
 
   ClientContext context;
@@ -513,24 +644,40 @@
   ResponseParameters* response_parameter = request.add_response_parameters();
   Payload* payload = request.mutable_payload();
   StreamingOutputCallResponse response;
+
   for (unsigned int i = 0; i < request_stream_sizes.size(); ++i) {
     response_parameter->set_size(response_stream_sizes[i]);
     payload->set_body(grpc::string(request_stream_sizes[i], '\0'));
-    GPR_ASSERT(stream->Write(request));
-    GPR_ASSERT(stream->Read(&response));
+
+    if (!stream->Write(request)) {
+      gpr_log(GPR_ERROR, "DoPingPong(): stream->Write() failed. i: %d", i);
+      return TransientFailureOrAbort();
+    }
+
+    if (!stream->Read(&response)) {
+      gpr_log(GPR_ERROR, "DoPingPong(): stream->Read() failed. i:%d", i);
+      return TransientFailureOrAbort();
+    }
+
     GPR_ASSERT(response.payload().body() ==
                grpc::string(response_stream_sizes[i], '\0'));
   }
 
   stream->WritesDone();
+
   GPR_ASSERT(!stream->Read(&response));
+
   Status s = stream->Finish();
-  AssertOkOrPrintErrorStatus(s);
+  if (!AssertStatusOk(s)) {
+    return false;
+  }
+
   gpr_log(GPR_DEBUG, "Ping pong streaming done.");
+  return true;
 }
 
-void InteropClient::DoCancelAfterBegin() {
-  gpr_log(GPR_DEBUG, "Sending request steaming rpc ...");
+bool InteropClient::DoCancelAfterBegin() {
+  gpr_log(GPR_DEBUG, "Sending request streaming rpc ...");
 
   ClientContext context;
   StreamingInputCallRequest request;
@@ -542,11 +689,16 @@
   gpr_log(GPR_DEBUG, "Trying to cancel...");
   context.TryCancel();
   Status s = stream->Finish();
-  GPR_ASSERT(s.error_code() == StatusCode::CANCELLED);
+
+  if (!AssertStatusCode(s, StatusCode::CANCELLED)) {
+    return false;
+  }
+
   gpr_log(GPR_DEBUG, "Canceling streaming done.");
+  return true;
 }
 
-void InteropClient::DoCancelAfterFirstResponse() {
+bool InteropClient::DoCancelAfterFirstResponse() {
   gpr_log(GPR_DEBUG, "Sending Ping Pong streaming rpc ...");
 
   ClientContext context;
@@ -560,17 +712,27 @@
   response_parameter->set_size(31415);
   request.mutable_payload()->set_body(grpc::string(27182, '\0'));
   StreamingOutputCallResponse response;
-  GPR_ASSERT(stream->Write(request));
-  GPR_ASSERT(stream->Read(&response));
+
+  if (!stream->Write(request)) {
+    gpr_log(GPR_ERROR, "DoCancelAfterFirstResponse(): stream->Write() failed");
+    return TransientFailureOrAbort();
+  }
+
+  if (!stream->Read(&response)) {
+    gpr_log(GPR_ERROR, "DoCancelAfterFirstResponse(): stream->Read failed");
+    return TransientFailureOrAbort();
+  }
   GPR_ASSERT(response.payload().body() == grpc::string(31415, '\0'));
+
   gpr_log(GPR_DEBUG, "Trying to cancel...");
   context.TryCancel();
 
   Status s = stream->Finish();
   gpr_log(GPR_DEBUG, "Canceling pingpong streaming done.");
+  return true;
 }
 
-void InteropClient::DoTimeoutOnSleepingServer() {
+bool InteropClient::DoTimeoutOnSleepingServer() {
   gpr_log(GPR_DEBUG,
           "Sending Ping Pong streaming rpc with a short deadline...");
 
@@ -587,11 +749,15 @@
   stream->Write(request);
 
   Status s = stream->Finish();
-  GPR_ASSERT(s.error_code() == StatusCode::DEADLINE_EXCEEDED);
+  if (!AssertStatusCode(s, StatusCode::DEADLINE_EXCEEDED)) {
+    return false;
+  }
+
   gpr_log(GPR_DEBUG, "Pingpong streaming timeout done.");
+  return true;
 }
 
-void InteropClient::DoEmptyStream() {
+bool InteropClient::DoEmptyStream() {
   gpr_log(GPR_DEBUG, "Starting empty_stream.");
 
   ClientContext context;
@@ -601,12 +767,17 @@
   stream->WritesDone();
   StreamingOutputCallResponse response;
   GPR_ASSERT(stream->Read(&response) == false);
+
   Status s = stream->Finish();
-  AssertOkOrPrintErrorStatus(s);
+  if (!AssertStatusOk(s)) {
+    return false;
+  }
+
   gpr_log(GPR_DEBUG, "empty_stream done.");
+  return true;
 }
 
-void InteropClient::DoStatusWithMessage() {
+bool InteropClient::DoStatusWithMessage() {
   gpr_log(GPR_DEBUG,
           "Sending RPC with a request for status code 2 and message");
 
@@ -620,12 +791,16 @@
 
   Status s = serviceStub_.Get()->UnaryCall(&context, request, &response);
 
-  GPR_ASSERT(s.error_code() == grpc::StatusCode::UNKNOWN);
+  if (!AssertStatusCode(s, grpc::StatusCode::UNKNOWN)) {
+    return false;
+  }
+
   GPR_ASSERT(s.error_message() == test_msg);
   gpr_log(GPR_DEBUG, "Done testing Status and Message");
+  return true;
 }
 
-void InteropClient::DoCustomMetadata() {
+bool InteropClient::DoCustomMetadata() {
   const grpc::string kEchoInitialMetadataKey("x-grpc-test-echo-initial");
   const grpc::string kInitialMetadataValue("test_initial_metadata_value");
   const grpc::string kEchoTrailingBinMetadataKey(
@@ -645,7 +820,10 @@
     request.mutable_payload()->set_body(payload.c_str(), kLargeRequestSize);
 
     Status s = serviceStub_.Get()->UnaryCall(&context, request, &response);
-    AssertOkOrPrintErrorStatus(s);
+    if (!AssertStatusOk(s)) {
+      return false;
+    }
+
     const auto& server_initial_metadata = context.GetServerInitialMetadata();
     auto iter = server_initial_metadata.find(kEchoInitialMetadataKey);
     GPR_ASSERT(iter != server_initial_metadata.end());
@@ -675,14 +853,29 @@
     grpc::string payload(kLargeRequestSize, '\0');
     request.mutable_payload()->set_body(payload.c_str(), kLargeRequestSize);
     StreamingOutputCallResponse response;
-    GPR_ASSERT(stream->Write(request));
+
+    if (!stream->Write(request)) {
+      gpr_log(GPR_ERROR, "DoCustomMetadata(): stream->Write() failed");
+      return TransientFailureOrAbort();
+    }
+
     stream->WritesDone();
-    GPR_ASSERT(stream->Read(&response));
+
+    if (!stream->Read(&response)) {
+      gpr_log(GPR_ERROR, "DoCustomMetadata(): stream->Read() failed");
+      return TransientFailureOrAbort();
+    }
+
     GPR_ASSERT(response.payload().body() ==
                grpc::string(kLargeResponseSize, '\0'));
+
     GPR_ASSERT(!stream->Read(&response));
+
     Status s = stream->Finish();
-    AssertOkOrPrintErrorStatus(s);
+    if (!AssertStatusOk(s)) {
+      return false;
+    }
+
     const auto& server_initial_metadata = context.GetServerInitialMetadata();
     auto iter = server_initial_metadata.find(kEchoInitialMetadataKey);
     GPR_ASSERT(iter != server_initial_metadata.end());
@@ -695,6 +888,8 @@
 
     gpr_log(GPR_DEBUG, "Done testing stream with custom metadata");
   }
+
+  return true;
 }
 
 }  // namespace testing
diff --git a/test/cpp/interop/interop_client.h b/test/cpp/interop/interop_client.h
index a3794fd..ae75762 100644
--- a/test/cpp/interop/interop_client.h
+++ b/test/cpp/interop/interop_client.h
@@ -51,41 +51,42 @@
 
 class InteropClient {
  public:
-  explicit InteropClient(std::shared_ptr<Channel> channel);
-  explicit InteropClient(
-      std::shared_ptr<Channel> channel,
-      bool new_stub_every_test_case);  // If new_stub_every_test_case is true,
-                                       // a new TestService::Stub object is
-                                       // created for every test case below
+  /// If new_stub_every_test_case is true, a new TestService::Stub object is
+  /// created for every test case
+  /// If do_not_abort_on_transient_failures is true, abort() is not called in
+  /// case of transient failures (like connection failures)
+  explicit InteropClient(std::shared_ptr<Channel> channel,
+                         bool new_stub_every_test_case,
+                         bool do_not_abort_on_transient_failures);
   ~InteropClient() {}
 
   void Reset(std::shared_ptr<Channel> channel);
 
-  void DoEmpty();
-  void DoLargeUnary();
-  void DoLargeCompressedUnary();
-  void DoPingPong();
-  void DoHalfDuplex();
-  void DoRequestStreaming();
-  void DoResponseStreaming();
-  void DoResponseCompressedStreaming();
-  void DoResponseStreamingWithSlowConsumer();
-  void DoCancelAfterBegin();
-  void DoCancelAfterFirstResponse();
-  void DoTimeoutOnSleepingServer();
-  void DoEmptyStream();
-  void DoStatusWithMessage();
-  void DoCustomMetadata();
+  bool DoEmpty();
+  bool DoLargeUnary();
+  bool DoLargeCompressedUnary();
+  bool DoPingPong();
+  bool DoHalfDuplex();
+  bool DoRequestStreaming();
+  bool DoResponseStreaming();
+  bool DoResponseCompressedStreaming();
+  bool DoResponseStreamingWithSlowConsumer();
+  bool DoCancelAfterBegin();
+  bool DoCancelAfterFirstResponse();
+  bool DoTimeoutOnSleepingServer();
+  bool DoEmptyStream();
+  bool DoStatusWithMessage();
+  bool DoCustomMetadata();
   // Auth tests.
   // username is a string containing the user email
-  void DoJwtTokenCreds(const grpc::string& username);
-  void DoComputeEngineCreds(const grpc::string& default_service_account,
+  bool DoJwtTokenCreds(const grpc::string& username);
+  bool DoComputeEngineCreds(const grpc::string& default_service_account,
                             const grpc::string& oauth_scope);
   // username the GCE default service account email
-  void DoOauth2AuthToken(const grpc::string& username,
+  bool DoOauth2AuthToken(const grpc::string& username,
                          const grpc::string& oauth_scope);
   // username is a string containing the user email
-  void DoPerRpcCreds(const grpc::string& json_key);
+  bool DoPerRpcCreds(const grpc::string& json_key);
 
  private:
   class ServiceStub {
@@ -105,13 +106,18 @@
                                 // Get() call
   };
 
-  void PerformLargeUnary(SimpleRequest* request, SimpleResponse* response);
+  bool PerformLargeUnary(SimpleRequest* request, SimpleResponse* response);
 
   /// Run \a custom_check_fn as an additional check.
-  void PerformLargeUnary(SimpleRequest* request, SimpleResponse* response,
+  bool PerformLargeUnary(SimpleRequest* request, SimpleResponse* response,
                          CheckerFn custom_checks_fn);
-  void AssertOkOrPrintErrorStatus(const Status& s);
+  bool AssertStatusOk(const Status& s);
+  bool AssertStatusCode(const Status& s, StatusCode expected_code);
+  bool TransientFailureOrAbort();
   ServiceStub serviceStub_;
+
+  /// If true, abort() is not called for transient failures
+  bool do_not_abort_on_transient_failures_;
 };
 
 }  // namespace testing
diff --git a/test/cpp/interop/stress_interop_client.cc b/test/cpp/interop/stress_interop_client.cc
index f287a5a..aa95682 100644
--- a/test/cpp/interop/stress_interop_client.cc
+++ b/test/cpp/interop/stress_interop_client.cc
@@ -84,11 +84,12 @@
     int test_id, const grpc::string& server_address,
     std::shared_ptr<Channel> channel,
     const WeightedRandomTestSelector& test_selector, long test_duration_secs,
-    long sleep_duration_ms)
+    long sleep_duration_ms, bool do_not_abort_on_transient_failures)
     : test_id_(test_id),
       server_address_(server_address),
       channel_(channel),
-      interop_client_(new InteropClient(channel, false)),
+      interop_client_(new InteropClient(channel, false,
+                                        do_not_abort_on_transient_failures)),
       test_selector_(test_selector),
       test_duration_secs_(test_duration_secs),
       sleep_duration_ms_(sleep_duration_ms) {}
@@ -126,31 +127,67 @@
   }
 }
 
-// TODO(sree): Add all interop tests
-void StressTestInteropClient::RunTest(TestCaseType test_case) {
+bool StressTestInteropClient::RunTest(TestCaseType test_case) {
+  bool is_success = false;
   switch (test_case) {
     case EMPTY_UNARY: {
-      interop_client_->DoEmpty();
+      is_success = interop_client_->DoEmpty();
       break;
     }
     case LARGE_UNARY: {
-      interop_client_->DoLargeUnary();
+      is_success = interop_client_->DoLargeUnary();
       break;
     }
     case LARGE_COMPRESSED_UNARY: {
-      interop_client_->DoLargeCompressedUnary();
+      is_success = interop_client_->DoLargeCompressedUnary();
       break;
     }
     case CLIENT_STREAMING: {
-      interop_client_->DoRequestStreaming();
+      is_success = interop_client_->DoRequestStreaming();
       break;
     }
     case SERVER_STREAMING: {
-      interop_client_->DoResponseStreaming();
+      is_success = interop_client_->DoResponseStreaming();
+      break;
+    }
+    case SERVER_COMPRESSED_STREAMING: {
+      is_success = interop_client_->DoResponseCompressedStreaming();
+      break;
+    }
+    case SLOW_CONSUMER: {
+      is_success = interop_client_->DoResponseStreamingWithSlowConsumer();
+      break;
+    }
+    case HALF_DUPLEX: {
+      is_success = interop_client_->DoHalfDuplex();
+      break;
+    }
+    case PING_PONG: {
+      is_success = interop_client_->DoPingPong();
+      break;
+    }
+    case CANCEL_AFTER_BEGIN: {
+      is_success = interop_client_->DoCancelAfterBegin();
+      break;
+    }
+    case CANCEL_AFTER_FIRST_RESPONSE: {
+      is_success = interop_client_->DoCancelAfterFirstResponse();
+      break;
+    }
+    case TIMEOUT_ON_SLEEPING_SERVER: {
+      is_success = interop_client_->DoTimeoutOnSleepingServer();
       break;
     }
     case EMPTY_STREAM: {
-      interop_client_->DoEmptyStream();
+      is_success = interop_client_->DoEmptyStream();
+      break;
+    }
+    case STATUS_CODE_AND_MESSAGE: {
+      is_success = interop_client_->DoStatusWithMessage();
+      break;
+    }
+    case CUSTOM_METADATA: {
+      is_success = interop_client_->DoCustomMetadata();
       break;
     }
     default: {
@@ -159,6 +196,8 @@
       break;
     }
   }
+
+  return is_success;
 }
 
 }  // namespace testing
diff --git a/test/cpp/interop/stress_interop_client.h b/test/cpp/interop/stress_interop_client.h
index cb0cd98..aa93b58 100644
--- a/test/cpp/interop/stress_interop_client.h
+++ b/test/cpp/interop/stress_interop_client.h
@@ -49,7 +49,6 @@
 using std::pair;
 using std::vector;
 
-// TODO(sreek): Add more test cases here in future
 enum TestCaseType {
   UNKNOWN_TEST = -1,
   EMPTY_UNARY = 0,
@@ -57,7 +56,16 @@
   LARGE_COMPRESSED_UNARY = 2,
   CLIENT_STREAMING = 3,
   SERVER_STREAMING = 4,
-  EMPTY_STREAM = 5
+  SERVER_COMPRESSED_STREAMING = 5,
+  SLOW_CONSUMER = 6,
+  HALF_DUPLEX = 7,
+  PING_PONG = 8,
+  CANCEL_AFTER_BEGIN = 9,
+  CANCEL_AFTER_FIRST_RESPONSE = 10,
+  TIMEOUT_ON_SLEEPING_SERVER = 11,
+  EMPTY_STREAM = 12,
+  STATUS_CODE_AND_MESSAGE = 13,
+  CUSTOM_METADATA = 14
 };
 
 const vector<pair<TestCaseType, grpc::string>> kTestCaseList = {
@@ -66,7 +74,16 @@
     {LARGE_COMPRESSED_UNARY, "large_compressed_unary"},
     {CLIENT_STREAMING, "client_streaming"},
     {SERVER_STREAMING, "server_streaming"},
-    {EMPTY_STREAM, "empty_stream"}};
+    {SERVER_COMPRESSED_STREAMING, "server_compressed_streaming"},
+    {SLOW_CONSUMER, "slow_consumer"},
+    {HALF_DUPLEX, "half_duplex"},
+    {PING_PONG, "ping_pong"},
+    {CANCEL_AFTER_BEGIN, "cancel_after_begin"},
+    {CANCEL_AFTER_FIRST_RESPONSE, "cancel_after_first_response"},
+    {TIMEOUT_ON_SLEEPING_SERVER, "timeout_on_sleeping_server"},
+    {EMPTY_STREAM, "empty_stream"},
+    {STATUS_CODE_AND_MESSAGE, "status_code_and_message"},
+    {CUSTOM_METADATA, "custom_metadata"}};
 
 class WeightedRandomTestSelector {
  public:
@@ -87,14 +104,15 @@
   StressTestInteropClient(int test_id, const grpc::string& server_address,
                           std::shared_ptr<Channel> channel,
                           const WeightedRandomTestSelector& test_selector,
-                          long test_duration_secs, long sleep_duration_ms);
+                          long test_duration_secs, long sleep_duration_ms,
+                          bool do_not_abort_on_transient_failures);
 
   // The main function. Use this as the thread entry point.
   // qps_gauge is the QpsGauge to record the requests per second metric
   void MainLoop(std::shared_ptr<QpsGauge> qps_gauge);
 
  private:
-  void RunTest(TestCaseType test_case);
+  bool RunTest(TestCaseType test_case);
 
   int test_id_;
   const grpc::string& server_address_;
diff --git a/test/cpp/interop/stress_test.cc b/test/cpp/interop/stress_test.cc
index d9e3fd2..7787931 100644
--- a/test/cpp/interop/stress_test.cc
+++ b/test/cpp/interop/stress_test.cc
@@ -89,7 +89,16 @@
               "   large_compressed_unary\n"
               "   client_streaming\n"
               "   server_streaming\n"
+              "   server_compressed_streaming\n"
+              "   slow_consumer\n"
+              "   half_duplex\n"
+              "   ping_pong\n"
+              "   cancel_after_begin\n"
+              "   cancel_after_first_response\n"
+              "   timeout_on_sleeping_server\n"
               "   empty_stream\n"
+              "   status_code_and_message\n"
+              "   custom_metadata\n"
               " Example: \"empty_unary:20,large_unary:10,empty_stream:70\"\n"
               " The above will execute 'empty_unary', 20% of the time,"
               " 'large_unary', 10% of the time and 'empty_stream' the remaining"
@@ -101,6 +110,10 @@
              "The choices are: 0 (GPR_LOG_SEVERITY_DEBUG), 1 "
              "(GPR_LOG_SEVERITY_INFO) and 2 (GPR_LOG_SEVERITY_ERROR)");
 
+DEFINE_bool(do_not_abort_on_transient_failures, true,
+            "If set to 'true', abort() is not called in case of transient "
+            "failures like temporary connection failures.");
+
 using grpc::testing::kTestCaseList;
 using grpc::testing::MetricsService;
 using grpc::testing::MetricsServiceImpl;
@@ -189,6 +202,12 @@
   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);
+  gpr_log(GPR_INFO, "num_channels_per_server: %d",
+          FLAGS_num_channels_per_server);
+  gpr_log(GPR_INFO, "num_stubs_per_channel: %d", FLAGS_num_stubs_per_channel);
+  gpr_log(GPR_INFO, "log_level: %d", FLAGS_log_level);
+  gpr_log(GPR_INFO, "do_not_abort_on_transient_failures: %s",
+          FLAGS_do_not_abort_on_transient_failures ? "true" : "false");
 
   int num = 0;
   for (auto it = addresses.begin(); it != addresses.end(); it++) {
@@ -272,7 +291,7 @@
            stub_idx++) {
         StressTestInteropClient* client = new StressTestInteropClient(
             ++thread_idx, *it, channel, test_selector, FLAGS_test_duration_secs,
-            FLAGS_sleep_duration_ms);
+            FLAGS_sleep_duration_ms, FLAGS_do_not_abort_on_transient_failures);
 
         bool is_already_created = false;
         // QpsGauge name
diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc
index e72cef2..c32160a 100644
--- a/test/cpp/qps/client_async.cc
+++ b/test/cpp/qps/client_async.cc
@@ -84,7 +84,8 @@
       std::function<
           std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>(
               BenchmarkService::Stub*, grpc::ClientContext*, const RequestType&,
-              CompletionQueue*)> start_req,
+              CompletionQueue*)>
+          start_req,
       std::function<void(grpc::Status, ResponseType*)> on_done)
       : context_(),
         stub_(stub),
@@ -165,7 +166,8 @@
   AsyncClient(const ClientConfig& config,
               std::function<ClientRpcContext*(
                   StubType*, std::function<gpr_timespec()> next_issue,
-                  const RequestType&)> setup_ctx,
+                  const RequestType&)>
+                  setup_ctx,
               std::function<std::unique_ptr<StubType>(std::shared_ptr<Channel>)>
                   create_stub)
       : ClientImpl<StubType, RequestType>(config, create_stub),
@@ -278,7 +280,8 @@
       std::function<std::unique_ptr<
           grpc::ClientAsyncReaderWriter<RequestType, ResponseType>>(
           BenchmarkService::Stub*, grpc::ClientContext*, CompletionQueue*,
-          void*)> start_req,
+          void*)>
+          start_req,
       std::function<void(grpc::Status, ResponseType*)> on_done)
       : context_(),
         stub_(stub),
@@ -405,7 +408,8 @@
       std::function<gpr_timespec()> next_issue,
       std::function<std::unique_ptr<grpc::GenericClientAsyncReaderWriter>(
           grpc::GenericStub*, grpc::ClientContext*,
-          const grpc::string& method_name, CompletionQueue*, void*)> start_req,
+          const grpc::string& method_name, CompletionQueue*, void*)>
+          start_req,
       std::function<void(grpc::Status, ByteBuffer*)> on_done)
       : context_(),
         stub_(stub),
diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc
index 2583ceb..04b2b45 100644
--- a/test/cpp/qps/driver.cc
+++ b/test/cpp/qps/driver.cc
@@ -83,6 +83,7 @@
       auto stub = WorkerService::NewStub(
           CreateChannel(*it, InsecureChannelCredentials()));
       grpc::ClientContext ctx;
+      ctx.set_fail_fast(false);
       CoreRequest dummy;
       CoreResponse cores;
       grpc::Status s = stub->CoreCount(&ctx, dummy, &cores);
@@ -166,6 +167,7 @@
 static ClientContext* AllocContext(list<ClientContext>* contexts) {
   contexts->emplace_back();
   auto context = &contexts->back();
+  context->set_fail_fast(false);
   return context;
 }
 
@@ -435,6 +437,7 @@
         CreateChannel(workers[i], InsecureChannelCredentials()));
     Void dummy;
     grpc::ClientContext ctx;
+    ctx.set_fail_fast(false);
     GPR_ASSERT(stub->QuitWorker(&ctx, dummy, &dummy).ok());
   }
 }
diff --git a/test/cpp/qps/gen_build_yaml.py b/test/cpp/qps/gen_build_yaml.py
index 9d6bf2a..6b3329b 100755
--- a/test/cpp/qps/gen_build_yaml.py
+++ b/test/cpp/qps/gen_build_yaml.py
@@ -43,12 +43,16 @@
 
 import performance.scenario_config as scenario_config
 
+def _scenario_json_string(scenario_json):
+  return json.dumps(scenario_config.remove_nonproto_fields(scenario_json))
+
 print yaml.dump({
   'tests': [
     {
       'name': 'json_run_localhost',
-      'shortname': 'json_run_localhost:%s' % js['name'],
-      'args': ['--scenario_json', pipes.quote(json.dumps(js))],
+      'shortname': 'json_run_localhost:%s' % scenario_json['name'],
+      'args': ['--scenario_json',
+               pipes.quote(_scenario_json_string(scenario_json))],
       'ci_platforms': ['linux', 'mac', 'posix', 'windows'],
       'platforms': ['linux', 'mac', 'posix', 'windows'],
       'flaky': False,
@@ -58,6 +62,6 @@
       'cpu_cost': 1000.0,
       'exclude_configs': []
     }
-    for js in scenario_config.CXXLanguage().scenarios()
+    for scenario_json in scenario_config.CXXLanguage().scenarios()
   ]
 })
diff --git a/test/cpp/qps/server_async.cc b/test/cpp/qps/server_async.cc
index a68f1ae..1234542 100644
--- a/test/cpp/qps/server_async.cc
+++ b/test/cpp/qps/server_async.cc
@@ -73,7 +73,8 @@
                          CompletionQueue *, ServerCompletionQueue *, void *)>
           request_streaming_function,
       std::function<grpc::Status(const PayloadConfig &, const RequestType *,
-                                 ResponseType *)> process_rpc)
+                                 ResponseType *)>
+          process_rpc)
       : Server(config) {
     char *server_address = NULL;
 
@@ -190,7 +191,8 @@
     ServerRpcContextUnaryImpl(
         std::function<void(ServerContextType *, RequestType *,
                            grpc::ServerAsyncResponseWriter<ResponseType> *,
-                           void *)> request_method,
+                           void *)>
+            request_method,
         std::function<grpc::Status(const RequestType *, ResponseType *)>
             invoke_method)
         : srv_ctx_(new ServerContextType),
diff --git a/test/distrib/csharp/DistribTest/DistribTest.csproj b/test/distrib/csharp/DistribTest/DistribTest.csproj
index 7605495..1acb34d 100644
--- a/test/distrib/csharp/DistribTest/DistribTest.csproj
+++ b/test/distrib/csharp/DistribTest/DistribTest.csproj
@@ -113,12 +113,12 @@
     <None Include="packages.config" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <Import Project="..\packages\grpc.native.csharp.__GRPC_NUGET_VERSION__\build\portable-net45+netcore45+wpa81+wp8\grpc.native.csharp.targets" Condition="Exists('..\packages\grpc.native.csharp.__GRPC_NUGET_VERSION__\build\portable-net45+netcore45+wpa81+wp8\grpc.native.csharp.targets')" />
+  <Import Project="..\packages\Grpc.Core.__GRPC_NUGET_VERSION__\build\net45\Grpc.Core.targets" Condition="Exists('..\packages\Grpc.Core.__GRPC_NUGET_VERSION__\build\net45\Grpc.Core.targets')" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
     <PropertyGroup>
       <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
     </PropertyGroup>
-    <Error Condition="!Exists('..\packages\grpc.native.csharp.__GRPC_NUGET_VERSION__\build\portable-net45+netcore45+wpa81+wp8\grpc.native.csharp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\grpc.native.csharp.__GRPC_NUGET_VERSION__\build\portable-net45+netcore45+wpa81+wp8\grpc.native.csharp.targets'))" />
+    <Error Condition="!Exists('..\packages\Grpc.Core.__GRPC_NUGET_VERSION__\build\net45\Grpc.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Grpc.Core.__GRPC_NUGET_VERSION__\build\net45\Grpc.Core.targets'))" />
     <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
   </Target>
   <Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
@@ -129,4 +129,4 @@
   <Target Name="AfterBuild">
   </Target>
   -->
-</Project>
\ No newline at end of file
+</Project>
diff --git a/test/distrib/csharp/DistribTest/packages.config b/test/distrib/csharp/DistribTest/packages.config
index aca09f6..6963019 100644
--- a/test/distrib/csharp/DistribTest/packages.config
+++ b/test/distrib/csharp/DistribTest/packages.config
@@ -6,11 +6,10 @@
   <package id="Grpc" version="__GRPC_NUGET_VERSION__" targetFramework="net45" />
   <package id="Grpc.Auth" version="__GRPC_NUGET_VERSION__" targetFramework="net45" />
   <package id="Grpc.Core" version="__GRPC_NUGET_VERSION__" targetFramework="net45" />
-  <package id="grpc.native.csharp" version="__GRPC_NUGET_VERSION__" targetFramework="net45" />
   <package id="Ix-Async" version="1.2.3" targetFramework="net45" />
   <package id="Microsoft.Bcl" version="1.1.10" targetFramework="net45" />
   <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net45" />
   <package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net45" />
   <package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net45" />
   <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
-</packages>
\ No newline at end of file
+</packages>
diff --git a/test/distrib/python/run_distrib_test.sh b/test/distrib/python/run_distrib_test.sh
index 79893af..8a983bc 100755
--- a/test/distrib/python/run_distrib_test.sh
+++ b/test/distrib/python/run_distrib_test.sh
@@ -33,8 +33,8 @@
 cd $(dirname $0)
 
 # Pick up the source dist archive whatever its version is
-SDIST_ARCHIVE=$EXTERNAL_GIT_ROOT/input_artifacts/grpcio-*.tar.gz
-BDIST_DIR="file://$EXTERNAL_GIT_ROOT/input_artifacts"
+BDIST_ARCHIVES=$EXTERNAL_GIT_ROOT/input_artifacts/grpcio-*.whl
+TOOLS_BDIST_ARCHIVES=$EXTERNAL_GIT_ROOT/input_artifacts/grpcio_tools-*.whl
 
 if [ ! -f ${SDIST_ARCHIVE} ]
 then
@@ -42,17 +42,25 @@
   exit 1
 fi
 
-PIP=pip2
-which $PIP || PIP=pip
 PYTHON=python2
+PIP=pip2
 which $PYTHON || PYTHON=python
+which $PIP || PIP=pip
 
 # TODO(jtattermusch): this shouldn't be required
-$PIP install --upgrade six
+# TODO(jtattermusch): run the command twice to workaround docker-on-overlay
+# issue https://github.com/docker/docker/issues/12327
+# (first attempt will fail when using docker with overlayFS)
+${PIP} install --upgrade six pip || ${PIP} install --upgrade six pip
 
-GRPC_PYTHON_BINARIES_REPOSITORY="${BDIST_DIR}" \
-    $PIP install \
-    ${SDIST_ARCHIVE}
+# At least one of the bdist packages has to succeed (whichever one matches the
+# test machine, anyway).
+for bdist in ${BDIST_ARCHIVES} ${TOOLS_BDIST_ARCHIVES}; do
+  ($PYTHON -m pip install $bdist) || true
+done
+
+# TODO(jtattermusch): add a .proto file to the distribtest, generate python
+# code from it and then use the generated code from distribtest.py
+$PYTHON -m grpc.tools.protoc
 
 $PYTHON distribtest.py
-
diff --git a/third_party/objective_c/Cronet/cronet_c_for_grpc.h b/third_party/objective_c/Cronet/cronet_c_for_grpc.h
new file mode 100644
index 0000000..15a511a
--- /dev/null
+++ b/third_party/objective_c/Cronet/cronet_c_for_grpc.h
@@ -0,0 +1,202 @@
+// 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/third_party/protobuf b/third_party/protobuf
index d5fb408..a1938b2 160000
--- a/third_party/protobuf
+++ b/third_party/protobuf
@@ -1 +1 @@
-Subproject commit d5fb408ddc281ffcadeb08699e65bb694656d0bd
+Subproject commit a1938b2aa9ca86ce7ce50c27ff9737c1008d2a03
diff --git a/tools/buildgen/plugins/list_api.py b/tools/buildgen/plugins/list_api.py
index ff937a0..1fc4f41 100755
--- a/tools/buildgen/plugins/list_api.py
+++ b/tools/buildgen/plugins/list_api.py
@@ -64,12 +64,13 @@
 
 def mako_plugin(dictionary):
   apis = []
+  headers = []
 
-#  for lib in dictionary['libs']:
-#    if lib['name'] == 'grpc':
-#      apis.extend(list_c_apis(lib['public_headers']))
-  apis.extend(list_c_apis(sorted(headers_under('include/grpc'))))
+  for lib in dictionary['libs']:
+    if lib['name'] in ['grpc', 'gpr']:
+      headers.extend(lib['public_headers'])
 
+  apis.extend(list_c_apis(sorted(set(headers))))
   dictionary['c_apis'] = apis
 
 
diff --git a/tools/buildgen/plugins/make_fuzzer_tests.py b/tools/buildgen/plugins/make_fuzzer_tests.py
index 9d00069..7c6fd53 100644
--- a/tools/buildgen/plugins/make_fuzzer_tests.py
+++ b/tools/buildgen/plugins/make_fuzzer_tests.py
@@ -50,6 +50,7 @@
               'name': new_target['name'],
               'args': [fn],
               'exclude_configs': [],
+              'uses_polling': False,
               'platforms': ['linux'],
               'ci_platforms': ['linux'],
               'flaky': False,
diff --git a/tools/codegen/core/gen_header_frame.py b/tools/codegen/core/gen_header_frame.py
index 96e6c67..ee47626 100755
--- a/tools/codegen/core/gen_header_frame.py
+++ b/tools/codegen/core/gen_header_frame.py
@@ -38,6 +38,8 @@
 import json
 import sys
 
+set_end_stream = len(sys.argv) > 1 and sys.argv[1] == '--set_end_stream'
+
 # parse input, fill in vals
 vals = []
 for line in sys.stdin:
@@ -65,6 +67,9 @@
   payload_bytes.append(payload_line)
 
 # fill in header
+flags = 0x04  # END_HEADERS
+if set_end_stream:
+  flags |= 0x01  # END_STREAM
 payload_bytes[0].extend([
     (payload_len >> 16) & 0xff,
     (payload_len >> 8) & 0xff,
@@ -72,7 +77,7 @@
     # header frame
     0x01,
     # flags
-    0x04,
+    flags,
     # stream id
     0x00,
     0x00,
diff --git a/tools/codegen/core/gen_nano_proto.sh b/tools/codegen/core/gen_nano_proto.sh
index e2d2f67..b216a20 100755
--- a/tools/codegen/core/gen_nano_proto.sh
+++ b/tools/codegen/core/gen_nano_proto.sh
@@ -29,11 +29,11 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#
 # Example usage:
 #   tools/codegen/core/gen_nano_proto.sh \
-#     src/proto/grpc/lb/v0/load_balancer.proto
-#     $PWD/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0
+#     src/proto/grpc/lb/v1/load_balancer.proto \
+#     $PWD/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1 \
+#     src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1
 #
 # Exit statuses:
 # 1: Incorrect number of arguments
diff --git a/tools/distrib/check_include_guards.py b/tools/distrib/check_include_guards.py
index 897a899..8207f5c 100755
--- a/tools/distrib/check_include_guards.py
+++ b/tools/distrib/check_include_guards.py
@@ -31,6 +31,7 @@
 
 import argparse
 import os
+import os.path
 import re
 import sys
 import subprocess
@@ -169,7 +170,7 @@
 args = argp.parse_args()
 
 KNOWN_BAD = set([
-    'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h',
+    'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h',
 ])
 
 
@@ -187,6 +188,8 @@
 try:
   filename_list = subprocess.check_output(FILE_LIST_COMMAND,
                                           shell=True).splitlines()
+  # Filter out non-existent files (ie, file removed or renamed)
+  filename_list = (f for f in filename_list if os.path.isfile(f))
 except subprocess.CalledProcessError:
   sys.exit(0)
 
diff --git a/tools/distrib/check_nanopb_output.sh b/tools/distrib/check_nanopb_output.sh
index 92cb8ec..c070705 100755
--- a/tools/distrib/check_nanopb_output.sh
+++ b/tools/distrib/check_nanopb_output.sh
@@ -58,15 +58,15 @@
 #
 # Checks for load_balancer.proto
 #
-readonly LOAD_BALANCER_GRPC_OUTPUT_PATH='src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0'
+readonly LOAD_BALANCER_GRPC_OUTPUT_PATH='src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1'
 # nanopb-compile the proto to a temp location
 ./tools/codegen/core/gen_nano_proto.sh \
-  src/proto/grpc/lb/v0/load_balancer.proto \
+  src/proto/grpc/lb/v1/load_balancer.proto \
   "$NANOPB_TMP_OUTPUT" \
   "$LOAD_BALANCER_GRPC_OUTPUT_PATH"
 
 # compare outputs to checked compiled code
-if ! diff -r $NANOPB_TMP_OUTPUT src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0; then
+if ! diff -r $NANOPB_TMP_OUTPUT src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1; then
   echo "Outputs differ: $NANOPB_TMP_OUTPUT vs $LOAD_BALANCER_GRPC_OUTPUT_PATH"
   exit 2
 fi
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/distrib/python/bazel_deps.sh
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/distrib/python/bazel_deps.sh
index 2fc66c2..de3ee07 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/distrib/python/bazel_deps.sh
@@ -1,5 +1,6 @@
 #!/bin/bash
-# Copyright 2015, Google Inc.
+
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +28,19 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+cd $(dirname $0)/../../../
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
-
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+# First check if bazel is installed on the machine. If it is, then we don't need
+# to invoke the docker bazel.
+if [ "bazel version" ]
+then
+  cd third_party/protobuf
+  bazel query 'deps('$1')'
+else
+  docker build -t bazel `realpath ./tools/dockerfile/bazel/`
+  docker run -v "`realpath .`:/src/grpc/"          \
+    -w /src/grpc/third_party/protobuf              \
+    bazel                                          \
+    bazel query 'deps('$1')'
+fi
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/distrib/python/check_grpcio_tools.py
similarity index 61%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/distrib/python/check_grpcio_tools.py
index 2fc66c2..baf2ff4 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/distrib/python/check_grpcio_tools.py
@@ -1,4 +1,5 @@
-#!/bin/bash
+#!/usr/bin/env python
+
 # Copyright 2015, Google Inc.
 # All rights reserved.
 #
@@ -27,41 +28,18 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+import cStringIO
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+import make_grpcio_tools as make
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
+OUT_OF_DATE_MESSAGE = """file {} is out of date
 
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
+Have you called tools/distrib/python/make_grpcio_tools.py since upgrading protobuf?"""
 
-mkdir -p reports
+check_protoc_lib_deps_content = make.get_deps(make.BAZEL_DEPS_PROTOC_LIB_QUERY)
 
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+with open(make.GRPC_PYTHON_PROTOC_LIB_DEPS, 'r') as protoc_lib_deps_file:
+  if protoc_lib_deps_file.read() != check_protoc_lib_deps_content:
+    print(OUT_OF_DATE_MESSAGE.format(make.GRPC_PYTHON_PROTOC_LIB_DEPS))
+    raise SystemExit(1)
diff --git a/tools/distrib/python/grpcio_tools/.gitignore b/tools/distrib/python/grpcio_tools/.gitignore
new file mode 100644
index 0000000..979704d
--- /dev/null
+++ b/tools/distrib/python/grpcio_tools/.gitignore
@@ -0,0 +1,7 @@
+build/
+protobuf/
+grpc_plugin/
+grpc_root/
+*.c
+*.cpp
+*.egg-info
diff --git a/tools/distrib/python/grpcio_tools/MANIFEST.in b/tools/distrib/python/grpcio_tools/MANIFEST.in
new file mode 100644
index 0000000..7712834
--- /dev/null
+++ b/tools/distrib/python/grpcio_tools/MANIFEST.in
@@ -0,0 +1,7 @@
+include grpc_version.py
+include protoc_deps.py
+include protoc_lib_deps.py
+include README.rst
+graft grpc
+graft grpc_root
+graft third_party
diff --git a/tools/distrib/python/grpcio_tools/README.rst b/tools/distrib/python/grpcio_tools/README.rst
new file mode 100644
index 0000000..10d2fe8
--- /dev/null
+++ b/tools/distrib/python/grpcio_tools/README.rst
@@ -0,0 +1,128 @@
+gRPC Python Tools
+=================
+
+Package for gRPC Python tools.
+
+Installation
+------------
+
+The gRPC Python tools package is available for Linux, Mac OS X, and Windows
+running Python 2.7.
+
+From PyPI
+~~~~~~~~~
+
+If you are installing locally...
+
+::
+
+  $ pip install grpcio-tools
+
+Else system wide (on Ubuntu)...
+
+::
+
+  $ sudo pip install grpcio-tools
+
+If you're on Windows make sure that you installed the :code:`pip.exe` component
+when you installed Python (if not go back and install it!) then invoke:
+
+::
+
+  $ pip.exe install grpcio-tools
+
+Windows users may need to invoke :code:`pip.exe` from a command line ran as
+administrator.
+
+n.b. On Windows and on Mac OS X one *must* have a recent release of :code:`pip`
+to retrieve the proper wheel from PyPI. Be sure to upgrade to the latest
+version!
+
+You might also need to install Cython to handle installation via the source
+distribution if gRPC Python's system coverage with wheels does not happen to
+include your system.
+
+From Source
+~~~~~~~~~~~
+
+Building from source requires that you have the Python headers (usually a
+package named :code:`python-dev`) and Cython installed. It further requires a
+GCC-like compiler to go smoothly; you can probably get it to work without
+GCC-like stuff, but you may end up having a bad time.
+
+::
+
+  $ export REPO_ROOT=grpc  # REPO_ROOT can be any directory of your choice
+  $ git clone https://github.com/grpc/grpc.git $REPO_ROOT
+  $ cd $REPO_ROOT
+  $ git submodule update --init
+
+  $ cd tools/distrib/python/grpcio_tools
+  $ python ../make_grpcio_tools.py
+
+  # For the next command do `sudo pip install` if you get permission-denied errors
+  $ pip install .
+
+You cannot currently install Python from source on Windows. Things might work
+out for you in MSYS2 (follow the Linux instructions), but it isn't officially
+supported at the moment.
+
+Troubleshooting
+~~~~~~~~~~~~~~~
+
+Help, I ...
+
+* **... see a** :code:`pkg_resources.VersionConflict` **when I try to install
+  grpc**
+
+  This is likely because :code:`pip` doesn't own the offending dependency,
+  which in turn is likely because your operating system's package manager owns
+  it. You'll need to force the installation of the dependency:
+
+  :code:`pip install --ignore-installed $OFFENDING_DEPENDENCY`
+
+  For example, if you get an error like the following:
+
+  ::
+
+    Traceback (most recent call last):
+    File "<string>", line 17, in <module>
+     ...
+    File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 509, in find
+      raise VersionConflict(dist, req)
+    pkg_resources.VersionConflict: (six 1.8.0 (/usr/lib/python2.7/dist-packages), Requirement.parse('six>=1.10'))
+
+  You can fix it by doing:
+
+  ::
+
+    sudo pip install --ignore-installed six
+
+* **... see compiler errors on some platforms when either installing from source or from the source distribution**
+
+  If you see
+
+  ::
+
+    /tmp/pip-build-U8pSsr/cython/Cython/Plex/Scanners.c:4:20: fatal error: Python.h: No such file or directory
+    #include "Python.h"
+                    ^
+    compilation terminated.
+
+  You can fix it by installing `python-dev` package. i.e
+
+  ::
+
+    sudo apt-get install python-dev
+
+  If you see something similar to:
+
+  ::
+
+    third_party/protobuf/src/google/protobuf/stubs/mathlimits.h:173:31: note: in expansion of macro 'SIGNED_INT_MAX'
+    static const Type kPosMax = SIGNED_INT_MAX(Type); \\
+                               ^
+  And your toolchain is GCC (at the time of this writing, up through at least
+  GCC 6.0), this is probably a bug where GCC chokes on constant expressions
+  when the :code:`-fwrapv` flag is specified. You should consider setting your
+  environment with :code:`CFLAGS=-fno-wrapv` or using clang (:code:`CC=clang`).
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/distrib/python/grpcio_tools/grpc/__init__.py
old mode 100755
new mode 100644
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/distrib/python/grpcio_tools/grpc/__init__.py
index 2fc66c2..70ac5ed
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/distrib/python/grpcio_tools/grpc/__init__.py
@@ -1,5 +1,4 @@
-#!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +26,5 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
-
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
-
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+__import__('pkg_resources').declare_namespace(__name__)
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/distrib/python/grpcio_tools/grpc/tools/__init__.py
old mode 100755
new mode 100644
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/distrib/python/grpcio_tools/grpc/tools/__init__.py
index 2fc66c2..d5ad73a
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/distrib/python/grpcio_tools/grpc/tools/__init__.py
@@ -1,5 +1,4 @@
-#!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +26,4 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
-
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
-
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
diff --git a/tools/distrib/python/grpcio_tools/grpc/tools/main.cc b/tools/distrib/python/grpcio_tools/grpc/tools/main.cc
new file mode 100644
index 0000000..81675b4
--- /dev/null
+++ b/tools/distrib/python/grpcio_tools/grpc/tools/main.cc
@@ -0,0 +1,54 @@
+// 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 <google/protobuf/compiler/command_line_interface.h>
+#include <google/protobuf/compiler/python/python_generator.h>
+
+#include "src/compiler/python_generator.h"
+
+#include "grpc/tools/main.h"
+
+int protoc_main(int argc, char* argv[]) {
+  google::protobuf::compiler::CommandLineInterface cli;
+  cli.AllowPlugins("protoc-");
+
+  // Proto2 Python
+  google::protobuf::compiler::python::Generator py_generator;
+  cli.RegisterGenerator("--python_out", &py_generator,
+                        "Generate Python source file.");
+
+  // gRPC Python
+  grpc_python_generator::GeneratorConfiguration grpc_py_config;
+  grpc_py_config.beta_package_root = "grpc.beta";
+  grpc_python_generator::PythonGrpcGenerator grpc_py_generator(grpc_py_config);
+  cli.RegisterGenerator("--grpc_python_out", &grpc_py_generator,
+                        "Generate Python source file.");
+
+  return cli.Run(argc, argv);
+}
diff --git a/tools/distrib/python/grpcio_tools/grpc/tools/main.h b/tools/distrib/python/grpcio_tools/grpc/tools/main.h
new file mode 100644
index 0000000..ea2860f
--- /dev/null
+++ b/tools/distrib/python/grpcio_tools/grpc/tools/main.h
@@ -0,0 +1,33 @@
+// 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.
+
+
+// We declare `protoc_main` here since we want access to it from Cython as an
+// extern but *without* triggering a dllimport declspec when on Windows.
+int protoc_main(int argc, char *argv[]);
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/distrib/python/grpcio_tools/grpc/tools/protoc.py
old mode 100755
new mode 100644
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/distrib/python/grpcio_tools/grpc/tools/protoc.py
index 2fc66c2..b4dd0ec
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/distrib/python/grpcio_tools/grpc/tools/protoc.py
@@ -1,5 +1,6 @@
-#!/bin/bash
-# Copyright 2015, Google Inc.
+#!/usr/bin/env python
+
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +28,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.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+import sys
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+from grpc.tools import protoc_compiler
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
 
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+if __name__ == '__main__':
+  protoc_compiler.run_main(sys.argv)
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/distrib/python/grpcio_tools/grpc/tools/protoc_compiler.pyx
old mode 100755
new mode 100644
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/distrib/python/grpcio_tools/grpc/tools/protoc_compiler.pyx
index 2fc66c2..a653012
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/distrib/python/grpcio_tools/grpc/tools/protoc_compiler.pyx
@@ -1,5 +1,4 @@
-#!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +26,14 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+from libc cimport stdlib
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+cdef extern from "grpc/tools/main.h":
+  int protoc_main(int argc, char *argv[])
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+def run_main(list args not None):
+  cdef char **argv = <char **>stdlib.malloc(len(args)*sizeof(char *))
+  for i in range(len(args)):
+    argv[i] = args[i]
+  return protoc_main(len(args), argv)
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/distrib/python/grpcio_tools/grpc_version.py
old mode 100755
new mode 100644
similarity index 61%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/distrib/python/grpcio_tools/grpc_version.py
index 2fc66c2..1267d0e
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/distrib/python/grpcio_tools/grpc_version.py
@@ -1,4 +1,3 @@
-#!/bin/bash
 # Copyright 2015, Google Inc.
 # All rights reserved.
 #
@@ -27,41 +26,7 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+# AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!!
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
-
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+VERSION='0.15.0.dev0'
diff --git a/tools/distrib/python/grpcio_tools/protoc_lib_deps.py b/tools/distrib/python/grpcio_tools/protoc_lib_deps.py
new file mode 100644
index 0000000..135ac5c
--- /dev/null
+++ b/tools/distrib/python/grpcio_tools/protoc_lib_deps.py
@@ -0,0 +1,32 @@
+
+# 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.
+
+# AUTO-GENERATED BY make_grpcio_tools.py!
+CC_FILES=['google/protobuf/compiler/zip_writer.cc', 'google/protobuf/compiler/subprocess.cc', 'google/protobuf/compiler/ruby/ruby_generator.cc', 'google/protobuf/compiler/python/python_generator.cc', 'google/protobuf/compiler/plugin.pb.cc', 'google/protobuf/compiler/plugin.cc', 'google/protobuf/compiler/objectivec/objectivec_primitive_field.cc', 'google/protobuf/compiler/objectivec/objectivec_oneof.cc', 'google/protobuf/compiler/objectivec/objectivec_message_field.cc', 'google/protobuf/compiler/objectivec/objectivec_message.cc', 'google/protobuf/compiler/objectivec/objectivec_map_field.cc', 'google/protobuf/compiler/objectivec/objectivec_helpers.cc', 'google/protobuf/compiler/objectivec/objectivec_generator.cc', 'google/protobuf/compiler/objectivec/objectivec_file.cc', 'google/protobuf/compiler/objectivec/objectivec_field.cc', 'google/protobuf/compiler/objectivec/objectivec_extension.cc', 'google/protobuf/compiler/objectivec/objectivec_enum_field.cc', 'google/protobuf/compiler/objectivec/objectivec_enum.cc', 'google/protobuf/compiler/js/js_generator.cc', 'google/protobuf/compiler/javanano/javanano_primitive_field.cc', 'google/protobuf/compiler/javanano/javanano_message_field.cc', 'google/protobuf/compiler/javanano/javanano_message.cc', 'google/protobuf/compiler/javanano/javanano_map_field.cc', 'google/protobuf/compiler/javanano/javanano_helpers.cc', 'google/protobuf/compiler/javanano/javanano_generator.cc', 'google/protobuf/compiler/javanano/javanano_file.cc', 'google/protobuf/compiler/javanano/javanano_field.cc', 'google/protobuf/compiler/javanano/javanano_extension.cc', 'google/protobuf/compiler/javanano/javanano_enum_field.cc', 'google/protobuf/compiler/javanano/javanano_enum.cc', 'google/protobuf/compiler/java/java_string_field_lite.cc', 'google/protobuf/compiler/java/java_string_field.cc', 'google/protobuf/compiler/java/java_shared_code_generator.cc', 'google/protobuf/compiler/java/java_service.cc', 'google/protobuf/compiler/java/java_primitive_field_lite.cc', 'google/protobuf/compiler/java/java_primitive_field.cc', 'google/protobuf/compiler/java/java_name_resolver.cc', 'google/protobuf/compiler/java/java_message_lite.cc', 'google/protobuf/compiler/java/java_message_field_lite.cc', 'google/protobuf/compiler/java/java_message_field.cc', 'google/protobuf/compiler/java/java_message_builder_lite.cc', 'google/protobuf/compiler/java/java_message_builder.cc', 'google/protobuf/compiler/java/java_message.cc', 'google/protobuf/compiler/java/java_map_field_lite.cc', 'google/protobuf/compiler/java/java_map_field.cc', 'google/protobuf/compiler/java/java_lazy_message_field_lite.cc', 'google/protobuf/compiler/java/java_lazy_message_field.cc', 'google/protobuf/compiler/java/java_helpers.cc', 'google/protobuf/compiler/java/java_generator_factory.cc', 'google/protobuf/compiler/java/java_generator.cc', 'google/protobuf/compiler/java/java_file.cc', 'google/protobuf/compiler/java/java_field.cc', 'google/protobuf/compiler/java/java_extension_lite.cc', 'google/protobuf/compiler/java/java_extension.cc', 'google/protobuf/compiler/java/java_enum_lite.cc', 'google/protobuf/compiler/java/java_enum_field_lite.cc', 'google/protobuf/compiler/java/java_enum_field.cc', 'google/protobuf/compiler/java/java_enum.cc', 'google/protobuf/compiler/java/java_doc_comment.cc', 'google/protobuf/compiler/java/java_context.cc', 'google/protobuf/compiler/csharp/csharp_wrapper_field.cc', 'google/protobuf/compiler/csharp/csharp_source_generator_base.cc', 'google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc', 'google/protobuf/compiler/csharp/csharp_repeated_message_field.cc', 'google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc', 'google/protobuf/compiler/csharp/csharp_reflection_class.cc', 'google/protobuf/compiler/csharp/csharp_primitive_field.cc', 'google/protobuf/compiler/csharp/csharp_message_field.cc', 'google/protobuf/compiler/csharp/csharp_message.cc', 'google/protobuf/compiler/csharp/csharp_map_field.cc', 'google/protobuf/compiler/csharp/csharp_helpers.cc', 'google/protobuf/compiler/csharp/csharp_generator.cc', 'google/protobuf/compiler/csharp/csharp_field_base.cc', 'google/protobuf/compiler/csharp/csharp_enum_field.cc', 'google/protobuf/compiler/csharp/csharp_enum.cc', 'google/protobuf/compiler/csharp/csharp_doc_comment.cc', 'google/protobuf/compiler/cpp/cpp_string_field.cc', 'google/protobuf/compiler/cpp/cpp_service.cc', 'google/protobuf/compiler/cpp/cpp_primitive_field.cc', 'google/protobuf/compiler/cpp/cpp_message_field.cc', 'google/protobuf/compiler/cpp/cpp_message.cc', 'google/protobuf/compiler/cpp/cpp_map_field.cc', 'google/protobuf/compiler/cpp/cpp_helpers.cc', 'google/protobuf/compiler/cpp/cpp_generator.cc', 'google/protobuf/compiler/cpp/cpp_file.cc', 'google/protobuf/compiler/cpp/cpp_field.cc', 'google/protobuf/compiler/cpp/cpp_extension.cc', 'google/protobuf/compiler/cpp/cpp_enum_field.cc', 'google/protobuf/compiler/cpp/cpp_enum.cc', 'google/protobuf/compiler/command_line_interface.cc', 'google/protobuf/compiler/code_generator.cc', 'google/protobuf/wrappers.pb.cc', 'google/protobuf/wire_format.cc', 'google/protobuf/util/type_resolver_util.cc', 'google/protobuf/util/time_util.cc', 'google/protobuf/util/message_differencer.cc', 'google/protobuf/util/json_util.cc', 'google/protobuf/util/internal/utility.cc', 'google/protobuf/util/internal/type_info_test_helper.cc', 'google/protobuf/util/internal/type_info.cc', 'google/protobuf/util/internal/protostream_objectwriter.cc', 'google/protobuf/util/internal/protostream_objectsource.cc', 'google/protobuf/util/internal/proto_writer.cc', 'google/protobuf/util/internal/object_writer.cc', 'google/protobuf/util/internal/json_stream_parser.cc', 'google/protobuf/util/internal/json_objectwriter.cc', 'google/protobuf/util/internal/json_escaping.cc', 'google/protobuf/util/internal/field_mask_utility.cc', 'google/protobuf/util/internal/error_listener.cc', 'google/protobuf/util/internal/default_value_objectwriter.cc', 'google/protobuf/util/internal/datapiece.cc', 'google/protobuf/util/field_mask_util.cc', 'google/protobuf/util/field_comparator.cc', 'google/protobuf/unknown_field_set.cc', 'google/protobuf/type.pb.cc', 'google/protobuf/timestamp.pb.cc', 'google/protobuf/text_format.cc', 'google/protobuf/stubs/substitute.cc', 'google/protobuf/stubs/mathlimits.cc', 'google/protobuf/struct.pb.cc', 'google/protobuf/source_context.pb.cc', 'google/protobuf/service.cc', 'google/protobuf/reflection_ops.cc', 'google/protobuf/message.cc', 'google/protobuf/map_field.cc', 'google/protobuf/io/zero_copy_stream_impl.cc', 'google/protobuf/io/tokenizer.cc', 'google/protobuf/io/strtod.cc', 'google/protobuf/io/printer.cc', 'google/protobuf/io/gzip_stream.cc', 'google/protobuf/generated_message_reflection.cc', 'google/protobuf/field_mask.pb.cc', 'google/protobuf/extension_set_heavy.cc', 'google/protobuf/empty.pb.cc', 'google/protobuf/dynamic_message.cc', 'google/protobuf/duration.pb.cc', 'google/protobuf/descriptor_database.cc', 'google/protobuf/descriptor.pb.cc', 'google/protobuf/descriptor.cc', 'google/protobuf/compiler/parser.cc', 'google/protobuf/compiler/importer.cc', 'google/protobuf/api.pb.cc', 'google/protobuf/any.pb.cc', 'google/protobuf/any.cc', 'google/protobuf/wire_format_lite.cc', 'google/protobuf/stubs/time.cc', 'google/protobuf/stubs/strutil.cc', 'google/protobuf/stubs/structurally_valid.cc', 'google/protobuf/stubs/stringprintf.cc', 'google/protobuf/stubs/stringpiece.cc', 'google/protobuf/stubs/statusor.cc', 'google/protobuf/stubs/status.cc', 'google/protobuf/stubs/once.cc', 'google/protobuf/stubs/int128.cc', 'google/protobuf/stubs/common.cc', 'google/protobuf/stubs/bytestream.cc', 'google/protobuf/stubs/atomicops_internals_x86_msvc.cc', 'google/protobuf/stubs/atomicops_internals_x86_gcc.cc', 'google/protobuf/repeated_field.cc', 'google/protobuf/message_lite.cc', 'google/protobuf/io/zero_copy_stream_impl_lite.cc', 'google/protobuf/io/zero_copy_stream.cc', 'google/protobuf/io/coded_stream.cc', 'google/protobuf/generated_message_util.cc', 'google/protobuf/extension_set.cc', 'google/protobuf/arenastring.cc', 'google/protobuf/arena.cc']
diff --git a/tools/distrib/python/grpcio_tools/setup.py b/tools/distrib/python/grpcio_tools/setup.py
new file mode 100644
index 0000000..576f7ae
--- /dev/null
+++ b/tools/distrib/python/grpcio_tools/setup.py
@@ -0,0 +1,96 @@
+# 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.
+
+from distutils import extension
+import os
+import os.path
+import shlex
+import sys
+
+import setuptools
+from setuptools.command import build_ext
+
+# TODO(atash) add flag to disable Cython use
+
+os.chdir(os.path.dirname(os.path.abspath(__file__)))
+sys.path.insert(0, os.path.abspath('.'))
+
+# There are some situations (like on Windows) where CC, CFLAGS, and LDFLAGS are
+# entirely ignored/dropped/forgotten by distutils and its Cygwin/MinGW support.
+# We use these environment variables to thus get around that without locking
+# ourselves in w.r.t. the multitude of operating systems this ought to build on.
+# By default we assume a GCC-like compiler.
+EXTRA_COMPILE_ARGS = shlex.split(os.environ.get('GRPC_PYTHON_CFLAGS',
+                                                '-frtti -std=c++11'))
+EXTRA_LINK_ARGS = shlex.split(os.environ.get('GRPC_PYTHON_LDFLAGS',
+                                             '-lpthread'))
+
+import protoc_lib_deps
+import grpc_version
+
+def protoc_ext_module():
+  plugin_sources = [
+      'grpc/tools/main.cc',
+      'grpc_root/src/compiler/python_generator.cc'] + [
+      os.path.join('third_party/protobuf/src', cc_file)
+      for cc_file in protoc_lib_deps.CC_FILES]
+  plugin_ext = extension.Extension(
+      name='grpc.tools.protoc_compiler',
+      sources=['grpc/tools/protoc_compiler.pyx'] + plugin_sources,
+      include_dirs=[
+          '.',
+          'grpc_root',
+          'grpc_root/include',
+          'third_party/protobuf/src',
+      ],
+      language='c++',
+      define_macros=[('HAVE_PTHREAD', 1)],
+      extra_compile_args=EXTRA_COMPILE_ARGS,
+      extra_link_args=EXTRA_LINK_ARGS,
+  )
+  return plugin_ext
+
+def maybe_cythonize(exts):
+  from Cython import Build
+  return Build.cythonize(exts)
+
+setuptools.setup(
+  name='grpcio_tools',
+  version=grpc_version.VERSION,
+  license='3-clause BSD',
+  ext_modules=maybe_cythonize([
+      protoc_ext_module(),
+  ]),
+  packages=setuptools.find_packages('.'),
+  # TODO(atash): Figure out why auditwheel doesn't like namespace packages.
+  #namespace_packages=['grpc'],
+  install_requires=[
+    'protobuf>=3.0.0a3',
+  ],
+)
diff --git a/tools/distrib/python/make_grpcio_tools.py b/tools/distrib/python/make_grpcio_tools.py
new file mode 100755
index 0000000..50fbdbb
--- /dev/null
+++ b/tools/distrib/python/make_grpcio_tools.py
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+
+# 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 os
+import os.path
+import shutil
+import subprocess
+import sys
+import traceback
+
+DEPS_FILE_CONTENT="""
+# 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.
+
+# AUTO-GENERATED BY make_grpcio_tools.py!
+CC_FILES={}
+"""
+
+# Bazel query result prefix for expected source files in protobuf.
+PROTOBUF_CC_PREFIX = '//:src/'
+
+GRPC_ROOT = os.path.abspath(
+    os.path.join(os.path.dirname(os.path.abspath(__file__)),
+                 '..', '..', '..'))
+
+GRPC_PYTHON_ROOT = os.path.join(GRPC_ROOT, 'tools/distrib/python/grpcio_tools')
+
+GRPC_PROTOBUF = os.path.join(GRPC_ROOT, 'third_party/protobuf/src')
+GRPC_PROTOC_PLUGINS = os.path.join(GRPC_ROOT, 'src/compiler')
+GRPC_PYTHON_PROTOBUF = os.path.join(GRPC_PYTHON_ROOT,
+                                    'third_party/protobuf/src')
+GRPC_PYTHON_PROTOC_PLUGINS = os.path.join(GRPC_PYTHON_ROOT,
+                                          'grpc_root/src/compiler')
+GRPC_PYTHON_PROTOC_LIB_DEPS = os.path.join(GRPC_PYTHON_ROOT,
+                                           'protoc_lib_deps.py')
+
+GRPC_INCLUDE = os.path.join(GRPC_ROOT, 'include')
+GRPC_PYTHON_INCLUDE = os.path.join(GRPC_PYTHON_ROOT, 'grpc_root/include')
+
+BAZEL_DEPS = os.path.join(GRPC_ROOT, 'tools/distrib/python/bazel_deps.sh')
+BAZEL_DEPS_PROTOC_LIB_QUERY = '//:protoc_lib'
+
+
+def get_deps(query):
+  """Write the result of the bazel query `query` against protobuf to
+     `out_file`."""
+  output = subprocess.check_output([BAZEL_DEPS, query])
+  output = output.splitlines()
+  cc_files = [
+      name for name in output
+      if name.endswith('.cc') and name.startswith(PROTOBUF_CC_PREFIX)]
+  cc_files = [cc_file[len(PROTOBUF_CC_PREFIX):] for cc_file in cc_files]
+  deps_file_content = DEPS_FILE_CONTENT.format(cc_files)
+  return deps_file_content
+
+
+def main():
+  os.chdir(GRPC_ROOT)
+
+  for tree in [GRPC_PYTHON_PROTOBUF,
+               GRPC_PYTHON_PROTOC_PLUGINS,
+               GRPC_PYTHON_INCLUDE]:
+    try:
+      shutil.rmtree(tree)
+    except Exception as _:
+      pass
+  shutil.copytree(GRPC_PROTOBUF, GRPC_PYTHON_PROTOBUF)
+  shutil.copytree(GRPC_PROTOC_PLUGINS, GRPC_PYTHON_PROTOC_PLUGINS)
+  shutil.copytree(GRPC_INCLUDE, GRPC_PYTHON_INCLUDE)
+
+  try:
+    protoc_lib_deps_content = get_deps(BAZEL_DEPS_PROTOC_LIB_QUERY)
+  except Exception as error:
+    # We allow this script to succeed even if we couldn't get the dependencies,
+    # as then we can assume that even without a successful bazel run the
+    # dependencies currently in source control are 'good enough'.
+    sys.stderr.write("Got non-fatal error:\n")
+    traceback.print_exc(file=sys.stderr)
+    return
+  # If we successfully got the dependencies, truncate and rewrite the deps file.
+  with open(GRPC_PYTHON_PROTOC_LIB_DEPS, 'w') as deps_file:
+    deps_file.write(protoc_lib_deps_content)
+
+if __name__ == '__main__':
+  main()
+
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/dockerfile/bazel/Dockerfile
old mode 100755
new mode 100644
similarity index 61%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/dockerfile/bazel/Dockerfile
index 2fc66c2..2a80a4d
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/dockerfile/bazel/Dockerfile
@@ -1,4 +1,3 @@
-#!/bin/bash
 # Copyright 2015, Google Inc.
 # All rights reserved.
 #
@@ -27,41 +26,27 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+FROM ubuntu:wily
+RUN apt-get update
+RUN apt-get -y install software-properties-common python-software-properties
+RUN add-apt-repository ppa:webupd8team/java
+RUN apt-get update
+RUN apt-get -y install \
+	vim            \
+	wget           \
+	openjdk-8-jdk  \
+	pkg-config     \
+	zip            \
+	g++            \
+	zlib1g-dev     \
+	unzip          \
+	git
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+RUN git clone https://github.com/bazelbuild/bazel.git /bazel
+RUN cd /bazel && ./compile.sh
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
+RUN ln -s /bazel/output/bazel /bin/
 
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+# ensure the installation has been extracted
+RUN bazel
diff --git a/tools/dockerfile/grpc_artifact_linux_x64/Dockerfile b/tools/dockerfile/grpc_artifact_linux_x64/Dockerfile
index d048b72..4ae4ebd 100644
--- a/tools/dockerfile/grpc_artifact_linux_x64/Dockerfile
+++ b/tools/dockerfile/grpc_artifact_linux_x64/Dockerfile
@@ -31,12 +31,15 @@
 
 FROM debian:jessie
 
+RUN apt-get update && apt-get install debian-keyring && apt-key update
+
 # Install Git and basic packages.
-RUN apt-get update && apt-get install -y \
+RUN apt-get update && apt-key update && apt-get install -y \
   autoconf \
   autotools-dev \
   build-essential \
   bzip2 \
+  clang \
   curl \
   gcc \
   gcc-multilib \
diff --git a/tools/dockerfile/grpc_artifact_linux_x86/Dockerfile b/tools/dockerfile/grpc_artifact_linux_x86/Dockerfile
index 46bc9f8..9c2fd52 100644
--- a/tools/dockerfile/grpc_artifact_linux_x86/Dockerfile
+++ b/tools/dockerfile/grpc_artifact_linux_x86/Dockerfile
@@ -31,12 +31,15 @@
 
 FROM 32bit/debian:jessie
 
+RUN apt-get update && apt-get install debian-keyring && apt-key update
+
 # Install Git and basic packages.
-RUN apt-get update && apt-get install -y \
+RUN apt-get update && apt-key update && apt-get install -y \
   autoconf \
   autotools-dev \
   build-essential \
   bzip2 \
+  clang \
   curl \
   gcc \
   gcc-multilib \
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile
old mode 100755
new mode 100644
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile
index 2fc66c2..3e31a2b
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile
@@ -1,5 +1,4 @@
-#!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +26,18 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+# Docker file for building gRPC manylinux Python artifacts.
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+FROM quay.io/pypa/manylinux1_x86_64
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
+# Update the package manager
+RUN yum update -y
 
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
+###################################
+# Install Python build requirements
+RUN /opt/python/cp27-cp27m/bin/pip install cython
+RUN /opt/python/cp27-cp27mu/bin/pip install cython
+RUN /opt/python/cp34-cp34m/bin/pip install cython
+RUN /opt/python/cp35-cp35m/bin/pip install cython
 
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile
old mode 100755
new mode 100644
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile
index 2fc66c2..5fe62c2
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile
@@ -1,5 +1,4 @@
-#!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +26,18 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+# Docker file for building gRPC manylinux Python artifacts.
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+FROM quay.io/pypa/manylinux1_i686
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
+# Update the package manager
+RUN yum update -y
 
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
+###################################
+# Install Python build requirements
+RUN /opt/python/cp27-cp27m/bin/pip install cython
+RUN /opt/python/cp27-cp27mu/bin/pip install cython
+RUN /opt/python/cp34-cp34m/bin/pip install cython
+RUN /opt/python/cp35-cp35m/bin/pip install cython
 
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
diff --git a/tools/dockerfile/grpc_clang_format/Dockerfile b/tools/dockerfile/grpc_clang_format/Dockerfile
index 41239e9..ab58017 100644
--- a/tools/dockerfile/grpc_clang_format/Dockerfile
+++ b/tools/dockerfile/grpc_clang_format/Dockerfile
@@ -30,8 +30,8 @@
 FROM ubuntu:wily
 RUN apt-get update
 RUN apt-get -y install wget
-RUN echo deb http://llvm.org/apt/wily/ llvm-toolchain-wily main >> /etc/apt/sources.list
-RUN echo deb-src http://llvm.org/apt/wily/ llvm-toolchain-wily main >> /etc/apt/sources.list
+RUN echo deb http://llvm.org/apt/wily/ llvm-toolchain-wily-3.8 main >> /etc/apt/sources.list
+RUN echo deb-src http://llvm.org/apt/wily/ llvm-toolchain-wily-3.8 main >> /etc/apt/sources.list
 RUN wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key| apt-key add -
 RUN apt-get update
 RUN apt-get -y install clang-format-3.8
diff --git a/tools/dockerfile/interoptest/grpc_interop_node/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_node/Dockerfile
index 64314f8..2a8d35a 100644
--- a/tools/dockerfile/interoptest/grpc_interop_node/Dockerfile
+++ b/tools/dockerfile/interoptest/grpc_interop_node/Dockerfile
@@ -69,8 +69,11 @@
 # Install nvm
 RUN touch .profile
 RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
+# Install all versions of node that we want to test
 RUN /bin/bash -l -c "nvm install 0.12 && npm config set cache /tmp/npm-cache"
-
+RUN /bin/bash -l -c "nvm install 4 && npm config set cache /tmp/npm-cache"
+RUN /bin/bash -l -c "nvm install 5 && npm config set cache /tmp/npm-cache"
+RUN /bin/bash -l -c "nvm alias default 4"
 # Prepare ccache
 RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
 RUN ln -s /usr/bin/ccache /usr/local/bin/g++
diff --git a/tools/dockerfile/interoptest/grpc_interop_node/build_interop.sh b/tools/dockerfile/interoptest/grpc_interop_node/build_interop.sh
index b99fd44..976f55d 100755
--- a/tools/dockerfile/interoptest/grpc_interop_node/build_interop.sh
+++ b/tools/dockerfile/interoptest/grpc_interop_node/build_interop.sh
@@ -38,8 +38,6 @@
 cp -r /var/local/jenkins/service_account $HOME || true
 
 cd /var/local/git/grpc
-nvm use 0.12
-nvm alias default 0.12  # prevent the need to run 'nvm use' in every shell
 
 # build Node interop client & server
 npm install -g node-gyp
diff --git a/tools/dockerfile/stress_test/grpc_interop_stress_csharp/Dockerfile b/tools/dockerfile/stress_test/grpc_interop_stress_csharp/Dockerfile
new file mode 100644
index 0000000..823fe94
--- /dev/null
+++ b/tools/dockerfile/stress_test/grpc_interop_stress_csharp/Dockerfile
@@ -0,0 +1,101 @@
+# 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.
+
+FROM debian:jessie
+
+# Install Git and basic packages.
+RUN apt-get update && apt-get install -y \
+  autoconf \
+  autotools-dev \
+  build-essential \
+  bzip2 \
+  ccache \
+  curl \
+  gcc \
+  gcc-multilib \
+  git \
+  golang \
+  gyp \
+  lcov \
+  libc6 \
+  libc6-dbg \
+  libc6-dev \
+  libgtest-dev \
+  libtool \
+  make \
+  perl \
+  strace \
+  python-dev \
+  python-setuptools \
+  python-yaml \
+  telnet \
+  unzip \
+  wget \
+  zip && apt-get clean
+
+#================
+# Build profiling
+RUN apt-get update && apt-get install -y time && apt-get clean
+
+# Prepare ccache
+RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
+RUN ln -s /usr/bin/ccache /usr/local/bin/g++
+RUN ln -s /usr/bin/ccache /usr/local/bin/cc
+RUN ln -s /usr/bin/ccache /usr/local/bin/c++
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang++
+
+#=================
+# C++ dependencies
+RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean
+
+# Google Cloud platform API libraries
+RUN apt-get update && apt-get install -y python-pip && apt-get clean
+RUN pip install --upgrade google-api-python-client
+
+
+#================
+# C# dependencies
+
+# Update to a newer version of mono
+RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
+RUN echo "deb http://download.mono-project.com/repo/debian wheezy main" | tee /etc/apt/sources.list.d/mono-xamarin.list
+RUN echo "deb http://download.mono-project.com/repo/debian wheezy-apache24-compat main" | tee -a /etc/apt/sources.list.d/mono-xamarin.list
+RUN echo "deb http://download.mono-project.com/repo/debian wheezy-libjpeg62-compat main" | tee -a /etc/apt/sources.list.d/mono-xamarin.list
+RUN echo "deb http://download.mono-project.com/repo/debian wheezy-libtiff-compat main" | tee -a /etc/apt/sources.list.d/mono-xamarin.list
+
+# Install dependencies
+RUN apt-get update && apt-get -y dist-upgrade && apt-get install -y \
+    mono-devel \
+    ca-certificates-mono \
+    nuget \
+    && apt-get clean
+
+# Define the default command.
+CMD ["bash"]
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/dockerfile/stress_test/grpc_interop_stress_csharp/build_interop_stress.sh
similarity index 66%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/dockerfile/stress_test/grpc_interop_stress_csharp/build_interop_stress.sh
index 2fc66c2..1f4bf89 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/dockerfile/stress_test/grpc_interop_stress_csharp/build_interop_stress.sh
@@ -28,40 +28,20 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
-
+# Builds C# interop server and client in a base image.
 set -e
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
-
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
 mkdir -p /var/local/git
 git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
 
-mkdir -p reports
+# Copy service account keys if available
+cp -r /var/local/jenkins/service_account $HOME || true
 
-$POST_GIT_STEP
+cd /var/local/git/grpc
 
-exit_code=0
+# Build C++ metrics client (to query the metrics from csharp stress client)
+make metrics_client -j
 
-$RUN_TESTS_COMMAND || exit_code=$?
+# Build C# interop client & server
+tools/run_tests/run_tests.py -l csharp -c dbg --build_only
 
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
diff --git a/tools/dockerfile/stress_test/grpc_interop_stress_node/Dockerfile b/tools/dockerfile/stress_test/grpc_interop_stress_node/Dockerfile
index f70add4..4fd7cc2 100644
--- a/tools/dockerfile/stress_test/grpc_interop_stress_node/Dockerfile
+++ b/tools/dockerfile/stress_test/grpc_interop_stress_node/Dockerfile
@@ -69,8 +69,11 @@
 # Install nvm
 RUN touch .profile
 RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
+# Install all versions of node that we want to test
 RUN /bin/bash -l -c "nvm install 0.12 && npm config set cache /tmp/npm-cache"
-
+RUN /bin/bash -l -c "nvm install 4 && npm config set cache /tmp/npm-cache"
+RUN /bin/bash -l -c "nvm install 5 && npm config set cache /tmp/npm-cache"
+RUN /bin/bash -l -c "nvm alias default 4"
 # Google Cloud platform API libraries
 RUN apt-get update && apt-get install -y python-pip && apt-get clean
 RUN pip install --upgrade google-api-python-client
diff --git a/tools/dockerfile/stress_test/grpc_interop_stress_node/build_interop_stress.sh b/tools/dockerfile/stress_test/grpc_interop_stress_node/build_interop_stress.sh
index b99fd44..976f55d 100755
--- a/tools/dockerfile/stress_test/grpc_interop_stress_node/build_interop_stress.sh
+++ b/tools/dockerfile/stress_test/grpc_interop_stress_node/build_interop_stress.sh
@@ -38,8 +38,6 @@
 cp -r /var/local/jenkins/service_account $HOME || true
 
 cd /var/local/git/grpc
-nvm use 0.12
-nvm alias default 0.12  # prevent the need to run 'nvm use' in every shell
 
 # build Node interop client & server
 npm install -g node-gyp
diff --git a/tools/dockerfile/stress_test/grpc_interop_stress_python/Dockerfile b/tools/dockerfile/stress_test/grpc_interop_stress_python/Dockerfile
new file mode 100644
index 0000000..606b765
--- /dev/null
+++ b/tools/dockerfile/stress_test/grpc_interop_stress_python/Dockerfile
@@ -0,0 +1,103 @@
+# 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.
+
+FROM debian:jessie
+
+# Install Git and basic packages.
+RUN apt-get update && apt-get install -y \
+  autoconf \
+  autotools-dev \
+  build-essential \
+  bzip2 \
+  ccache \
+  curl \
+  gcc \
+  gcc-multilib \
+  git \
+  golang \
+  gyp \
+  lcov \
+  libc6 \
+  libc6-dbg \
+  libc6-dev \
+  libgtest-dev \
+  libtool \
+  make \
+  perl \
+  strace \
+  python-dev \
+  python-setuptools \
+  python-yaml \
+  telnet \
+  unzip \
+  wget \
+  zip && apt-get clean
+
+#================
+# Build profiling
+RUN apt-get update && apt-get install -y time && apt-get clean
+
+# Prepare ccache
+RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
+RUN ln -s /usr/bin/ccache /usr/local/bin/g++
+RUN ln -s /usr/bin/ccache /usr/local/bin/cc
+RUN ln -s /usr/bin/ccache /usr/local/bin/c++
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang++
+
+#=================
+# C++ dependencies
+RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean
+
+# Google Cloud platform API libraries
+RUN apt-get update && apt-get install -y python-pip && apt-get clean
+RUN pip install --upgrade google-api-python-client
+
+
+#====================
+# Python dependencies
+
+# Install dependencies
+
+RUN apt-get update && apt-get install -y \
+    python-all-dev \
+    python3-all-dev \
+    python-pip
+
+# Install Python packages from PyPI
+RUN pip install pip --upgrade
+RUN pip install virtualenv
+RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.0.0a2 tox
+
+
+RUN pip install coverage
+RUN pip install oauth2client
+
+# Define the default command.
+CMD ["bash"]
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/dockerfile/stress_test/grpc_interop_stress_python/build_interop_stress.sh
similarity index 64%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/dockerfile/stress_test/grpc_interop_stress_python/build_interop_stress.sh
index 2fc66c2..e65332f 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/dockerfile/stress_test/grpc_interop_stress_python/build_interop_stress.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -28,40 +28,19 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
-
+# Builds Python interop server and client in a base image.
 set -e
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
-
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
 mkdir -p /var/local/git
 git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
 
-mkdir -p reports
+# copy service account keys if available
+cp -r /var/local/jenkins/service_account $HOME || true
 
-$POST_GIT_STEP
+cd /var/local/git/grpc
 
-exit_code=0
+tools/run_tests/run_tests.py -l python -c opt --build_only
 
-$RUN_TESTS_COMMAND || exit_code=$?
+# Build c++ interop client
+make metrics_client -j
 
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
diff --git a/tools/dockerfile/stress_test/grpc_interop_stress_ruby/Dockerfile b/tools/dockerfile/stress_test/grpc_interop_stress_ruby/Dockerfile
new file mode 100644
index 0000000..36b54dd
--- /dev/null
+++ b/tools/dockerfile/stress_test/grpc_interop_stress_ruby/Dockerfile
@@ -0,0 +1,99 @@
+# 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.
+
+FROM debian:jessie
+
+# Install Git and basic packages.
+RUN apt-get update && apt-get install -y \
+  autoconf \
+  autotools-dev \
+  build-essential \
+  bzip2 \
+  ccache \
+  curl \
+  gcc \
+  gcc-multilib \
+  git \
+  golang \
+  gyp \
+  lcov \
+  libc6 \
+  libc6-dbg \
+  libc6-dev \
+  libgtest-dev \
+  libtool \
+  make \
+  perl \
+  strace \
+  python-dev \
+  python-setuptools \
+  python-yaml \
+  telnet \
+  unzip \
+  wget \
+  zip && apt-get clean
+
+#================
+# Build profiling
+RUN apt-get update && apt-get install -y time && apt-get clean
+
+# Prepare ccache
+RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
+RUN ln -s /usr/bin/ccache /usr/local/bin/g++
+RUN ln -s /usr/bin/ccache /usr/local/bin/cc
+RUN ln -s /usr/bin/ccache /usr/local/bin/c++
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang++
+
+#=================
+# C++ dependencies
+RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean
+
+# Google Cloud platform API libraries
+RUN apt-get update && apt-get install -y python-pip && apt-get clean
+RUN pip install --upgrade google-api-python-client
+
+
+#==================
+# Ruby dependencies
+
+# Install rvm
+RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
+RUN \curl -sSL https://get.rvm.io | bash -s stable
+
+# Install Ruby 2.1
+RUN /bin/bash -l -c "rvm install ruby-2.1"
+RUN /bin/bash -l -c "rvm use --default ruby-2.1"
+RUN /bin/bash -l -c "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
+RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc"
+RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.1' >> ~/.bashrc"
+RUN /bin/bash -l -c "gem install bundler --no-ri --no-rdoc"
+
+# Define the default command.
+CMD ["bash"]
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/dockerfile/stress_test/grpc_interop_stress_ruby/build_interop_stress.sh
similarity index 66%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/dockerfile/stress_test/grpc_interop_stress_ruby/build_interop_stress.sh
index 2fc66c2..1b7567d 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/dockerfile/stress_test/grpc_interop_stress_ruby/build_interop_stress.sh
@@ -28,40 +28,21 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
-
+# Builds Ruby interop server and client in a base image.
 set -e
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
-
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
 mkdir -p /var/local/git
 git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
 
-mkdir -p reports
+# Copy service account keys if available
+cp -r /var/local/jenkins/service_account $HOME || true
 
-$POST_GIT_STEP
+cd /var/local/git/grpc
+rvm --default use ruby-2.1
 
-exit_code=0
+# Build Ruby interop client and server
+(cd src/ruby && gem update bundler && bundle && rake compile)
 
-$RUN_TESTS_COMMAND || exit_code=$?
+# Build c++ metrics client to query the metrics from ruby stress client
+make metrics_client -j
 
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
diff --git a/tools/dockerfile/test/multilang_jessie_x64/Dockerfile b/tools/dockerfile/test/multilang_jessie_x64/Dockerfile
index 71ebf2b..5c3f7740 100644
--- a/tools/dockerfile/test/multilang_jessie_x64/Dockerfile
+++ b/tools/dockerfile/test/multilang_jessie_x64/Dockerfile
@@ -90,8 +90,11 @@
 # Install nvm
 RUN touch .profile
 RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
+# Install all versions of node that we want to test
 RUN /bin/bash -l -c "nvm install 0.12 && npm config set cache /tmp/npm-cache"
-
+RUN /bin/bash -l -c "nvm install 4 && npm config set cache /tmp/npm-cache"
+RUN /bin/bash -l -c "nvm install 5 && npm config set cache /tmp/npm-cache"
+RUN /bin/bash -l -c "nvm alias default 4"
 #=================
 # PHP dependencies
 
diff --git a/tools/dockerfile/test/node_jessie_x64/Dockerfile b/tools/dockerfile/test/node_jessie_x64/Dockerfile
index 64314f8..2a8d35a 100644
--- a/tools/dockerfile/test/node_jessie_x64/Dockerfile
+++ b/tools/dockerfile/test/node_jessie_x64/Dockerfile
@@ -69,8 +69,11 @@
 # Install nvm
 RUN touch .profile
 RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
+# Install all versions of node that we want to test
 RUN /bin/bash -l -c "nvm install 0.12 && npm config set cache /tmp/npm-cache"
-
+RUN /bin/bash -l -c "nvm install 4 && npm config set cache /tmp/npm-cache"
+RUN /bin/bash -l -c "nvm install 5 && npm config set cache /tmp/npm-cache"
+RUN /bin/bash -l -c "nvm alias default 4"
 # Prepare ccache
 RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
 RUN ln -s /usr/bin/ccache /usr/local/bin/g++
diff --git a/tools/dockerfile/test/sanity/Dockerfile b/tools/dockerfile/test/sanity/Dockerfile
index 3146a92..43b2a0c 100644
--- a/tools/dockerfile/test/sanity/Dockerfile
+++ b/tools/dockerfile/test/sanity/Dockerfile
@@ -75,6 +75,15 @@
       python-lxml
 RUN pip install simplejson mako
 
+#======================================
+# More sanity test dependencies (bazel)
+RUN echo "deb http://httpredir.debian.org/debian jessie-backports main" >   /etc/apt/sources.list.d/backports.list
+RUN apt-get update
+RUN apt-get -t jessie-backports install -y openjdk-8-jdk
+RUN git clone https://github.com/bazelbuild/bazel.git /bazel
+RUN cd /bazel && ./compile.sh
+RUN ln -s /bazel/output/bazel /bin/
+
 #===================
 # Docker "inception"
 # Note this is quite the ugly hack.
diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++
index 7dc0496..798d68b 100644
--- a/tools/doxygen/Doxyfile.c++
+++ b/tools/doxygen/Doxyfile.c++
@@ -40,7 +40,7 @@
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 0.14.0-dev
+PROJECT_NUMBER         = 0.15.0-dev
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -777,6 +777,8 @@
 include/grpc++/impl/rpc_service_method.h \
 include/grpc++/impl/serialization_traits.h \
 include/grpc++/impl/server_builder_option.h \
+include/grpc++/impl/server_builder_plugin.h \
+include/grpc++/impl/server_initializer.h \
 include/grpc++/impl/service_type.h \
 include/grpc++/impl/sync.h \
 include/grpc++/impl/sync_cxx11.h \
@@ -833,6 +835,7 @@
 include/grpc++/impl/codegen/sync_stream.h \
 include/grpc++/impl/codegen/time.h \
 include/grpc/impl/codegen/byte_buffer.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/grpc_types.h \
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index 312fd17..ce1d6ac 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -40,7 +40,7 @@
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 0.14.0-dev
+PROJECT_NUMBER         = 0.15.0-dev
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -777,6 +777,8 @@
 include/grpc++/impl/rpc_service_method.h \
 include/grpc++/impl/serialization_traits.h \
 include/grpc++/impl/server_builder_option.h \
+include/grpc++/impl/server_builder_plugin.h \
+include/grpc++/impl/server_initializer.h \
 include/grpc++/impl/service_type.h \
 include/grpc++/impl/sync.h \
 include/grpc++/impl/sync_cxx11.h \
@@ -833,6 +835,7 @@
 include/grpc++/impl/codegen/sync_stream.h \
 include/grpc++/impl/codegen/time.h \
 include/grpc/impl/codegen/byte_buffer.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/grpc_types.h \
diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core
index 034d9c6..aabca41 100644
--- a/tools/doxygen/Doxyfile.core
+++ b/tools/doxygen/Doxyfile.core
@@ -40,7 +40,7 @@
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 0.14.0-dev
+PROJECT_NUMBER         = 0.15.0-dev
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -766,6 +766,7 @@
 include/grpc/grpc.h \
 include/grpc/status.h \
 include/grpc/impl/codegen/byte_buffer.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/grpc_types.h \
@@ -785,6 +786,7 @@
 include/grpc/impl/codegen/sync_posix.h \
 include/grpc/impl/codegen/sync_win32.h \
 include/grpc/impl/codegen/time.h \
+include/grpc/grpc_cronet.h \
 include/grpc/grpc_security.h \
 include/grpc/grpc_security_constants.h \
 include/grpc/census.h \
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 1b1453f..212dfc3 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -40,7 +40,7 @@
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 0.14.0-dev
+PROJECT_NUMBER         = 0.15.0-dev
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -766,6 +766,7 @@
 include/grpc/grpc.h \
 include/grpc/status.h \
 include/grpc/impl/codegen/byte_buffer.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/grpc_types.h \
@@ -785,6 +786,7 @@
 include/grpc/impl/codegen/sync_posix.h \
 include/grpc/impl/codegen/sync_win32.h \
 include/grpc/impl/codegen/time.h \
+include/grpc/grpc_cronet.h \
 include/grpc/grpc_security.h \
 include/grpc/grpc_security_constants.h \
 include/grpc/census.h \
@@ -806,6 +808,7 @@
 src/core/lib/iomgr/endpoint.h \
 src/core/lib/iomgr/endpoint_pair.h \
 src/core/lib/iomgr/ev_poll_and_epoll_posix.h \
+src/core/lib/iomgr/ev_poll_posix.h \
 src/core/lib/iomgr/ev_posix.h \
 src/core/lib/iomgr/exec_ctx.h \
 src/core/lib/iomgr/executor.h \
@@ -912,8 +915,9 @@
 src/core/ext/client_config/subchannel_call_holder.h \
 src/core/ext/client_config/subchannel_index.h \
 src/core/ext/client_config/uri_parser.h \
+third_party/objective_c/Cronet/cronet_c_for_grpc.h \
 src/core/ext/lb_policy/grpclb/load_balancer_api.h \
-src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h \
+src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h \
 third_party/nanopb/pb.h \
 third_party/nanopb/pb_common.h \
 third_party/nanopb/pb_decode.h \
@@ -943,6 +947,7 @@
 src/core/lib/iomgr/endpoint_pair_posix.c \
 src/core/lib/iomgr/endpoint_pair_windows.c \
 src/core/lib/iomgr/ev_poll_and_epoll_posix.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 \
@@ -1070,8 +1075,11 @@
 src/core/ext/client_config/uri_parser.c \
 src/core/ext/transport/chttp2/server/insecure/server_chttp2.c \
 src/core/ext/transport/chttp2/client/insecure/channel_create.c \
+src/core/ext/transport/cronet/client/secure/cronet_channel_create.c \
+src/core/ext/transport/cronet/transport/cronet_api_dummy.c \
+src/core/ext/transport/cronet/transport/cronet_transport.c \
 src/core/ext/lb_policy/grpclb/load_balancer_api.c \
-src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c \
+src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c \
 third_party/nanopb/pb_common.c \
 third_party/nanopb/pb_decode.c \
 third_party/nanopb/pb_encode.c \
diff --git a/tools/gce/create_linux_performance_worker.sh b/tools/gce/create_linux_performance_worker.sh
index 8c9cc46..c9a0ffa 100755
--- a/tools/gce/create_linux_performance_worker.sh
+++ b/tools/gce/create_linux_performance_worker.sh
@@ -42,14 +42,15 @@
 ZONE=us-central1-b  # this zone allows 32core machines
 
 INSTANCE_NAME="${1:-grpc-performance-server1}"
-MACHINE_TYPE=n1-standard-32
+MACHINE_TYPE=n1-standard-8
 
 gcloud compute instances create $INSTANCE_NAME \
     --project="$CLOUD_PROJECT" \
     --zone "$ZONE" \
     --machine-type $MACHINE_TYPE \
     --image ubuntu-15-10 \
-    --boot-disk-size 300
+    --boot-disk-size 300 \
+    --scopes https://www.googleapis.com/auth/bigquery
 
 echo 'Created GCE instance, waiting 60 seconds for it to come online.'
 sleep 60
diff --git a/tools/gce/create_linux_worker.sh b/tools/gce/create_linux_worker.sh
index dff0b1c..c41e4d2 100755
--- a/tools/gce/create_linux_worker.sh
+++ b/tools/gce/create_linux_worker.sh
@@ -43,7 +43,7 @@
     --project="$CLOUD_PROJECT" \
     --zone "$ZONE" \
     --machine-type n1-standard-8 \
-    --image ubuntu-14-04 \
+    --image ubuntu-15-10 \
     --boot-disk-size 1000
 
 echo 'Created GCE instance, waiting 60 seconds for it to come online.'
diff --git a/tools/gce/linux_performance_worker_init.sh b/tools/gce/linux_performance_worker_init.sh
index 25ac3bc..dc47842 100755
--- a/tools/gce/linux_performance_worker_init.sh
+++ b/tools/gce/linux_performance_worker_init.sh
@@ -77,6 +77,9 @@
 # perftools
 sudo apt-get install -y google-perftools libgoogle-perftools-dev
 
+# netperf
+sudo apt-get install -y netperf
+
 # C++ dependencies
 sudo apt-get install -y libgflags-dev libgtest-dev libc++-dev clang
 
@@ -94,7 +97,11 @@
 # Node dependencies (nvm has to be installed under user jenkins)
 touch .profile
 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
+source ~/.nvm/nvm.sh
 nvm install 0.12 && npm config set cache /tmp/npm-cache
+nvm install 4 && npm config set cache /tmp/npm-cache
+nvm install 5 && npm config set cache /tmp/npm-cache
+nvm alias default 4
 
 # C# dependencies (http://www.mono-project.com/docs/getting-started/install/linux/#debian-ubuntu-and-derivatives)
 
@@ -112,3 +119,6 @@
 gem install bundler
 
 # Java dependencies - nothing as we already have Java JDK 8
+
+# Go dependencies
+sudo apt-get install -y golang-go
diff --git a/tools/gce/linux_worker_init.sh b/tools/gce/linux_worker_init.sh
index ef6a5d1..afcf7a5 100755
--- a/tools/gce/linux_worker_init.sh
+++ b/tools/gce/linux_worker_init.sh
@@ -37,7 +37,7 @@
 sudo apt-get update
 
 # Install JRE
-sudo apt-get install -y openjdk-7-jre
+sudo apt-get install -y openjdk-8-jre
 sudo apt-get install -y unzip lsof
 
 # Install Docker
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/gcp/stress_test/run_ruby.sh
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/gcp/stress_test/run_ruby.sh
index 2fc66c2..80d0567 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/gcp/stress_test/run_ruby.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2015-2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +27,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.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+# This is a wrapper script that was created to help run_server.py and
+# run_client.py to launch 'node js' stress clients and stress servers
+source /etc/profile.d/rvm.sh
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+set -ex
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+$@
diff --git a/examples/node/greeter_client.js b/tools/gource/create_auth_context.h
similarity index 74%
copy from examples/node/greeter_client.js
copy to tools/gource/create_auth_context.h
index 2820acb..387407b 100644
--- a/examples/node/greeter_client.js
+++ b/tools/gource/create_auth_context.h
@@ -30,24 +30,13 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
+#include <memory>
 
-var PROTO_PATH = __dirname + '/../protos/helloworld.proto';
+#include <grpc++/security/auth_context.h>
+#include <grpc/grpc.h>
 
-var grpc = require('grpc');
-var hello_proto = grpc.load(PROTO_PATH).helloworld;
+namespace grpc {
 
-function main() {
-  var client = new hello_proto.Greeter('localhost:50051',
-                                       grpc.credentials.createInsecure());
-  var user;
-  if (process.argv.length >= 3) {
-    user = process.argv[2];
-  } else {
-    user = 'world';
-  }
-  client.sayHello({name: user}, function(err, response) {
-    console.log('Greeting:', response.message);
-  });
-}
+std::shared_ptr<const AuthContext> CreateAuthContext(grpc_call* call);
 
-main();
+}  // namespace grpc
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/gource/gen-all-logs.sh
similarity index 61%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/gource/gen-all-logs.sh
index 2fc66c2..85352c5 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/gource/gen-all-logs.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +27,21 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+set -ex
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+outdir=`pwd`
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
+tmpdir=`mktemp -d`
+mkdir -p $tmpdir/logs
+repos="grpc grpc-common grpc-go grpc-java grpc.github.io grpc-tools homebrew-grpc grpc-docker-library"
+for repo in $repos
+do
+  cd $tmpdir
+  git clone https://github.com/grpc/$repo.git
+  cd $repo
+  gource --output-custom-log $tmpdir/logs/$repo
+  sed -i .backup "s,\|/,\|/$repo/,g" $tmpdir/logs/$repo
 done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+rm $tmpdir/logs/*.backup
+cat $tmpdir/logs/* | sort -n > $outdir/all-logs.txt
diff --git a/tools/gource/gource.sh b/tools/gource/gource.sh
index 0199609..b3dad5d 100755
--- a/tools/gource/gource.sh
+++ b/tools/gource/gource.sh
@@ -28,5 +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.
 
-gource --multi-sampling -c 4 -s 0.1 --max-file-lag 0.05 --max-files 0 -e 0.05 --hide filenames,dirnames $*
-
+gource                          \
+  --multi-sampling              \
+  -s 0.1                        \
+  --max-file-lag 0.05           \
+  --max-files 0                 \
+  -e 0.01                       \
+  --hide filenames,dirnames     \
+  --disable-auto-rotate         \
+  --file-filter '/grpc/doc/ref' \
+  $*
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/gource/make-video.sh
similarity index 60%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/gource/make-video.sh
index 2fc66c2..02d79df 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/gource/make-video.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2015, Google Inc.
+# Copyright 2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,41 +27,21 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+set -ex
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
-
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
-
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+dst=$1
+shift
+$(dirname $0)/gource.sh \
+  --disable-progress    \
+  --stop-at-end         \
+  --output-ppm-stream - \
+  $@ |                  \
+ffmpeg                  \
+  -y                    \
+  -r 60                 \
+  -f image2pipe         \
+  -vcodec ppm           \
+  -i -                  \
+  -vcodec libx264       \
+  $dst
diff --git a/tools/jenkins/README.md b/tools/jenkins/README.md
new file mode 100644
index 0000000..8e06b68
--- /dev/null
+++ b/tools/jenkins/README.md
@@ -0,0 +1 @@
+Scripts invoked by Jenkins (our CI platform) to run gRPC test suites.
diff --git a/tools/jenkins/run_fuzzer.sh b/tools/jenkins/run_fuzzer.sh
index 3f25a93..cfa7ace 100755
--- a/tools/jenkins/run_fuzzer.sh
+++ b/tools/jenkins/run_fuzzer.sh
@@ -33,14 +33,14 @@
 set -ex
 
 export RUN_COMMAND="tools/fuzzer/build_and_run_fuzzer.sh $1"
-export DOCKER_RUN_SCRIPT=tools/jenkins/docker_run.sh
+export DOCKER_RUN_SCRIPT=tools/run_tests/dockerize/docker_run.sh
 export DOCKERFILE_DIR=tools/dockerfile/test/fuzzer
 export OUTPUT_DIR=fuzzer_output
 
 runtime=${runtime:-3600}
 jobs=${jobs:-3}
 
-tools/jenkins/build_and_run_docker.sh \
+tools/run_tests/dockerize/build_and_run_docker.sh \
   -e RUN_COMMAND="$RUN_COMMAND" \
   -e OUTPUT_DIR="$OUTPUT_DIR" \
   -e config="$config" \
diff --git a/tools/jenkins/run_performance.sh b/tools/jenkins/run_performance.sh
index 13a3327..99b920f 100755
--- a/tools/jenkins/run_performance.sh
+++ b/tools/jenkins/run_performance.sh
@@ -34,4 +34,4 @@
 # Enter the gRPC repo root
 cd $(dirname $0)/../..
 
-tools/run_tests/run_performance_tests.py -l c++ node ruby csharp python
+tools/run_tests/run_performance_tests.py -l c++ node ruby csharp python --netperf --category smoketest
diff --git a/tools/run_tests/artifact_targets.py b/tools/run_tests/artifact_targets.py
index e61c46d..bd1269c 100644
--- a/tools/run_tests/artifact_targets.py
+++ b/tools/run_tests/artifact_targets.py
@@ -43,10 +43,10 @@
   for k,v in environ.iteritems():
     docker_args += ['-e', '%s=%s' % (k, v)]
   docker_env = {'DOCKERFILE_DIR': dockerfile_dir,
-                'DOCKER_RUN_SCRIPT': 'tools/jenkins/docker_run.sh',
+                'DOCKER_RUN_SCRIPT': 'tools/run_tests/dockerize/docker_run.sh',
                 'OUTPUT_DIR': 'artifacts'}
   jobspec = jobset.JobSpec(
-          cmdline=['tools/jenkins/build_and_run_docker.sh'] + docker_args,
+          cmdline=['tools/run_tests/dockerize/build_and_run_docker.sh'] + docker_args,
           environ=docker_env,
           shortname='build_artifact.%s' % (name),
           timeout_seconds=30*60,
@@ -84,12 +84,16 @@
 class PythonArtifact:
   """Builds Python artifacts."""
 
-  def __init__(self, platform, arch):
-    self.name = 'python_%s_%s' % (platform, arch)
+  def __init__(self, platform, arch, manylinux_build=None):
+    if manylinux_build:
+      self.name = 'python_%s_%s_%s' % (platform, arch, manylinux_build)
+    else:
+      self.name = 'python_%s_%s' % (platform, arch)
     self.platform = platform
     self.arch = arch
     self.labels = ['artifact', 'python', platform, arch]
     self.python_version = python_version_arch_map[arch]
+    self.manylinux_build = manylinux_build
 
   def pre_build_jobspecs(self):
       return []
@@ -99,14 +103,26 @@
     if self.platform == 'linux':
       if self.arch == 'x86':
         environ['SETARCH_CMD'] = 'linux32'
+      # Inside the manylinux container, the python installations are located in
+      # special places...
+      environ['PYTHON'] = '/opt/python/{}/bin/python'.format(self.manylinux_build)
+      environ['PIP'] = '/opt/python/{}/bin/pip'.format(self.manylinux_build)
+      # Our docker image has all the prerequisites pip-installed already.
+      environ['SKIP_PIP_INSTALL'] = '1'
+      # Platform autodetection for the manylinux1 image breaks so we set the
+      # defines ourselves.
+      # TODO(atash) get better platform-detection support in core so we don't
+      # need to do this manually...
+      environ['CFLAGS'] = '-DGPR_MANYLINUX1=1'
       return create_docker_jobspec(self.name,
-          'tools/dockerfile/grpc_artifact_linux_%s' % self.arch,
+          'tools/dockerfile/grpc_artifact_python_manylinux_%s' % self.arch,
           'tools/run_tests/build_artifact_python.sh',
           environ=environ)
     elif self.platform == 'windows':
       return create_jobspec(self.name,
                             ['tools\\run_tests\\build_artifact_python.bat',
-                             self.python_version
+                             self.python_version,
+                             '32' if self.arch == 'x86' else '64'
                             ],
                             shell=True)
     else:
@@ -307,8 +323,10 @@
            for Cls in (CSharpExtArtifact, NodeExtArtifact, ProtocArtifact)
            for platform in ('linux', 'macos', 'windows')
            for arch in ('x86', 'x64')] +
-          [PythonArtifact('linux', 'x86'),
-           PythonArtifact('linux', 'x64'),
+          [PythonArtifact('linux', 'x86', 'cp27-cp27m'),
+           PythonArtifact('linux', 'x86', 'cp27-cp27mu'),
+           PythonArtifact('linux', 'x64', 'cp27-cp27m'),
+           PythonArtifact('linux', 'x64', 'cp27-cp27mu'),
            PythonArtifact('macos', 'x64'),
            PythonArtifact('windows', 'x86'),
            PythonArtifact('windows', 'x64'),
diff --git a/tools/run_tests/build_artifact_node.bat b/tools/run_tests/build_artifact_node.bat
index 84c63c2..c5bd726 100644
--- a/tools/run_tests/build_artifact_node.bat
+++ b/tools/run_tests/build_artifact_node.bat
@@ -27,7 +27,7 @@
 @rem (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 @rem OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-set node_versions=0.12.0 1.0.0 1.1.0 2.0.0 3.0.0 4.0.0 5.0.0
+set node_versions=0.12.0 1.0.0 1.1.0 2.0.0 3.0.0 4.0.0 5.0.0 6.0.0
 
 set PATH=%PATH%;C:\Program Files\nodejs\;%APPDATA%\npm
 
@@ -38,12 +38,12 @@
 mkdir artifacts
 
 for %%v in (%node_versions%) do (
-  call node-pre-gyp configure build --target=%%v --target_arch=%1
+  call .\node_modules\.bin\node-pre-gyp.cmd configure build --target=%%v --target_arch=%1
 
 @rem Try again after removing openssl headers
   rmdir "%HOMEDRIVE%%HOMEPATH%\.node-gyp\%%v\include\node\openssl" /S /Q
   rmdir "%HOMEDRIVE%%HOMEPATH%\.node-gyp\iojs-%%v\include\node\openssl" /S /Q
-  call node-pre-gyp build package testpackage --target=%%v --target_arch=%1 || goto :error
+  call .\node_modules\.bin\node-pre-gyp.cmd build package testpackage --target=%%v --target_arch=%1 || goto :error
 
   xcopy /Y /I /S build\stage\* artifacts\ || goto :error
 )
diff --git a/tools/run_tests/build_artifact_node.sh b/tools/run_tests/build_artifact_node.sh
index ef3476a..9d06472 100755
--- a/tools/run_tests/build_artifact_node.sh
+++ b/tools/run_tests/build_artifact_node.sh
@@ -42,7 +42,7 @@
 
 npm update
 
-node_versions=( 0.12.0 1.0.0 1.1.0 2.0.0 3.0.0 4.0.0 5.0.0 )
+node_versions=( 0.12.0 1.0.0 1.1.0 2.0.0 3.0.0 4.0.0 5.0.0 6.0.0 )
 
 for version in ${node_versions[@]}
 do
diff --git a/tools/run_tests/build_artifact_python.bat b/tools/run_tests/build_artifact_python.bat
index 023d394..fea0275 100644
--- a/tools/run_tests/build_artifact_python.bat
+++ b/tools/run_tests/build_artifact_python.bat
@@ -41,7 +41,7 @@
 copy /Y vsprojects\x64\Release\grpc_dll.dll src\python\grpcio\grpc\_cython\_windows\grpc_c.64.python || goto :error
 
 
-set PATH=C:\%1;C:\%1\scripts;%PATH%
+set PATH=C:\%1;C:\%1\scripts;C:\msys64\mingw%2\bin;%PATH%
 
 pip install --upgrade six
 pip install --upgrade setuptools
@@ -50,10 +50,37 @@
 set GRPC_PYTHON_USE_CUSTOM_BDIST=0
 set GRPC_PYTHON_BUILD_WITH_CYTHON=1
 
+@rem TODO(atash): maybe we could avoid the grpc_c.(32|64).python shim above if
+@rem this used the right python build?
 python setup.py bdist_wheel
 
+@rem Build gRPC Python tools
+@rem
+@rem Because this is windows and *everything seems to hate Windows* we have to
+@rem set all of these flags ourselves because Python won't help us (see the
+@rem setup.py of the grpcio_tools project).
+set GRPC_PYTHON_CFLAGS=-fno-wrapv -frtti -std=c++11
+@rem Further confusing things, MSYS2's mingw64 tries to dynamically link
+@rem libgcc, libstdc++, and winpthreads. We have to override this or our
+@rem extensions end up linking to MSYS2 DLLs, which the normal Python on
+@rem Windows user won't have... and ON TOP OF THIS, there's MinGW's GCC default
+@rem behavior of linking msvcrt.dll as the C runtime library, which we need to
+@rem override so that Python's distutils doesn't link us against multiple C
+@rem runtimes.
+python -c "from distutils.cygwinccompiler import get_msvcr; print(get_msvcr()[0])" > temp.txt
+set /p PYTHON_MSVCR=<temp.txt
+set GRPC_PYTHON_LDFLAGS=-static-libgcc -static-libstdc++ -mcrtdll=%PYTHON_MSVCR% -static -lpthread
+python tools\distrib\python\make_grpcio_tools.py
+if %2 == 32 (
+  python tools\distrib\python\grpcio_tools\setup.py build_ext -c mingw32
+) else (
+  python tools\distrib\python\grpcio_tools\setup.py build_ext -c mingw32 -DMS_WIN64
+)
+python tools\distrib\python\grpcio_tools\setup.py bdist_wheel
+
 mkdir artifacts
 xcopy /Y /I /S dist\* artifacts\ || goto :error
+xcopy /Y /I /S tools\distrib\python\grpcio_tools\dist\* artifacts\ || goto :error
 
 goto :EOF
 
diff --git a/tools/run_tests/build_artifact_python.sh b/tools/run_tests/build_artifact_python.sh
index 1f23f9f..4320f97 100755
--- a/tools/run_tests/build_artifact_python.sh
+++ b/tools/run_tests/build_artifact_python.sh
@@ -32,36 +32,52 @@
 
 cd $(dirname $0)/../..
 
-if [ "$SKIP_PIP_INSTALL" == "" ]
-then
-  pip install --upgrade six
-  # There's a bug in newer versions of setuptools (see
-  # https://bitbucket.org/pypa/setuptools/issues/503/pkg_resources_vendorpackagingrequirementsi)
-  pip install --upgrade 'setuptools==18'
-  pip install -rrequirements.txt
-fi
-
 export GRPC_PYTHON_USE_CUSTOM_BDIST=0
 export GRPC_PYTHON_BUILD_WITH_CYTHON=1
+export PYTHON=${PYTHON:-python}
+export PIP=${PIP:-pip}
+export AUDITWHEEL=${AUDITWHEEL:-auditwheel}
+
+
+if [ "$SKIP_PIP_INSTALL" == "" ]
+then
+  ${PIP} install --upgrade six
+  # There's a bug in newer versions of setuptools (see
+  # https://bitbucket.org/pypa/setuptools/issues/503/pkg_resources_vendorpackagingrequirementsi)
+  ${PIP} pip install --upgrade 'setuptools==18'
+  ${PIP} install -rrequirements.txt
+fi
 
 # Build the source distribution first because MANIFEST.in cannot override
 # exclusion of built shared objects among package resources (for some
 # inexplicable reason).
-${SETARCH_CMD} python setup.py  \
+${SETARCH_CMD} ${PYTHON} setup.py  \
     sdist
 
-# The bdist_wheel_grpc_custom command is finicky about command output ordering
-# and thus ought to be run in a shell command separate of others. Further, it
-# trashes the actual bdist_wheel output, so it should be run first so that
-# bdist_wheel may be run unmolested.
-${SETARCH_CMD} python setup.py  \
-    build_tagged_ext
-
 # Wheel has a bug where directories don't get excluded.
 # https://bitbucket.org/pypa/wheel/issues/99/cannot-exclude-directory
-${SETARCH_CMD} python setup.py  \
+${SETARCH_CMD} ${PYTHON} setup.py  \
     bdist_wheel
 
+# Build gRPC tools package source distribution
+${SETARCH_CMD} ${PYTHON} tools/distrib/python/grpcio_tools/setup.py  \
+    sdist
+
+# Build gRPC tools package binary distribution
+${PYTHON} tools/distrib/python/make_grpcio_tools.py
+CFLAGS="$CFLAGS -fno-wrapv" ${SETARCH_CMD} \
+  ${PYTHON} tools/distrib/python/grpcio_tools/setup.py bdist_wheel
+
 mkdir -p artifacts
+if command -v ${AUDITWHEEL}
+then
+  for wheel in dist/*.whl; do
+    ${AUDITWHEEL} repair $wheel -w artifacts/
+  done
+  for wheel in tools/distrib/python/grpcio_tools/dist/*.whl; do
+    ${AUDITWHEEL} repair $wheel -w artifacts/
+  done
+fi
 
 cp -r dist/* artifacts
+cp -r tools/distrib/python/grpcio_tools/dist/* artifacts
diff --git a/tools/run_tests/build_package_node.sh b/tools/run_tests/build_package_node.sh
index 6bc9466..4646072 100755
--- a/tools/run_tests/build_package_node.sh
+++ b/tools/run_tests/build_package_node.sh
@@ -55,7 +55,7 @@
 cp grpc-tools-*.tgz $artifacts/
 tools_version=$(npm list | grep -oP '(?<=grpc-tools@)\S+')
 
-output_dir=$artifacts/grpc-precompiled-binaries/node/grpc-tools/$tools_version
+output_dir=$artifacts/grpc-precompiled-binaries/node/grpc-tools/v$tools_version
 mkdir -p $output_dir
 
 for arch in {x86,x64}; do
diff --git a/tools/run_tests/build_package_ruby.sh b/tools/run_tests/build_package_ruby.sh
index 1a5b943..e44428b 100755
--- a/tools/run_tests/build_package_ruby.sh
+++ b/tools/run_tests/build_package_ruby.sh
@@ -32,6 +32,8 @@
 
 cd $(dirname $0)/../..
 
+base=$(pwd)
+
 mkdir -p artifacts/
 
 # All the ruby packages have been built in the artifact phase already
@@ -41,3 +43,25 @@
 # TODO: all the artifact builder configurations generate a grpc-VERSION.gem
 # source distribution package, and only one of them will end up
 # in the artifacts/ directory. They should be all equivalent though.
+
+for arch in {x86,x64}; do
+  case $arch in
+    x64)
+      ruby_arch=x86_64
+      ;;
+    *)
+      ruby_arch=$arch
+      ;;
+  esac
+  for plat in {windows,linux,macos}; do
+    input_dir="$EXTERNAL_GIT_ROOT/architecture=$arch,language=protoc,platform=$plat/artifacts"
+    output_dir="$base/src/ruby/tools/bin/${ruby_arch}-${plat}"
+    mkdir -p $output_dir
+    cp $input_dir/protoc* $output_dir/
+    cp $input_dir/grpc_ruby_plugin* $output_dir/
+  done
+done
+
+cd $base/src/ruby/tools
+gem build grpc-tools.gemspec
+cp ./grpc-tools*.gem $base/artifacts/
diff --git a/tools/run_tests/configs.json b/tools/run_tests/configs.json
index 325e9aa..bcc4118 100644
--- a/tools/run_tests/configs.json
+++ b/tools/run_tests/configs.json
@@ -56,6 +56,9 @@
   }, 
   {
     "config": "ubsan", 
+    "environ": {
+      "UBSAN_OPTIONS": "print_stacktrace=1"
+    }, 
     "timeout_multiplier": 1.5
   }, 
   {
diff --git a/tools/run_tests/distribtest_targets.py b/tools/run_tests/distribtest_targets.py
index 34cc1cd..ae918be 100644
--- a/tools/run_tests/distribtest_targets.py
+++ b/tools/run_tests/distribtest_targets.py
@@ -44,9 +44,9 @@
   for k,v in environ.iteritems():
     docker_args += ['-e', '%s=%s' % (k, v)]
   docker_env = {'DOCKERFILE_DIR': dockerfile_dir,
-                'DOCKER_RUN_SCRIPT': 'tools/jenkins/docker_run.sh'}
+                'DOCKER_RUN_SCRIPT': 'tools/run_tests/dockerize/docker_run.sh'}
   jobspec = jobset.JobSpec(
-          cmdline=['tools/jenkins/build_and_run_docker.sh'] + docker_args,
+          cmdline=['tools/run_tests/dockerize/build_and_run_docker.sh'] + docker_args,
           environ=docker_env,
           shortname='distribtest.%s' % (name),
           timeout_seconds=30*60,
diff --git a/tools/jenkins/build_and_run_docker.sh b/tools/run_tests/dockerize/build_and_run_docker.sh
similarity index 98%
rename from tools/jenkins/build_and_run_docker.sh
rename to tools/run_tests/dockerize/build_and_run_docker.sh
index 92dbbc6..1ef34b2 100755
--- a/tools/jenkins/build_and_run_docker.sh
+++ b/tools/run_tests/dockerize/build_and_run_docker.sh
@@ -33,7 +33,7 @@
 
 set -ex
 
-cd $(dirname $0)/../..
+cd $(dirname $0)/../../..
 git_root=$(pwd)
 cd -
 
diff --git a/tools/jenkins/build_docker_and_run_tests.sh b/tools/run_tests/dockerize/build_docker_and_run_tests.sh
similarity index 98%
rename from tools/jenkins/build_docker_and_run_tests.sh
rename to tools/run_tests/dockerize/build_docker_and_run_tests.sh
index 5779e63..c2ea6f2 100755
--- a/tools/jenkins/build_docker_and_run_tests.sh
+++ b/tools/run_tests/dockerize/build_docker_and_run_tests.sh
@@ -33,7 +33,7 @@
 
 set -ex
 
-cd $(dirname $0)/../..
+cd $(dirname $0)/../../..
 git_root=$(pwd)
 cd -
 
diff --git a/tools/jenkins/build_interop_image.sh b/tools/run_tests/dockerize/build_interop_image.sh
similarity index 98%
rename from tools/jenkins/build_interop_image.sh
rename to tools/run_tests/dockerize/build_interop_image.sh
index d2ba97c..48a216a 100755
--- a/tools/jenkins/build_interop_image.sh
+++ b/tools/run_tests/dockerize/build_interop_image.sh
@@ -40,7 +40,7 @@
 #  BUILD_INTEROP_DOCKER_EXTRA_ARGS - optional args to be passed to the
 #    docker run command
 
-cd `dirname $0`/../..
+cd `dirname $0`/../../..
 GRPC_ROOT=`pwd`
 MOUNT_ARGS="-v $GRPC_ROOT:/var/local/jenkins/grpc:ro"
 
diff --git a/tools/jenkins/build_interop_stress_image.sh b/tools/run_tests/dockerize/build_interop_stress_image.sh
similarity index 98%
rename from tools/jenkins/build_interop_stress_image.sh
rename to tools/run_tests/dockerize/build_interop_stress_image.sh
index 31ffa75..4407c8d 100755
--- a/tools/jenkins/build_interop_stress_image.sh
+++ b/tools/run_tests/dockerize/build_interop_stress_image.sh
@@ -44,7 +44,7 @@
 #  BUILD_INTEROP_DOCKER_EXTRA_ARGS - optional args to be passed to the
 #    docker run command
 
-cd `dirname $0`/../..
+cd `dirname $0`/../../..
 GRPC_ROOT=`pwd`
 MOUNT_ARGS="-v $GRPC_ROOT:/var/local/jenkins/grpc:ro"
 
diff --git a/tools/jenkins/docker_run.sh b/tools/run_tests/dockerize/docker_run.sh
similarity index 100%
rename from tools/jenkins/docker_run.sh
rename to tools/run_tests/dockerize/docker_run.sh
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/run_tests/dockerize/docker_run_tests.sh
similarity index 97%
rename from tools/jenkins/docker_run_tests.sh
rename to tools/run_tests/dockerize/docker_run_tests.sh
index 2fc66c2..8c6143d 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/run_tests/dockerize/docker_run_tests.sh
@@ -35,6 +35,7 @@
 
 export CONFIG=$config
 export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+export PATH=$PATH:/usr/bin/llvm-symbolizer
 
 # Ensure that programs depending on current-user-ownership of cache directories
 # are satisfied (it's being mounted from outside the image).
diff --git a/tools/run_tests/jobset.py b/tools/run_tests/jobset.py
index e9675fb..d3259e7 100755
--- a/tools/run_tests/jobset.py
+++ b/tools/run_tests/jobset.py
@@ -344,6 +344,7 @@
     self._add_env = add_env
     self.resultset = {}
     self._remaining = None
+    self._start_time = time.time()
 
   def set_remaining(self, remaining):
     self._remaining = remaining
@@ -413,6 +414,11 @@
       if dead: return
       if (not self._travis):
         rstr = '' if self._remaining is None else '%d queued, ' % self._remaining
+        if self._remaining is not None and self._completed > 0:
+          now = time.time()
+          sofar = now - self._start_time
+          remaining = sofar / self._completed * (self._remaining + len(self._running))
+          rstr = 'ETA %.1f sec; %s' % (remaining, rstr)
         message('WAITING', '%s%d jobs running, %d complete, %d failed' % (
             rstr, len(self._running), self._completed, self._failures))
       if platform_string() == 'windows':
@@ -457,7 +463,7 @@
   staging = []
   for x in xs:
     staging.append(x)
-    if len(staging) > 1000:
+    if len(staging) > 5000:
       yield (staging.pop(0), None)
   n = len(staging)
   for i, x in enumerate(staging):
diff --git a/tools/run_tests/package_targets.py b/tools/run_tests/package_targets.py
index 87bc486..820b539 100644
--- a/tools/run_tests/package_targets.py
+++ b/tools/run_tests/package_targets.py
@@ -42,10 +42,10 @@
   for k,v in environ.iteritems():
     docker_args += ['-e', '%s=%s' % (k, v)]
   docker_env = {'DOCKERFILE_DIR': dockerfile_dir,
-                'DOCKER_RUN_SCRIPT': 'tools/jenkins/docker_run.sh',
+                'DOCKER_RUN_SCRIPT': 'tools/run_tests/dockerize/docker_run.sh',
                 'OUTPUT_DIR': 'artifacts'}
   jobspec = jobset.JobSpec(
-          cmdline=['tools/jenkins/build_and_run_docker.sh'] + docker_args,
+          cmdline=['tools/run_tests/dockerize/build_and_run_docker.sh'] + docker_args,
           environ=docker_env,
           shortname='build_package.%s' % (name),
           timeout_seconds=30*60,
diff --git a/tools/run_tests/performance/bq_upload_result.py b/tools/run_tests/performance/bq_upload_result.py
index ebd28f7..fbccf3b 100755
--- a/tools/run_tests/performance/bq_upload_result.py
+++ b/tools/run_tests/performance/bq_upload_result.py
@@ -48,20 +48,47 @@
 _PROJECT_ID='grpc-testing'
 
 
-def _upload_scenario_result_to_bigquery(dataset_id, table_id, result_file):
+def _upload_netperf_latency_csv_to_bigquery(dataset_id, table_id, result_file):
+  with open(result_file, 'r') as f:
+    (col1, col2, col3) = f.read().split(',')
+    latency50 = float(col1.strip()) * 1000
+    latency90 = float(col2.strip()) * 1000
+    latency99 = float(col3.strip()) * 1000
+
+    scenario_result = {
+        'scenario': {
+          'name': 'netperf_tcp_rr'
+        },
+        'summary': {
+          'latency50': latency50,
+          'latency90': latency90,
+          'latency99': latency99
+        }
+    }
+
   bq = big_query_utils.create_big_query()
   _create_results_table(bq, dataset_id, table_id)
 
+  if not _insert_result(bq, dataset_id, table_id, scenario_result, flatten=False):
+    print 'Error uploading result to bigquery.'
+    sys.exit(1)
+
+
+def _upload_scenario_result_to_bigquery(dataset_id, table_id, result_file):
   with open(result_file, 'r') as f:
     scenario_result = json.loads(f.read())
 
+  bq = big_query_utils.create_big_query()
+  _create_results_table(bq, dataset_id, table_id)
+
   if not _insert_result(bq, dataset_id, table_id, scenario_result):
     print 'Error uploading result to bigquery.'
     sys.exit(1)
 
 
-def _insert_result(bq, dataset_id, table_id, scenario_result):
-  _flatten_result_inplace(scenario_result)
+def _insert_result(bq, dataset_id, table_id, scenario_result, flatten=True):
+  if flatten:
+    _flatten_result_inplace(scenario_result)
   _populate_metadata_inplace(scenario_result)
   row = big_query_utils.make_row(str(uuid.uuid4()), scenario_result)
   return big_query_utils.insert_rows(bq,
@@ -127,9 +154,17 @@
                   help='Bigquery "dataset.table" to upload results to.')
 argp.add_argument('--file_to_upload', default='scenario_result.json', type=str,
                   help='Report file to upload.')
+argp.add_argument('--file_format',
+                  choices=['scenario_result','netperf_latency_csv'],
+                  default='scenario_result',
+                  help='Format of the file to upload.')
 
 args = argp.parse_args()
 
 dataset_id, table_id = args.bq_result_table.split('.', 2)
-_upload_scenario_result_to_bigquery(dataset_id, table_id, args.file_to_upload)
+
+if args.file_format == 'netperf_latency_csv':
+  _upload_netperf_latency_csv_to_bigquery(dataset_id, table_id, args.file_to_upload)
+else:
+  _upload_scenario_result_to_bigquery(dataset_id, table_id, args.file_to_upload)
 print 'Successfully uploaded %s to BigQuery.\n' % args.file_to_upload
diff --git a/tools/run_tests/performance/build_performance.sh b/tools/run_tests/performance/build_performance.sh
index 8cfe1c4..352c679 100755
--- a/tools/run_tests/performance/build_performance.sh
+++ b/tools/run_tests/performance/build_performance.sh
@@ -33,8 +33,6 @@
 
 cd $(dirname $0)/../../..
 
-#TODO(jtattermusch): add support for more languages
-
 CONFIG=${CONFIG:-opt}
 
 # build C++ qps worker & driver always - we need at least the driver to
@@ -53,6 +51,9 @@
     (cd ../grpc-java/ &&
       ./gradlew -PskipCodegen=true :grpc-benchmarks:installDist)
     ;;
+  "go")
+    tools/run_tests/performance/build_performance_go.sh
+    ;;
   *)
     tools/run_tests/run_tests.py -l $language -c $CONFIG --build_only -j 8
     ;;
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/run_tests/performance/build_performance_go.sh
similarity index 62%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/run_tests/performance/build_performance_go.sh
index 2fc66c2..3719cc5 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/run_tests/performance/build_performance_go.sh
@@ -27,41 +27,18 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+set -ex
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+cd $(dirname $0)/../../..
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
+export GOPATH=$(pwd)/../gopath
 
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
+# Get grpc-go and the dependencies but get rid of the upstream/master version
+go get google.golang.org/grpc
+rm -rf "${GOPATH}/src/google.golang.org/grpc"
 
-mkdir -p reports
+# Get the revision of grpc-go we want to test
+git clone --recursive ../grpc-go ${GOPATH}/src/google.golang.org/grpc
 
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+(cd ${GOPATH}/src/google.golang.org/grpc/benchmark/worker && go install)
diff --git a/tools/run_tests/performance/kill_workers.sh b/tools/run_tests/performance/kill_workers.sh
index 7a87634..f306f0c 100755
--- a/tools/run_tests/performance/kill_workers.sh
+++ b/tools/run_tests/performance/kill_workers.sh
@@ -52,3 +52,6 @@
 
 # Java
 jps | grep LoadWorker | awk '{print $1}' | xargs kill -9
+
+# Go
+killall -9 worker || true
diff --git a/tools/run_tests/performance/remote_host_prepare.sh b/tools/run_tests/performance/remote_host_prepare.sh
index d7f539a..f81102b 100755
--- a/tools/run_tests/performance/remote_host_prepare.sh
+++ b/tools/run_tests/performance/remote_host_prepare.sh
@@ -39,7 +39,7 @@
 # mess with the results, be rough and reboot the slave here
 # and wait for it to come back online.
 # could also kill jenkins.
-ssh "${USER_AT_HOST}" "killall -9 qps_worker mono node ruby || true"
+ssh "${USER_AT_HOST}" "killall -9 qps_worker mono node ruby worker || true"
 
 # push the current sources to the slave and unpack it.
 scp ../grpc.tar "${USER_AT_HOST}:~/performance_workspace"
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/run_tests/performance/run_netperf.sh
similarity index 62%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/run_tests/performance/run_netperf.sh
index 2fc66c2..298edbe 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/run_tests/performance/run_netperf.sh
@@ -27,41 +27,19 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+set -ex
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+cd $(dirname $0)/../../..
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
+netperf >netperf_latency.txt -P 0 -t TCP_RR -H "$NETPERF_SERVER_HOST" -- -r 1,1 -o P50_LATENCY,P90_LATENCY,P99_LATENCY
 
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
+cat netperf_latency.txt
 
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+if [ "$BQ_RESULT_TABLE" != "" ]
+then
+  tools/run_tests/performance/bq_upload_result.py \
+      --file_to_upload=netperf_latency.txt \
+      --file_format=netperf_latency_csv \
+      --bq_result_table="$BQ_RESULT_TABLE"
+fi
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/run_tests/performance/run_worker_go.sh
similarity index 62%
copy from tools/jenkins/docker_run_tests.sh
copy to tools/run_tests/performance/run_worker_go.sh
index 2fc66c2..6b1242a 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/run_tests/performance/run_worker_go.sh
@@ -27,41 +27,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.
-#
-# This script is invoked by build_docker_and_run_tests.sh inside a docker
-# container. You should never need to call this script on your own.
 
-set -e
+set -ex
 
-export CONFIG=$config
-export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
+cd $(dirname $0)/../../..
 
-# Ensure that programs depending on current-user-ownership of cache directories
-# are satisfied (it's being mounted from outside the image).
-chown $(whoami) $XDG_CACHE_HOME
+export GOPATH=$(pwd)/../gopath
 
-mkdir -p /var/local/git
-git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
-
-mkdir -p reports
-
-$POST_GIT_STEP
-
-exit_code=0
-
-$RUN_TESTS_COMMAND || exit_code=$?
-
-cd reports
-echo '<html><head></head><body>' > index.html
-find . -maxdepth 1 -mindepth 1 -type d | sort | while read d ; do
-  d=${d#*/}
-  n=${d//_/ }
-  echo "<a href='$d/index.html'>$n</a><br />" >> index.html
-done
-echo '</body></html>' >> index.html
-cd ..
-
-zip -r reports.zip reports
-find . -name report.xml | xargs zip reports.zip
-
-exit $exit_code
+${GOPATH}/bin/worker $@
diff --git a/tools/run_tests/performance/run_worker_node.sh b/tools/run_tests/performance/run_worker_node.sh
index 46b6ff0..9a53a31 100755
--- a/tools/run_tests/performance/run_worker_node.sh
+++ b/tools/run_tests/performance/run_worker_node.sh
@@ -29,7 +29,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 source ~/.nvm/nvm.sh
-nvm use 0.12
+nvm use 4
 
 set -ex
 
diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py
index ddbe237..4fe66df 100644
--- a/tools/run_tests/performance/scenario_config.py
+++ b/tools/run_tests/performance/scenario_config.py
@@ -29,11 +29,12 @@
 
 # performance scenario configuration for various languages
 
-SINGLE_MACHINE_CORES=8
 WARMUP_SECONDS=5
 JAVA_WARMUP_SECONDS=15  # Java needs more warmup time for JIT to kick in.
 BENCHMARK_SECONDS=30
 
+SMOKETEST='smoketest'
+
 SECURE_SECARGS = {'use_test_ca': True,
                   'server_host_override': 'foo.test.google.fr'}
 
@@ -69,6 +70,86 @@
 WIDE=64
 
 
+def _get_secargs(is_secure):
+  if is_secure:
+    return SECURE_SECARGS
+  else:
+    return None
+
+
+def remove_nonproto_fields(scenario):
+  """Remove special-purpose that contains some extra info about the scenario
+  but don't belong to the ScenarioConfig protobuf message"""
+  scenario.pop('CATEGORIES', None)
+  scenario.pop('SERVER_LANGUAGE', None)
+  return scenario
+
+
+def _ping_pong_scenario(name, rpc_type,
+                        client_type, server_type,
+                        secure=True,
+                        use_generic_payload=False,
+                        use_unconstrained_client=False,
+                        server_language=None,
+                        server_core_limit=0,
+                        async_server_threads=0,
+                        warmup_seconds=WARMUP_SECONDS,
+                        categories=[]):
+  """Creates a basic ping pong scenario."""
+  scenario = {
+    'name': name,
+    'num_servers': 1,
+    'num_clients': 1,
+    'client_config': {
+      'client_type': client_type,
+      'security_params': _get_secargs(secure),
+      'outstanding_rpcs_per_channel': 1,
+      'client_channels': 1,
+      'async_client_threads': 1,
+      'rpc_type': rpc_type,
+      'load_params': {
+        'closed_loop': {}
+      },
+      'histogram_params': HISTOGRAM_PARAMS,
+    },
+    '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,
+    'benchmark_seconds': BENCHMARK_SECONDS
+  }
+  if use_generic_payload:
+    if server_type != 'ASYNC_GENERIC_SERVER':
+      raise Exception('Use ASYNC_GENERIC_SERVER for generic payload.')
+    scenario['client_config']['payload_config'] = EMPTY_GENERIC_PAYLOAD
+    scenario['server_config']['payload_config'] = EMPTY_GENERIC_PAYLOAD
+  else:
+    # For proto payload, only the client should get the config.
+    scenario['client_config']['payload_config'] = EMPTY_PROTO_PAYLOAD
+
+  if use_unconstrained_client:
+    scenario['num_clients'] = 0  # use as many client as available.
+    # TODO(jtattermusch): for SYNC_CLIENT, this will create 100*64 threads
+    # and that's probably too much (at least for wrapped languages).
+    scenario['client_config']['outstanding_rpcs_per_channel'] = DEEP
+    scenario['client_config']['client_channels'] = WIDE
+    scenario['client_config']['async_client_threads'] = 0
+  else:
+    scenario['client_config']['outstanding_rpcs_per_channel'] = 1
+    scenario['client_config']['client_channels'] = 1
+    scenario['client_config']['async_client_threads'] = 1
+
+  if server_language:
+    # the SERVER_LANGUAGE field is recognized by run_performance_tests.py
+    scenario['SERVER_LANGUAGE'] = server_language
+  if categories:
+    scenario['CATEGORIES'] = categories
+  return scenario
+
+
 class CXXLanguage:
 
   def __init__(self):
@@ -83,205 +164,61 @@
   def scenarios(self):
     # TODO(ctiller): add 70% load latency test
     for secure in [True, False]:
-      if secure:
-        secstr = 'secure'
-        secargs = SECURE_SECARGS
-      else:
-        secstr = 'insecure'
-        secargs = None
+      secstr = 'secure' if secure else 'insecure'
+      smoketest_categories = [SMOKETEST] if secure else None
 
-      yield {
-          'name': 'cpp_generic_async_streaming_ping_pong_%s'
-                  % secstr,
-          'num_servers': 1,
-          'num_clients': 1,
-          'client_config': {
-            'client_type': 'ASYNC_CLIENT',
-            'security_params': secargs,
-            'outstanding_rpcs_per_channel': 1,
-            'client_channels': 1,
-            'async_client_threads': 1,
-            'rpc_type': 'STREAMING',
-            'load_params': {
-              'closed_loop': {}
-            },
-            'payload_config': EMPTY_GENERIC_PAYLOAD,
-            'histogram_params': HISTOGRAM_PARAMS,
-          },
-          'server_config': {
-            'server_type': 'ASYNC_GENERIC_SERVER',
-            'security_params': secargs,
-            'core_limit': 1,
-            'async_server_threads': 1,
-            'payload_config': EMPTY_GENERIC_PAYLOAD,
-          },
-          'warmup_seconds': WARMUP_SECONDS,
-          'benchmark_seconds': BENCHMARK_SECONDS
-      }
-      yield {
-          'name': 'cpp_generic_async_streaming_qps_unconstrained_%s'
-                  % secstr,
-          'num_servers': 1,
-          'num_clients': 0,
-          'client_config': {
-            'client_type': 'ASYNC_CLIENT',
-            'security_params': secargs,
-            'outstanding_rpcs_per_channel': DEEP,
-            'client_channels': WIDE,
-            'async_client_threads': 0,
-            'rpc_type': 'STREAMING',
-            'load_params': {
-              'closed_loop': {}
-            },
-            'payload_config': EMPTY_GENERIC_PAYLOAD,
-            'histogram_params': HISTOGRAM_PARAMS,
-          },
-          'server_config': {
-            'server_type': 'ASYNC_GENERIC_SERVER',
-            'security_params': secargs,
-            'core_limit': SINGLE_MACHINE_CORES/2,
-            'async_server_threads': 0,
-            'payload_config': EMPTY_GENERIC_PAYLOAD,
-          },
-          'warmup_seconds': WARMUP_SECONDS,
-          'benchmark_seconds': BENCHMARK_SECONDS
-      }
-      yield {
-          'name': 'cpp_generic_async_streaming_qps_one_server_core_%s'
-                  % secstr,
-          'num_servers': 1,
-          'num_clients': 0,
-          'client_config': {
-            'client_type': 'ASYNC_CLIENT',
-            'security_params': secargs,
-            'outstanding_rpcs_per_channel': DEEP,
-            'client_channels': WIDE,
-            'async_client_threads': 0,
-            'rpc_type': 'STREAMING',
-            'load_params': {
-              'closed_loop': {}
-            },
-            'payload_config': EMPTY_GENERIC_PAYLOAD,
-            'histogram_params': HISTOGRAM_PARAMS,
-          },
-          'server_config': {
-            'server_type': 'ASYNC_GENERIC_SERVER',
-            'security_params': secargs,
-            'core_limit': 1,
-            'async_server_threads': 1,
-            'payload_config': EMPTY_GENERIC_PAYLOAD,
-          },
-          'warmup_seconds': WARMUP_SECONDS,
-          'benchmark_seconds': BENCHMARK_SECONDS
-      }
-      yield {
-          'name': 'cpp_protobuf_async_streaming_qps_unconstrained_%s'
-                  % secstr,
-          'num_servers': 1,
-          'num_clients': 0,
-          'client_config': {
-            'client_type': 'ASYNC_CLIENT',
-            'security_params': secargs,
-            'outstanding_rpcs_per_channel': DEEP,
-            'client_channels': WIDE,
-            'async_client_threads': 0,
-            'rpc_type': 'STREAMING',
-            'load_params': {
-              'closed_loop': {}
-            },
-            'payload_config': EMPTY_PROTO_PAYLOAD,
-            'histogram_params': HISTOGRAM_PARAMS,
-          },
-          'server_config': {
-            'server_type': 'ASYNC_SERVER',
-            'security_params': secargs,
-            'core_limit': SINGLE_MACHINE_CORES/2,
-            'async_server_threads': 0,
-          },
-          'warmup_seconds': WARMUP_SECONDS,
-          'benchmark_seconds': BENCHMARK_SECONDS
-      }
-      yield {
-          'name': 'cpp_protobuf_async_streaming_ping_pong_%s'
-                  % secstr,
-          'num_servers': 1,
-          'num_clients': 1,
-          'client_config': {
-            'client_type': 'ASYNC_CLIENT',
-            'security_params': secargs,
-            'outstanding_rpcs_per_channel': 1,
-            'client_channels': 1,
-            'async_client_threads': 1,
-            'rpc_type': 'STREAMING',
-            'load_params': {
-              'closed_loop': {}
-            },
-            'payload_config': EMPTY_PROTO_PAYLOAD,
-            'histogram_params': HISTOGRAM_PARAMS,
-          },
-          'server_config': {
-            'server_type': 'ASYNC_SERVER',
-            'security_params': secargs,
-            'core_limit': 1,
-            'async_server_threads': 1,
-          },
-          'warmup_seconds': WARMUP_SECONDS,
-          'benchmark_seconds': BENCHMARK_SECONDS
-      }
-      yield {
-          'name': 'cpp_protobuf_sync_unary_ping_pong_%s'
-                  % secstr,
-          'num_servers': 1,
-          'num_clients': 1,
-          'client_config': {
-            'client_type': 'SYNC_CLIENT',
-            'security_params': secargs,
-            'outstanding_rpcs_per_channel': 1,
-            'client_channels': 1,
-            'async_client_threads': 0,
-            'rpc_type': 'UNARY',
-            'load_params': {
-              'closed_loop': {}
-            },
-            'payload_config': EMPTY_PROTO_PAYLOAD,
-            'histogram_params': HISTOGRAM_PARAMS,
-          },
-          'server_config': {
-            'server_type': 'SYNC_SERVER',
-            'security_params': secargs,
-            'core_limit': 1,
-            'async_server_threads': 0,
-          },
-          'warmup_seconds': WARMUP_SECONDS,
-          'benchmark_seconds': BENCHMARK_SECONDS
-      }
-      yield {
-          'name': 'cpp_protobuf_async_unary_ping_pong_%s'
-                  % secstr,
-          'num_servers': 1,
-          'num_clients': 1,
-          'client_config': {
-            'client_type': 'ASYNC_CLIENT',
-            'security_params': secargs,
-            'outstanding_rpcs_per_channel': 1,
-            'client_channels': 1,
-            'async_client_threads': 1,
-            'rpc_type': 'UNARY',
-            'load_params': {
-              'closed_loop': {}
-            },
-            'payload_config': EMPTY_PROTO_PAYLOAD,
-            'histogram_params': HISTOGRAM_PARAMS,
-          },
-          'server_config': {
-            'server_type': 'ASYNC_SERVER',
-            'security_params': secargs,
-            'core_limit': 1,
-            'async_server_threads': 1,
-          },
-          'warmup_seconds': WARMUP_SECONDS,
-          'benchmark_seconds': BENCHMARK_SECONDS
-      }
+      yield _ping_pong_scenario(
+          'cpp_generic_async_streaming_ping_pong_%s' % secstr, rpc_type='STREAMING',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER',
+          use_generic_payload=True, server_core_limit=1, async_server_threads=1,
+          secure=secure,
+          categories=smoketest_categories)
+
+      yield _ping_pong_scenario(
+          'cpp_protobuf_async_streaming_ping_pong_%s' % secstr, rpc_type='STREAMING',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+          server_core_limit=1, async_server_threads=1,
+          secure=secure)
+
+      yield _ping_pong_scenario(
+          'cpp_protobuf_async_unary_ping_pong_%s' % secstr, rpc_type='UNARY',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+          server_core_limit=1, async_server_threads=1,
+          secure=secure,
+          categories=smoketest_categories)
+
+      yield _ping_pong_scenario(
+          'cpp_protobuf_sync_unary_ping_pong_%s' % secstr, rpc_type='UNARY',
+          client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+          server_core_limit=1, async_server_threads=1,
+          secure=secure)
+
+      yield _ping_pong_scenario(
+          'cpp_protobuf_async_unary_qps_unconstrained_%s' % secstr, rpc_type='UNARY',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+          use_unconstrained_client=True,
+          secure=secure,
+          categories=smoketest_categories)
+
+      yield _ping_pong_scenario(
+          'cpp_protobuf_async_streaming_qps_unconstrained_%s' % secstr, rpc_type='STREAMING',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+          use_unconstrained_client=True,
+          secure=secure)
+
+      yield _ping_pong_scenario(
+          'cpp_generic_async_streaming_qps_unconstrained_%s' % secstr, rpc_type='STREAMING',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER',
+          use_unconstrained_client=True, use_generic_payload=True,
+          secure=secure,
+          categories=smoketest_categories)
+
+      yield _ping_pong_scenario(
+          'cpp_generic_async_streaming_qps_one_server_core_%s' % secstr, rpc_type='STREAMING',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER',
+          use_unconstrained_client=True, use_generic_payload=True,
+          server_core_limit=1, async_server_threads=1,
+          secure=secure)
 
   def __str__(self):
     return 'c++'
@@ -299,113 +236,46 @@
     return 100
 
   def scenarios(self):
-    secargs = SECURE_SECARGS
-    yield {
-        'name': 'csharp_generic_async_streaming_ping_pong',
-        'num_servers': 1,
-        'num_clients': 1,
-        'client_config': {
-          'client_type': 'ASYNC_CLIENT',
-          'security_params': secargs,
-          'outstanding_rpcs_per_channel': 1,
-          'client_channels': 1,
-          'async_client_threads': 1,
-          'rpc_type': 'STREAMING',
-          'load_params': {
-            'closed_loop': {}
-          },
-          'payload_config': EMPTY_GENERIC_PAYLOAD,
-          'histogram_params': HISTOGRAM_PARAMS,
-        },
-        'server_config': {
-          'server_type': 'ASYNC_GENERIC_SERVER',
-          'security_params': secargs,
-          'core_limit': 0,
-          'async_server_threads': 0,
-          'payload_config': EMPTY_GENERIC_PAYLOAD,
-        },
-        'warmup_seconds': WARMUP_SECONDS,
-        'benchmark_seconds': BENCHMARK_SECONDS
-    }
-    yield {
-        'name': 'csharp_protobuf_async_unary_ping_pong',
-        'num_servers': 1,
-        'num_clients': 1,
-        'client_config': {
-          'client_type': 'ASYNC_CLIENT',
-          'security_params': secargs,
-          'outstanding_rpcs_per_channel': 1,
-          'client_channels': 1,
-          'async_client_threads': 1,
-          'rpc_type': 'UNARY',
-          'load_params': {
-            'closed_loop': {}
-          },
-          'payload_config': EMPTY_PROTO_PAYLOAD,
-          'histogram_params': HISTOGRAM_PARAMS,
-        },
-        'server_config': {
-          'server_type': 'ASYNC_SERVER',
-          'security_params': secargs,
-          'core_limit': 0,
-          'async_server_threads': 0,
-        },
-        'warmup_seconds': WARMUP_SECONDS,
-        'benchmark_seconds': BENCHMARK_SECONDS
-    }
-    yield {
-        'name': 'csharp_protobuf_sync_to_async_unary_ping_pong',
-        'num_servers': 1,
-        'num_clients': 1,
-        'client_config': {
-          'client_type': 'SYNC_CLIENT',
-          'security_params': secargs,
-          'outstanding_rpcs_per_channel': 1,
-          'client_channels': 1,
-          'async_client_threads': 1,
-          'rpc_type': 'UNARY',
-          'load_params': {
-            'closed_loop': {}
-          },
-          'payload_config': EMPTY_PROTO_PAYLOAD,
-          'histogram_params': HISTOGRAM_PARAMS,
-        },
-        'server_config': {
-          'server_type': 'ASYNC_SERVER',
-          'security_params': secargs,
-          'core_limit': 0,
-          'async_server_threads': 0,
-        },
-        'warmup_seconds': WARMUP_SECONDS,
-        'benchmark_seconds': BENCHMARK_SECONDS
-    }
-    yield {
-        'name': 'csharp_to_cpp_protobuf_sync_unary_ping_pong',
-        'num_servers': 1,
-        'num_clients': 1,
-        'client_config': {
-          'client_type': 'SYNC_CLIENT',
-          'security_params': secargs,
-          'outstanding_rpcs_per_channel': 1,
-          'client_channels': 1,
-          'async_client_threads': 1,
-          'rpc_type': 'UNARY',
-          'load_params': {
-            'closed_loop': {}
-          },
-          'payload_config': EMPTY_PROTO_PAYLOAD,
-          'histogram_params': HISTOGRAM_PARAMS,
-        },
-        'server_config': {
-          'server_type': 'SYNC_SERVER',
-          'security_params': secargs,
-          'core_limit': 1,
-          'async_server_threads': 1,
-        },
-        'warmup_seconds': WARMUP_SECONDS,
-        'benchmark_seconds': BENCHMARK_SECONDS,
-        'SERVER_LANGUAGE': 'c++'  # recognized by run_performance_tests.py
-    }
+    yield _ping_pong_scenario(
+        'csharp_generic_async_streaming_ping_pong', rpc_type='STREAMING',
+        client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER',
+        use_generic_payload=True,
+        categories=[SMOKETEST])
+
+    yield _ping_pong_scenario(
+        'csharp_protobuf_async_streaming_ping_pong', rpc_type='STREAMING',
+        client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER')
+
+    yield _ping_pong_scenario(
+        'csharp_protobuf_async_unary_ping_pong', rpc_type='UNARY',
+        client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+        categories=[SMOKETEST])
+
+    yield _ping_pong_scenario(
+        'csharp_protobuf_sync_to_async_unary_ping_pong', rpc_type='UNARY',
+        client_type='SYNC_CLIENT', server_type='ASYNC_SERVER')
+
+    yield _ping_pong_scenario(
+        'csharp_protobuf_async_unary_qps_unconstrained', rpc_type='UNARY',
+        client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+        use_unconstrained_client=True,
+        categories=[SMOKETEST])
+
+    yield _ping_pong_scenario(
+        'csharp_protobuf_async_streaming_qps_unconstrained', rpc_type='STREAMING',
+        client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+        use_unconstrained_client=True)
+
+    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,
+        categories=[SMOKETEST])
+
+    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)
 
   def __str__(self):
     return 'csharp'
@@ -424,34 +294,45 @@
     return 200
 
   def scenarios(self):
-    # TODO(jtattermusch): add more scenarios
-    secargs = SECURE_SECARGS
-    yield {
-        'name': 'node_protobuf_unary_ping_pong',
-        'num_servers': 1,
-        'num_clients': 1,
-        'client_config': {
-          'client_type': 'ASYNC_CLIENT',
-          'security_params': secargs,
-          'outstanding_rpcs_per_channel': 1,
-          'client_channels': 1,
-          'async_client_threads': 1,
-          'rpc_type': 'UNARY',
-          'load_params': {
-            'closed_loop': {}
-          },
-          'payload_config': EMPTY_PROTO_PAYLOAD,
-          'histogram_params': HISTOGRAM_PARAMS,
-        },
-        'server_config': {
-          'server_type': 'ASYNC_SERVER',
-          'security_params': secargs,
-          'core_limit': 0,
-          'async_server_threads': 1,
-        },
-        'warmup_seconds': WARMUP_SECONDS,
-        'benchmark_seconds': BENCHMARK_SECONDS
-    }
+    # TODO(jtattermusch): make this scenario work
+    #yield _ping_pong_scenario(
+    #    'node_generic_async_streaming_ping_pong', rpc_type='STREAMING',
+    #    client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER',
+    #    use_generic_payload=True)
+
+    # TODO(jtattermusch): make this scenario work
+    #yield _ping_pong_scenario(
+    #    'node_protobuf_async_streaming_ping_pong', rpc_type='STREAMING',
+    #    client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER')
+
+    yield _ping_pong_scenario(
+        'node_protobuf_unary_ping_pong', rpc_type='UNARY',
+        client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+        categories=[SMOKETEST])
+
+    yield _ping_pong_scenario(
+        'node_protobuf_async_unary_qps_unconstrained', rpc_type='UNARY',
+        client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+        use_unconstrained_client=True,
+        categories=[SMOKETEST])
+
+    # TODO(jtattermusch): make this scenario work
+    #yield _ping_pong_scenario(
+    #    'node_protobuf_async_streaming_qps_unconstrained', rpc_type='STREAMING',
+    #    client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+    #    use_unconstrained_client=True)
+
+    # TODO(jtattermusch): make this scenario work
+    #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)
+
+    # 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)
 
   def __str__(self):
     return 'node'
@@ -468,114 +349,51 @@
     return 500
 
   def scenarios(self):
-    yield {
-        'name': 'python_to_cpp_protobuf_streaming_ping_pong',
-        'num_servers': 1,
-        'num_clients': 1,
-        'client_config': {
-          'client_type': 'ASYNC_CLIENT',
-          'security_params': SECURE_SECARGS,
-          'outstanding_rpcs_per_channel': 1,
-          'client_channels': 1,
-          'async_client_threads': 1,
-          'rpc_type': 'STREAMING',
-          'load_params': {
-            'closed_loop': {}
-          },
-          'payload_config': EMPTY_PROTO_PAYLOAD,
-          'histogram_params': HISTOGRAM_PARAMS,
-        },
-        'server_config': {
-          'server_type': 'SYNC_SERVER',
-          'security_params': SECURE_SECARGS,
-          'core_limit': 0,
-          'async_server_threads': 1,
-        },
-        'warmup_seconds': WARMUP_SECONDS,
-        'benchmark_seconds': BENCHMARK_SECONDS,
-        'SERVER_LANGUAGE': 'c++' 
-    }
-    yield {
-        'name': 'python_protobuf_sync_unary_ping_pong',
-        'num_servers': 1,
-        'num_clients': 1,
-        'client_config': {
-          'client_type': 'SYNC_CLIENT',
-          'security_params': SECURE_SECARGS,
-          'outstanding_rpcs_per_channel': 1,
-          'client_channels': 1,
-          'async_client_threads': 1,
-          'rpc_type': 'UNARY',
-          'load_params': {
-            'closed_loop': {}
-          },
-          'payload_config': EMPTY_PROTO_PAYLOAD,
-          'histogram_params': HISTOGRAM_PARAMS,
-        },
-        'server_config': {
-          'server_type': 'SYNC_SERVER',
-          'security_params': SECURE_SECARGS,
-          'core_limit': 0,
-          'async_server_threads': 1,
-        },
-        'warmup_seconds': WARMUP_SECONDS,
-        'benchmark_seconds': BENCHMARK_SECONDS,
-    }
-    yield {
-        'name': 'python_protobuf_async_unary_ping_pong',
-        'num_servers': 1,
-        'num_clients': 1,
-        'client_config': {
-          'client_type': 'ASYNC_CLIENT',
-          'security_params': SECURE_SECARGS,
-          'outstanding_rpcs_per_channel': 1,
-          'client_channels': 1,
-          'async_client_threads': 1,
-            'rpc_type': 'UNARY',
-            'load_params': {
-              'closed_loop': {}
-            },
-            'payload_config': EMPTY_PROTO_PAYLOAD,
-            'histogram_params': HISTOGRAM_PARAMS,
-          },
-          'server_config': {
-            'server_type': 'SYNC_SERVER',
-            'security_params': SECURE_SECARGS,
-            'core_limit': 0,
-            'async_server_threads': 1,
-          },
-          'warmup_seconds': WARMUP_SECONDS,
-          'benchmark_seconds': BENCHMARK_SECONDS,
-    }
-    yield {
-        'name': 'python_to_cpp_single_channel_throughput',
-        'num_servers': 1,
-        'num_clients': 1,
-        'client_config': {
-          'client_type': 'ASYNC_CLIENT',
-          'security_params': SECURE_SECARGS,
-          'outstanding_rpcs_per_channel': 1,
-          'client_channels': 1,
-          'async_client_threads': 1,
-          'rpc_type': 'STREAMING',
-          'load_params': {
-            'closed_loop': {}
-          },
-          'payload_config': BIG_GENERIC_PAYLOAD,
-          'histogram_params': HISTOGRAM_PARAMS,
-        },
-        'server_config': {
-          'server_type': 'ASYNC_GENERIC_SERVER',
-          'security_params': SECURE_SECARGS,
-          'core_limit': SINGLE_MACHINE_CORES/2,
-          'async_server_threads': 1,
-          'payload_config': BIG_GENERIC_PAYLOAD,
-        },
-        'warmup_seconds': WARMUP_SECONDS,
-        'benchmark_seconds': BENCHMARK_SECONDS,
-        'SERVER_LANGUAGE': 'c++'
-    }
-      
+    # TODO(issue #6522): Empty streaming requests does not work for python
+    #yield _ping_pong_scenario(
+    #    'python_generic_async_streaming_ping_pong', rpc_type='STREAMING',
+    #    client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER',
+    #    use_generic_payload=True,
+    #    categories=[SMOKETEST])
+
+    yield _ping_pong_scenario(
+        'python_protobuf_async_streaming_ping_pong', rpc_type='STREAMING',
+        client_type='ASYNC_CLIENT', server_type='SYNC_SERVER')
+
+    yield _ping_pong_scenario(
+        'python_protobuf_async_unary_ping_pong', rpc_type='UNARY',
+        client_type='ASYNC_CLIENT', server_type='SYNC_SERVER')
+
+    yield _ping_pong_scenario(
+        'python_protobuf_sync_unary_ping_pong', rpc_type='UNARY',
+        client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+        categories=[SMOKETEST])
+
+    # TODO(jtattermusch): 
+    # The qps_worker server gets thread starved with ~6400 threads, the GIL
+    # enforces that a single thread runs at a time, with no way to set thread
+    # priority.  Re-evaluate after changing DEEP and WIDE.
+    #yield _ping_pong_scenario(
+    #    'python_protobuf_sync_unary_qps_unconstrained', rpc_type='UNARY',
+    #    client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+    #    use_unconstrained_client=True)
+
+    yield _ping_pong_scenario(
+        'python_protobuf_async_streaming_qps_unconstrained', rpc_type='STREAMING',
+        client_type='ASYNC_CLIENT', server_type='SYNC_SERVER',
+        use_unconstrained_client=True)
+
+    yield _ping_pong_scenario(
+        'python_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,
+        categories=[SMOKETEST])
+
+    yield _ping_pong_scenario(
+        'python_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)
+
   def __str__(self):
     return 'python'
 
@@ -592,34 +410,37 @@
     return 300
 
   def scenarios(self):
-    # TODO(jtattermusch): add more scenarios
-    secargs = SECURE_SECARGS
-    yield {
-        'name': 'ruby_protobuf_unary_ping_pong',
-        'num_servers': 1,
-        'num_clients': 1,
-        'client_config': {
-          'client_type': 'SYNC_CLIENT',
-          'security_params': secargs,
-          'outstanding_rpcs_per_channel': 1,
-          'client_channels': 1,
-          'async_client_threads': 1,
-          'rpc_type': 'UNARY',
-          'load_params': {
-            'closed_loop': {}
-          },
-          'payload_config': EMPTY_PROTO_PAYLOAD,
-          'histogram_params': HISTOGRAM_PARAMS,
-        },
-        'server_config': {
-          'server_type': 'SYNC_SERVER',
-          'security_params': secargs,
-          'core_limit': 0,
-          'async_server_threads': 1,
-        },
-        'warmup_seconds': WARMUP_SECONDS,
-        'benchmark_seconds': BENCHMARK_SECONDS
-    }
+    yield _ping_pong_scenario(
+        'ruby_protobuf_sync_streaming_ping_pong', rpc_type='STREAMING',
+        client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+        categories=[SMOKETEST])
+
+    yield _ping_pong_scenario(
+        'ruby_protobuf_unary_ping_pong', rpc_type='UNARY',
+        client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+        categories=[SMOKETEST])
+
+    # TODO: scenario reports QPS of 0.0
+    #yield _ping_pong_scenario(
+    #    'ruby_protobuf_sync_unary_qps_unconstrained', rpc_type='UNARY',
+    #    client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+    #    use_unconstrained_client=True)
+
+    # TODO: scenario reports QPS of 0.0
+    #yield _ping_pong_scenario(
+    #    'ruby_protobuf_sync_streaming_qps_unconstrained', rpc_type='STREAMING',
+    #    client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+    #    use_unconstrained_client=True)
+
+    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)
+
+    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)
 
   def __str__(self):
     return 'ruby'
@@ -638,46 +459,134 @@
     return 400
 
   def scenarios(self):
-    # TODO(jtattermusch): add more scenarios
     for secure in [True, False]:
-      if secure:
-        secstr = 'secure'
-        secargs = SECURE_SECARGS
-      else:
-        secstr = 'insecure'
-        secargs = None
+      secstr = 'secure' if secure else 'insecure'
+      smoketest_categories = [SMOKETEST] if secure else None
 
-      yield {
-          'name': 'java_protobuf_unary_ping_pong_%s' % secstr,
-          'num_servers': 1,
-          'num_clients': 1,
-          'client_config': {
-            'client_type': 'SYNC_CLIENT',
-            'security_params': secargs,
-            'outstanding_rpcs_per_channel': 1,
-            'client_channels': 1,
-            'async_client_threads': 1,
-            'rpc_type': 'UNARY',
-            'load_params': {
-              'closed_loop': {}
-            },
-            'payload_config': EMPTY_PROTO_PAYLOAD,
-            'histogram_params': HISTOGRAM_PARAMS,
-          },
-          'server_config': {
-            'server_type': 'SYNC_SERVER',
-            'security_params': secargs,
-            'core_limit': 0,
-            'async_server_threads': 1,
-          },
-          'warmup_seconds': JAVA_WARMUP_SECONDS,
-          'benchmark_seconds': BENCHMARK_SECONDS
-      }
+      yield _ping_pong_scenario(
+          'java_generic_async_streaming_ping_pong_%s' % secstr, rpc_type='STREAMING',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER',
+          use_generic_payload=True, async_server_threads=1,
+          secure=secure, warmup_seconds=JAVA_WARMUP_SECONDS,
+          categories=smoketest_categories)
+
+      yield _ping_pong_scenario(
+          'java_protobuf_async_streaming_ping_pong_%s' % secstr, rpc_type='STREAMING',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+          async_server_threads=1,
+          secure=secure, warmup_seconds=JAVA_WARMUP_SECONDS)
+
+      yield _ping_pong_scenario(
+          'java_protobuf_async_unary_ping_pong_%s' % secstr, rpc_type='UNARY',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+          async_server_threads=1,
+          secure=secure, warmup_seconds=JAVA_WARMUP_SECONDS,
+          categories=smoketest_categories)
+
+      yield _ping_pong_scenario(
+          'java_protobuf_unary_ping_pong_%s' % secstr, rpc_type='UNARY',
+          client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+          async_server_threads=1,
+          secure=secure, warmup_seconds=JAVA_WARMUP_SECONDS)
+
+      yield _ping_pong_scenario(
+          'java_protobuf_async_unary_qps_unconstrained_%s' % secstr, rpc_type='UNARY',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+          use_unconstrained_client=True,
+          secure=secure, warmup_seconds=JAVA_WARMUP_SECONDS,
+          categories=smoketest_categories)
+
+      yield _ping_pong_scenario(
+          'java_protobuf_async_streaming_qps_unconstrained_%s' % secstr, rpc_type='STREAMING',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
+          use_unconstrained_client=True,
+          secure=secure, warmup_seconds=JAVA_WARMUP_SECONDS)
+
+      yield _ping_pong_scenario(
+          'java_generic_async_streaming_qps_unconstrained_%s' % secstr, rpc_type='STREAMING',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER',
+          use_unconstrained_client=True, use_generic_payload=True,
+          secure=secure, warmup_seconds=JAVA_WARMUP_SECONDS)
+
+      yield _ping_pong_scenario(
+          'java_generic_async_streaming_qps_one_server_core_%s' % secstr, rpc_type='STREAMING',
+          client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER',
+          use_unconstrained_client=True, use_generic_payload=True,
+          async_server_threads=1,
+          secure=secure, warmup_seconds=JAVA_WARMUP_SECONDS)
+
+      # TODO(jtattermusch): add scenarios java vs C++ 
 
   def __str__(self):
     return 'java'
 
 
+class GoLanguage:
+
+  def __init__(self):
+    pass
+    self.safename = str(self)
+
+  def worker_cmdline(self):
+    return ['tools/run_tests/performance/run_worker_go.sh']
+
+  def worker_port_offset(self):
+    return 600
+
+  def scenarios(self):
+    for secure in [True, False]:
+      secstr = 'secure' if secure else 'insecure'
+      smoketest_categories = [SMOKETEST] if secure else None
+
+      # ASYNC_GENERIC_SERVER for Go actually uses a sync streaming server,
+      # but that's mostly because of lack of better name of the enum value. 
+      yield _ping_pong_scenario(
+          'go_generic_sync_streaming_ping_pong_%s' % secstr, rpc_type='STREAMING',
+          client_type='SYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER',
+          use_generic_payload=True, async_server_threads=1,
+          secure=secure,
+          categories=smoketest_categories)
+
+      yield _ping_pong_scenario(
+          'go_protobuf_sync_streaming_ping_pong_%s' % secstr, rpc_type='STREAMING',
+          client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+          async_server_threads=1,
+          secure=secure)
+
+      yield _ping_pong_scenario(
+          'go_protobuf_sync_unary_ping_pong_%s' % secstr, rpc_type='UNARY',
+          client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+          async_server_threads=1,
+          secure=secure,
+          categories=smoketest_categories)
+
+      yield _ping_pong_scenario(
+          'go_protobuf_sync_unary_qps_unconstrained_%s' % secstr, rpc_type='UNARY',
+          client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+          use_unconstrained_client=True,
+          secure=secure,
+          categories=smoketest_categories)
+
+      yield _ping_pong_scenario(
+          'go_protobuf_sync_streaming_qps_unconstrained_%s' % secstr, rpc_type='STREAMING',
+          client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
+          use_unconstrained_client=True,
+          secure=secure)
+
+      # ASYNC_GENERIC_SERVER for Go actually uses a sync streaming server,
+      # but that's mostly because of lack of better name of the enum value.
+      yield _ping_pong_scenario(
+          'go_generic_sync_streaming_qps_unconstrained_%s' % secstr, rpc_type='STREAMING',
+          client_type='SYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER',
+          use_unconstrained_client=True, use_generic_payload=True,
+          secure=secure)
+
+      # TODO(jtattermusch): add scenarios go vs C++ 
+
+  def __str__(self):
+    return 'go'
+
+
 LANGUAGES = {
     'c++' : CXXLanguage(),
     'csharp' : CSharpLanguage(),
@@ -685,4 +594,5 @@
     'ruby' : RubyLanguage(),
     'java' : JavaLanguage(),
     'python' : PythonLanguage(),
+    'go' : GoLanguage(),
 }
diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py
index 758be93..e813473 100755
--- a/tools/run_tests/run_interop_tests.py
+++ b/tools/run_tests/run_interop_tests.py
@@ -542,7 +542,7 @@
     env['BUILD_INTEROP_DOCKER_EXTRA_ARGS'] = \
       '-v %s:/root/.composer/auth.json:ro' % host_file
   build_job = jobset.JobSpec(
-          cmdline=['tools/jenkins/build_interop_image.sh'],
+          cmdline=['tools/run_tests/dockerize/build_interop_image.sh'],
           environ=env,
           shortname='build_docker_%s' % (language),
           timeout_seconds=30*60)
diff --git a/tools/run_tests/run_performance_tests.py b/tools/run_tests/run_performance_tests.py
index 5519666..a7728e7 100755
--- a/tools/run_tests/run_performance_tests.py
+++ b/tools/run_tests/run_performance_tests.py
@@ -89,7 +89,7 @@
   jobspec = jobset.JobSpec(
       cmdline=cmdline,
       shortname=shortname,
-      timeout_seconds=30*60)
+      timeout_seconds=2*60*60)
   return QpsWorkerJob(jobspec, language, host_and_port)
 
 
@@ -131,6 +131,36 @@
       verbose_success=True)
 
 
+def create_netperf_jobspec(server_host='localhost', client_host=None,
+                           bq_result_table=None):
+  """Runs netperf benchmark."""
+  cmd = 'NETPERF_SERVER_HOST="%s" ' % server_host
+  if bq_result_table:
+    cmd += 'BQ_RESULT_TABLE="%s" ' % bq_result_table
+  if client_host:
+    # If netperf is running remotely, the env variables populated by Jenkins
+    # won't be available on the client, but we need them for uploading results
+    # to BigQuery.
+    jenkins_job_name = os.getenv('JOB_NAME')
+    if jenkins_job_name:
+      cmd += 'JOB_NAME="%s" ' % jenkins_job_name
+    jenkins_build_number = os.getenv('BUILD_NUMBER')
+    if jenkins_build_number:
+      cmd += 'BUILD_NUMBER="%s" ' % jenkins_build_number
+
+  cmd += 'tools/run_tests/performance/run_netperf.sh'
+  if client_host:
+    user_at_host = '%s@%s' % (_REMOTE_HOST_USERNAME, client_host)
+    cmd = 'ssh %s "cd ~/performance_workspace/grpc/ && "%s' % (user_at_host, pipes.quote(cmd))
+
+  return jobset.JobSpec(
+      cmdline=[cmd],
+      shortname='netperf',
+      timeout_seconds=60,
+      shell=True,
+      verbose_success=True)
+
+
 def archive_repo(languages):
   """Archives local version of repo including submodules."""
   cmdline=['tar', '-cf', '../grpc.tar', '../grpc/']
@@ -244,34 +274,51 @@
 
 
 def create_scenarios(languages, workers_by_lang, remote_host=None, regex='.*',
-                     bq_result_table=None):
+                     category='all', bq_result_table=None,
+                     netperf=False, netperf_hosts=[]):
   """Create jobspecs for scenarios to run."""
   all_workers = [worker
                  for workers in workers_by_lang.values()
                  for worker in workers]
   scenarios = []
+
+  if netperf:
+    if not netperf_hosts:
+      netperf_server='localhost'
+      netperf_client=None
+    elif len(netperf_hosts) == 1:
+      netperf_server=netperf_hosts[0]
+      netperf_client=netperf_hosts[0]
+    else:
+      netperf_server=netperf_hosts[0]
+      netperf_client=netperf_hosts[1]
+    scenarios.append(create_netperf_jobspec(server_host=netperf_server,
+                                            client_host=netperf_client,
+                                            bq_result_table=bq_result_table))
+
   for language in languages:
     for scenario_json in language.scenarios():
       if re.search(args.regex, scenario_json['name']):
-        workers = workers_by_lang[str(language)]
-        # 'SERVER_LANGUAGE' is an indicator for this script to pick
-        # a server in different language. It doesn't belong to the Scenario
-        # schema, so we also need to remove it.
-        custom_server_lang = scenario_json.pop('SERVER_LANGUAGE', None)
-        if custom_server_lang:
-          if not workers_by_lang.get(custom_server_lang, []):
-            print 'Warning: Skipping scenario %s as' % scenario_json['name']
-            print('SERVER_LANGUAGE is set to %s yet the language has '
-                  'not been selected with -l' % custom_server_lang)
-            continue
-          for idx in range(0, scenario_json['num_servers']):
-            # replace first X workers by workers of a different language
-            workers[idx] = workers_by_lang[custom_server_lang][idx]
-        scenario = create_scenario_jobspec(scenario_json,
-                                           workers,
-                                           remote_host=remote_host,
-                                           bq_result_table=bq_result_table)
-        scenarios.append(scenario)
+        if category in scenario_json.get('CATEGORIES', []) or category == 'all':
+          workers = workers_by_lang[str(language)]
+          # 'SERVER_LANGUAGE' is an indicator for this script to pick
+          # a server in different language.
+          custom_server_lang = scenario_json.get('SERVER_LANGUAGE', None)
+          scenario_json = scenario_config.remove_nonproto_fields(scenario_json)
+          if custom_server_lang:
+            if not workers_by_lang.get(custom_server_lang, []):
+              print 'Warning: Skipping scenario %s as' % scenario_json['name']
+              print('SERVER_LANGUAGE is set to %s yet the language has '
+                    'not been selected with -l' % custom_server_lang)
+              continue
+            for idx in range(0, scenario_json['num_servers']):
+              # replace first X workers by workers of a different language
+              workers[idx] = workers_by_lang[custom_server_lang][idx]
+          scenario = create_scenario_jobspec(scenario_json,
+                                             workers,
+                                             remote_host=remote_host,
+                                             bq_result_table=bq_result_table)
+          scenarios.append(scenario)
 
   # the very last scenario requests shutting down the workers.
   scenarios.append(create_quit_jobspec(all_workers, remote_host=remote_host))
@@ -298,7 +345,7 @@
 argp.add_argument('-l', '--language',
                   choices=['all'] + sorted(scenario_config.LANGUAGES.keys()),
                   nargs='+',
-                  default=['all'],
+                  required=True,
                   help='Languages to benchmark.')
 argp.add_argument('--remote_driver_host',
                   default=None,
@@ -311,6 +358,15 @@
                   help='Regex to select scenarios to run.')
 argp.add_argument('--bq_result_table', default=None, type=str,
                   help='Bigquery "dataset.table" to upload results to.')
+argp.add_argument('--category',
+                  choices=['smoketest','all'],
+                  default='smoketest',
+                  help='Select a category of tests to run. Smoketest runs by default.')
+argp.add_argument('--netperf',
+                  default=False,
+                  action='store_const',
+                  const=True,
+                  help='Run netperf benchmark as one of the scenarios.')
 
 args = argp.parse_args()
 
@@ -354,7 +410,11 @@
                                workers_by_lang=worker_addresses,
                                remote_host=args.remote_driver_host,
                                regex=args.regex,
-                               bq_result_table=args.bq_result_table)
+                               category=args.category,
+                               bq_result_table=args.bq_result_table,
+                               netperf=args.netperf,
+                               netperf_hosts=args.remote_worker_host)
+
   if not scenarios:
     raise Exception('No scenarios to run')
 
diff --git a/tools/run_tests/run_stress_tests.py b/tools/run_tests/run_stress_tests.py
index 0ba8f51..e42ee24 100755
--- a/tools/run_tests/run_stress_tests.py
+++ b/tools/run_tests/run_stress_tests.py
@@ -195,7 +195,7 @@
     tag = 'grpc_interop_stress_%s:%s' % (language.safename, uuid.uuid4())
   env = {'INTEROP_IMAGE': tag,
          'BASE_NAME': 'grpc_interop_stress_%s' % language.safename}
-  build_job = jobset.JobSpec(cmdline=['tools/jenkins/build_interop_stress_image.sh'],
+  build_job = jobset.JobSpec(cmdline=['tools/run_tests/dockerize/build_interop_stress_image.sh'],
                              environ=env,
                              shortname='build_docker_%s' % (language),
                              timeout_seconds=30 * 60)
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index dea481e..fd5564a 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -153,52 +153,64 @@
   def test_specs(self):
     out = []
     binaries = get_c_tests(self.args.travis, self.test_lang)
+    POLLING_STRATEGIES = {
+      'windows': ['all'],
+      'mac': ['all'],
+      'posix': ['all'],
+      'linux': ['poll', 'legacy']
+    }
     for target in binaries:
-      if self.config.build_config in target['exclude_configs']:
-        continue
-      if self.platform == 'windows':
-        binary = 'vsprojects/%s%s/%s.exe' % (
-            'x64/' if self.args.arch == 'x64' else '',
-            _MSBUILD_CONFIG[self.config.build_config],
-            target['name'])
-      else:
-        binary = 'bins/%s/%s' % (self.config.build_config, target['name'])
-      if os.path.isfile(binary):
-        if 'gtest' in target and target['gtest']:
-          # here we parse the output of --gtest_list_tests to build up a
-          # complete list of the tests contained in a binary
-          # for each test, we then add a job to run, filtering for just that
-          # test
-          with open(os.devnull, 'w') as fnull:
-            tests = subprocess.check_output([binary, '--gtest_list_tests'],
-                                            stderr=fnull)
-          base = None
-          for line in tests.split('\n'):
-            i = line.find('#')
-            if i >= 0: line = line[:i]
-            if not line: continue
-            if line[0] != ' ':
-              base = line.strip()
-            else:
-              assert base is not None
-              assert line[1] == ' '
-              test = base + line.strip()
-              cmdline = [binary] + ['--gtest_filter=%s' % test]
-              out.append(self.config.job_spec(cmdline, [binary],
-                                              shortname='%s:%s' % (binary, test),
-                                              cpu_cost=target['cpu_cost'],
-                                              environ={'GRPC_DEFAULT_SSL_ROOTS_FILE_PATH':
-                                                       _ROOT + '/src/core/lib/tsi/test_creds/ca.pem'}))
+      polling_strategies = (POLLING_STRATEGIES[self.platform]
+                            if target.get('uses_polling', True)
+                            else ['all'])
+      for polling_strategy in polling_strategies:
+        env={'GRPC_DEFAULT_SSL_ROOTS_FILE_PATH':
+                 _ROOT + '/src/core/lib/tsi/test_creds/ca.pem',
+             'GRPC_POLL_STRATEGY': polling_strategy}
+        shortname_ext = '' if polling_strategy=='all' else ' polling=%s' % polling_strategy
+        if self.config.build_config in target['exclude_configs']:
+          continue
+        if self.platform == 'windows':
+          binary = 'vsprojects/%s%s/%s.exe' % (
+              'x64/' if self.args.arch == 'x64' else '',
+              _MSBUILD_CONFIG[self.config.build_config],
+              target['name'])
         else:
-          cmdline = [binary] + target['args']
-          out.append(self.config.job_spec(cmdline, [binary],
-                                          shortname=target.get('shortname', ' '.join(cmdline)),
-                                          cpu_cost=target['cpu_cost'],
-                                          flaky=target.get('flaky', False),
-                                          environ={'GRPC_DEFAULT_SSL_ROOTS_FILE_PATH':
-                                                   _ROOT + '/src/core/lib/tsi/test_creds/ca.pem'}))
-      elif self.args.regex == '.*' or self.platform == 'windows':
-        print '\nWARNING: binary not found, skipping', binary
+          binary = 'bins/%s/%s' % (self.config.build_config, target['name'])
+        if os.path.isfile(binary):
+          if 'gtest' in target and target['gtest']:
+            # here we parse the output of --gtest_list_tests to build up a
+            # complete list of the tests contained in a binary
+            # for each test, we then add a job to run, filtering for just that
+            # test
+            with open(os.devnull, 'w') as fnull:
+              tests = subprocess.check_output([binary, '--gtest_list_tests'],
+                                              stderr=fnull)
+            base = None
+            for line in tests.split('\n'):
+              i = line.find('#')
+              if i >= 0: line = line[:i]
+              if not line: continue
+              if line[0] != ' ':
+                base = line.strip()
+              else:
+                assert base is not None
+                assert line[1] == ' '
+                test = base + line.strip()
+                cmdline = [binary] + ['--gtest_filter=%s' % test]
+                out.append(self.config.job_spec(cmdline, [binary],
+                                                shortname='%s:%s %s' % (binary, test, shortname_ext),
+                                                cpu_cost=target['cpu_cost'],
+                                                environ=env))
+          else:
+            cmdline = [binary] + target['args']
+            out.append(self.config.job_spec(cmdline, [binary],
+                                            shortname=' '.join(cmdline) + shortname_ext,
+                                            cpu_cost=target['cpu_cost'],
+                                            flaky=target.get('flaky', False),
+                                            environ=env))
+        elif self.args.regex == '.*' or self.platform == 'windows':
+          print '\nWARNING: binary not found, skipping', binary
     return sorted(out)
 
   def make_targets(self):
@@ -272,12 +284,17 @@
 
   def __init__(self):
     self.platform = platform_string()
-    self.node_version = '0.12'
 
   def configure(self, config, args):
     self.config = config
     self.args = args
-    _check_compiler(self.args.compiler, ['default'])
+    _check_compiler(self.args.compiler, ['default', 'node0.12',
+                                         'node4', 'node5'])
+    if self.args.compiler == 'default':
+      self.node_version = '4'
+    else:
+      # Take off the word "node"
+      self.node_version = self.args.compiler[4:]
 
   def test_specs(self):
     if self.platform == 'windows':
@@ -802,7 +819,8 @@
                            'gcc4.4', 'gcc4.9', 'gcc5.3',
                            'clang3.4', 'clang3.6',
                            'vs2010', 'vs2013', 'vs2015',
-                           'python2.7', 'python3.4'],
+                           'python2.7', 'python3.4',
+                           'node0.12', 'node4', 'node5'],
                   default='default',
                   help='Selects compiler to use. Allowed values depend on the platform and language.')
 argp.add_argument('--build_only',
@@ -906,13 +924,13 @@
   env = os.environ.copy()
   env['RUN_TESTS_COMMAND'] = run_tests_cmd
   env['DOCKERFILE_DIR'] = dockerfile_dir
-  env['DOCKER_RUN_SCRIPT'] = 'tools/jenkins/docker_run_tests.sh'
+  env['DOCKER_RUN_SCRIPT'] = 'tools/run_tests/dockerize/docker_run_tests.sh'
   if args.xml_report:
     env['XML_REPORT'] = args.xml_report
   if not args.travis:
     env['TTY_FLAG'] = '-t'  # enables Ctrl-C when not on Jenkins.
 
-  subprocess.check_call(['tools/jenkins/build_docker_and_run_tests.sh'],
+  subprocess.check_call(['tools/run_tests/dockerize/build_docker_and_run_tests.sh'],
                         shell=True,
                         env=env)
   sys.exit(0)
diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh
index 3349d28..3b8d81b 100755
--- a/tools/run_tests/sanity/check_submodules.sh
+++ b/tools/run_tests/sanity/check_submodules.sh
@@ -45,7 +45,7 @@
  05b155ff59114735ec8cd089f669c4c3d8f59029 third_party/gflags (v2.1.0-45-g05b155f)
  c99458533a9b4c743ed51537e25989ea55944908 third_party/googletest (release-1.7.0)
  f8ac463766281625ad710900479130c7fcb4d63b third_party/nanopb (nanopb-0.3.4-29-gf8ac463)
- d5fb408ddc281ffcadeb08699e65bb694656d0bd third_party/protobuf (v3.0.0-beta-2)
+ a1938b2aa9ca86ce7ce50c27ff9737c1008d2a03 third_party/protobuf (v3.0.0-beta-3-pre1)
  50893291621658f355bc5b4d450a8d06a563053d third_party/zlib (v1.2.8)
 EOF
 
diff --git a/tools/run_tests/sanity/sanity_tests.yaml b/tools/run_tests/sanity/sanity_tests.yaml
index efc21e6..c5945c6 100644
--- a/tools/run_tests/sanity/sanity_tests.yaml
+++ b/tools/run_tests/sanity/sanity_tests.yaml
@@ -10,3 +10,4 @@
 - script: tools/distrib/check_trailing_newlines.sh
 - script: tools/distrib/check_nanopb_output.sh
 - script: tools/distrib/check_include_guards.py
+- script: tools/distrib/python/check_grpcio_tools.py
diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json
index f546f3b..3866ebb 100644
--- a/tools/run_tests/sources_and_headers.json
+++ b/tools/run_tests/sources_and_headers.json
@@ -2248,8 +2248,8 @@
       "grpc_test_util"
     ], 
     "headers": [
-      "src/proto/grpc/lb/v0/load_balancer.grpc.pb.h", 
-      "src/proto/grpc/lb/v0/load_balancer.pb.h"
+      "src/proto/grpc/lb/v1/load_balancer.grpc.pb.h", 
+      "src/proto/grpc/lb/v1/load_balancer.pb.h"
     ], 
     "language": "c++", 
     "name": "grpclb_api_test", 
@@ -2599,6 +2599,24 @@
     ], 
     "headers": [], 
     "language": "c++", 
+    "name": "server_builder_plugin_test", 
+    "src": [
+      "test/cpp/end2end/server_builder_plugin_test.cc"
+    ], 
+    "third_party": false, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "gpr", 
+      "gpr_test_util", 
+      "grpc", 
+      "grpc++", 
+      "grpc++_test_util", 
+      "grpc_test_util"
+    ], 
+    "headers": [], 
+    "language": "c++", 
     "name": "server_crash_test", 
     "src": [
       "test/cpp/end2end/server_crash_test.cc"
@@ -3397,6 +3415,23 @@
     ], 
     "headers": [], 
     "language": "c", 
+    "name": "large_metadata_bad_client_test", 
+    "src": [
+      "test/core/bad_client/tests/large_metadata.c"
+    ], 
+    "third_party": false, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "bad_client_test", 
+      "gpr", 
+      "gpr_test_util", 
+      "grpc_test_util_unsecure", 
+      "grpc_unsecure"
+    ], 
+    "headers": [], 
+    "language": "c", 
     "name": "server_registered_method_bad_client_test", 
     "src": [
       "test/core/bad_client/tests/server_registered_method.c"
@@ -4140,7 +4175,8 @@
       "grpc_transport_chttp2_client_insecure", 
       "grpc_transport_chttp2_client_secure", 
       "grpc_transport_chttp2_server_insecure", 
-      "grpc_transport_chttp2_server_secure"
+      "grpc_transport_chttp2_server_secure", 
+      "grpc_transport_cronet_client_secure"
     ], 
     "headers": [], 
     "language": "c", 
@@ -5610,6 +5646,7 @@
       "src/core/lib/iomgr/endpoint.h", 
       "src/core/lib/iomgr/endpoint_pair.h", 
       "src/core/lib/iomgr/ev_poll_and_epoll_posix.h", 
+      "src/core/lib/iomgr/ev_poll_posix.h", 
       "src/core/lib/iomgr/ev_posix.h", 
       "src/core/lib/iomgr/exec_ctx.h", 
       "src/core/lib/iomgr/executor.h", 
@@ -5710,6 +5747,8 @@
       "src/core/lib/iomgr/endpoint_pair_windows.c", 
       "src/core/lib/iomgr/ev_poll_and_epoll_posix.c", 
       "src/core/lib/iomgr/ev_poll_and_epoll_posix.h", 
+      "src/core/lib/iomgr/ev_poll_posix.c", 
+      "src/core/lib/iomgr/ev_poll_posix.h", 
       "src/core/lib/iomgr/ev_posix.c", 
       "src/core/lib/iomgr/ev_posix.h", 
       "src/core/lib/iomgr/exec_ctx.c", 
@@ -5903,6 +5942,7 @@
     ], 
     "headers": [
       "include/grpc/impl/codegen/byte_buffer.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/grpc_types.h", 
@@ -5913,6 +5953,7 @@
     "name": "grpc_codegen", 
     "src": [
       "include/grpc/impl/codegen/byte_buffer.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/grpc_types.h", 
@@ -5931,15 +5972,15 @@
     ], 
     "headers": [
       "src/core/ext/lb_policy/grpclb/load_balancer_api.h", 
-      "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h"
+      "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h"
     ], 
     "language": "c", 
     "name": "grpc_lb_policy_grpclb", 
     "src": [
       "src/core/ext/lb_policy/grpclb/load_balancer_api.c", 
       "src/core/ext/lb_policy/grpclb/load_balancer_api.h", 
-      "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.c", 
-      "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h"
+      "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c", 
+      "src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h"
     ], 
     "third_party": false, 
     "type": "filegroup"
@@ -6012,6 +6053,7 @@
       "tsi"
     ], 
     "headers": [
+      "include/grpc/grpc_cronet.h", 
       "include/grpc/grpc_security.h", 
       "include/grpc/grpc_security_constants.h", 
       "src/core/lib/security/auth_filters.h", 
@@ -6027,6 +6069,7 @@
     "language": "c", 
     "name": "grpc_secure", 
     "src": [
+      "include/grpc/grpc_cronet.h", 
       "include/grpc/grpc_security.h", 
       "include/grpc/grpc_security_constants.h", 
       "src/core/lib/http/httpcli_security_connector.c", 
@@ -6263,6 +6306,24 @@
     "type": "filegroup"
   }, 
   {
+    "deps": [
+      "grpc_base", 
+      "grpc_transport_chttp2"
+    ], 
+    "headers": [
+      "third_party/objective_c/Cronet/cronet_c_for_grpc.h"
+    ], 
+    "language": "c", 
+    "name": "grpc_transport_cronet_client_secure", 
+    "src": [
+      "src/core/ext/transport/cronet/client/secure/cronet_channel_create.c", 
+      "src/core/ext/transport/cronet/transport/cronet_api_dummy.c", 
+      "src/core/ext/transport/cronet/transport/cronet_transport.c"
+    ], 
+    "third_party": false, 
+    "type": "filegroup"
+  }, 
+  {
     "deps": [], 
     "headers": [
       "third_party/nanopb/pb.h", 
@@ -6326,6 +6387,8 @@
       "include/grpc++/impl/rpc_service_method.h", 
       "include/grpc++/impl/serialization_traits.h", 
       "include/grpc++/impl/server_builder_option.h", 
+      "include/grpc++/impl/server_builder_plugin.h", 
+      "include/grpc++/impl/server_initializer.h", 
       "include/grpc++/impl/service_type.h", 
       "include/grpc++/impl/sync.h", 
       "include/grpc++/impl/sync_cxx11.h", 
@@ -6376,6 +6439,8 @@
       "include/grpc++/impl/rpc_service_method.h", 
       "include/grpc++/impl/serialization_traits.h", 
       "include/grpc++/impl/server_builder_option.h", 
+      "include/grpc++/impl/server_builder_plugin.h", 
+      "include/grpc++/impl/server_initializer.h", 
       "include/grpc++/impl/service_type.h", 
       "include/grpc++/impl/sync.h", 
       "include/grpc++/impl/sync_cxx11.h", 
diff --git a/tools/run_tests/stress_test/configs/asan.json b/tools/run_tests/stress_test/configs/asan.json
index cb9f557..7ae11cc 100644
--- a/tools/run_tests/stress_test/configs/asan.json
+++ b/tools/run_tests/stress_test/configs/asan.json
@@ -1,7 +1,7 @@
 {
   "dockerImages": {
     "grpc_stress_cxx_asan" : {
-      "buildScript": "tools/jenkins/build_interop_stress_image.sh",
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
       "dockerFileDir": "grpc_interop_stress_cxx",
       "buildType": "asan"
     }
diff --git a/tools/run_tests/stress_test/configs/csharp.json b/tools/run_tests/stress_test/configs/csharp.json
new file mode 100644
index 0000000..587e155
--- /dev/null
+++ b/tools/run_tests/stress_test/configs/csharp.json
@@ -0,0 +1,90 @@
+{
+  "dockerImages": {
+    "grpc_stress_csharp" : {
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
+      "dockerFileDir": "grpc_interop_stress_csharp"
+    }
+  },
+
+  "clientTemplates": {
+    "baseTemplates": {
+      "default": {
+        "wrapperScriptPath": "/var/local/git/grpc/tools/gcp/stress_test/run_client.py",
+        "pollIntervalSecs": 60,
+        "clientArgs": {
+          "num_channels_per_server":5,
+          "num_stubs_per_channel":10,
+          "test_cases": "empty_unary:1,large_unary:1,client_streaming:1,server_streaming:1,empty_stream:1",
+          "metrics_port": 8081
+        },
+        "metricsPort": 8081,
+        "metricsArgs": {
+          "metrics_server_address": "localhost:8081",
+          "total_only": "true"
+        }
+      }
+    },
+    "templates": {
+      "csharp_client": {
+        "baseTemplate": "default",
+        "stressClientCmd": [
+          "mono",
+          "/var/local/git/grpc/src/csharp/Grpc.IntegrationTesting.StressClient/bin/Debug/Grpc.IntegrationTesting.StressClient.exe"
+		],
+        "metricsClientCmd": ["/var/local/git/grpc/bins/opt/metrics_client"]
+      }
+    }
+  },
+
+  "serverTemplates": {
+    "baseTemplates":{
+      "default": {
+        "wrapperScriptPath": "/var/local/git/grpc/tools/gcp/stress_test/run_server.py",
+        "serverPort": 8080,
+        "serverArgs": {
+          "port": 8080
+        }
+      }
+    },
+    "templates": {
+      "csharp_server": {
+        "baseTemplate": "default",
+        "stressServerCmd": [
+          "mono",
+          "/var/local/git/grpc/src/csharp/Grpc.IntegrationTesting.Server/bin/Debug/Grpc.IntegrationTesting.Server.exe"
+		]
+      }
+    }
+  },
+
+  "testMatrix": {
+    "serverPodSpecs": {
+      "stress-server-csharp": {
+        "serverTemplate": "csharp_server",
+        "dockerImage": "grpc_stress_csharp",
+        "numInstances": 1
+      }
+    },
+
+    "clientPodSpecs": {
+      "stress-client-csharp": {
+        "clientTemplate": "csharp_client",
+        "dockerImage": "grpc_stress_csharp",
+        "numInstances": 10,
+        "serverPodSpec": "stress-server-csharp"
+      }
+    }
+  },
+
+  "globalSettings": {
+    "buildDockerImages": true,
+    "pollIntervalSecs": 60,
+    "testDurationSecs": 7200,
+    "kubernetesProxyPort": 8009,
+    "datasetIdNamePrefix": "stress_test_csharp",
+    "summaryTableId": "summary",
+    "qpsTableId": "qps",
+    "podWarmupSecs": 60
+  }
+}
+
diff --git a/tools/run_tests/stress_test/configs/go.json b/tools/run_tests/stress_test/configs/go.json
index 36b465e..f1b2b52 100644
--- a/tools/run_tests/stress_test/configs/go.json
+++ b/tools/run_tests/stress_test/configs/go.json
@@ -1,7 +1,7 @@
 {
   "dockerImages": {
     "grpc_stress_go" : {
-      "buildScript": "tools/jenkins/build_interop_stress_image.sh",
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
       "dockerFileDir": "grpc_interop_stress_go"
     }
   },
diff --git a/tools/run_tests/stress_test/configs/java.json b/tools/run_tests/stress_test/configs/java.json
index 275384c..c07d75e 100644
--- a/tools/run_tests/stress_test/configs/java.json
+++ b/tools/run_tests/stress_test/configs/java.json
@@ -1,7 +1,7 @@
 {
   "dockerImages": {
     "grpc_stress_java" : {
-      "buildScript": "tools/jenkins/build_interop_stress_image.sh",
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
       "dockerFileDir": "grpc_interop_stress_java"
     }
   },
@@ -21,6 +21,9 @@
         "metricsArgs": {
           "metrics_server_address": "localhost:8081",
           "total_only": "true"
+        },
+        "env": {
+          "STRESSTEST_CLIENT_OPTS":"-Xmx3g -Xms3g -XX:NewSize=1.5g -XX:MaxNewSize=1.5g"
         }
       }
     },
@@ -44,7 +47,10 @@
         "serverPort": 8080,
         "serverArgs": {
           "port": 8080,
-		  "use_tls": "false"
+          "use_tls": "false"
+        },
+        "env": {
+          "TEST_SERVER_OPTS":"-Xmx3g -Xms3g -XX:NewSize=1.5g -XX:MaxNewSize=1.5g"
         }
       }
     },
diff --git a/tools/run_tests/stress_test/configs/node-cxx.json b/tools/run_tests/stress_test/configs/node-cxx.json
index c4245bf..094c123 100644
--- a/tools/run_tests/stress_test/configs/node-cxx.json
+++ b/tools/run_tests/stress_test/configs/node-cxx.json
@@ -1,12 +1,12 @@
 {
   "dockerImages": {
     "grpc_stress_cxx_opt" : {
-      "buildScript": "tools/jenkins/build_interop_stress_image.sh",
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
       "dockerFileDir": "grpc_interop_stress_cxx",
       "buildType": "opt"
     },
    "grpc_stress_node": {
-     "buildScript": "tools/jenkins/build_interop_stress_image.sh",
+     "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
      "dockerFileDir": "grpc_interop_stress_node"
    }
   },
diff --git a/tools/run_tests/stress_test/configs/node.json b/tools/run_tests/stress_test/configs/node.json
index 7a48c56..85eb9e0 100644
--- a/tools/run_tests/stress_test/configs/node.json
+++ b/tools/run_tests/stress_test/configs/node.json
@@ -1,7 +1,7 @@
 {
   "dockerImages": {
     "grpc_stress_node" : {
-      "buildScript": "tools/jenkins/build_interop_stress_image.sh",
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
       "dockerFileDir": "grpc_interop_stress_node"
     }
   },
diff --git a/tools/run_tests/stress_test/configs/opt-tsan-asan.json b/tools/run_tests/stress_test/configs/opt-tsan-asan.json
index 936d151..fcb3678 100644
--- a/tools/run_tests/stress_test/configs/opt-tsan-asan.json
+++ b/tools/run_tests/stress_test/configs/opt-tsan-asan.json
@@ -1,17 +1,17 @@
 {
   "dockerImages": {
     "grpc_stress_cxx_opt" : {
-      "buildScript": "tools/jenkins/build_interop_stress_image.sh",
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
       "dockerFileDir": "grpc_interop_stress_cxx",
       "buildType": "opt"
     },
     "grpc_stress_cxx_tsan": {
-      "buildScript": "tools/jenkins/build_interop_stress_image.sh",
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
       "dockerFileDir": "grpc_interop_stress_cxx",
       "buildType": "tsan"
     },
     "grpc_stress_cxx_asan": {
-      "buildScript": "tools/jenkins/build_interop_stress_image.sh",
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
       "dockerFileDir": "grpc_interop_stress_cxx",
       "buildType": "asan"
     }
diff --git a/tools/run_tests/stress_test/configs/opt.json b/tools/run_tests/stress_test/configs/opt.json
index f45b824..5e0e930 100644
--- a/tools/run_tests/stress_test/configs/opt.json
+++ b/tools/run_tests/stress_test/configs/opt.json
@@ -1,7 +1,7 @@
 {
   "dockerImages": {
     "grpc_stress_cxx_opt" : {
-      "buildScript": "tools/jenkins/build_interop_stress_image.sh",
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
       "dockerFileDir": "grpc_interop_stress_cxx",
       "buildType": "opt"
     }
diff --git a/tools/run_tests/stress_test/configs/python.json b/tools/run_tests/stress_test/configs/python.json
new file mode 100644
index 0000000..4f85de1
--- /dev/null
+++ b/tools/run_tests/stress_test/configs/python.json
@@ -0,0 +1,98 @@
+{
+  "dockerImages": {
+    "grpc_stress_python" : {
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
+      "dockerFileDir": "grpc_interop_stress_python"
+    }
+  },
+
+  "clientTemplates": {
+    "baseTemplates": {
+      "default": {
+        "wrapperScriptPath": "/var/local/git/grpc/tools/gcp/stress_test/run_client.py",
+        "pollIntervalSecs": 60,
+        "clientArgs": {
+          "num_channels_per_server":5,
+          "num_stubs_per_channel":10,
+          "test_cases": "empty_unary:1,large_unary:1,client_streaming:1,server_streaming:1,empty_stream:1",
+          "metrics_port": 8081
+        },
+        "metricsPort": 8081,
+        "metricsArgs": {
+          "metrics_server_address": "localhost:8081",
+          "total_only": "true"
+        },
+		"env": {
+          "PYTHONPATH": "/var/local/git/grpc/src/python/gens:/var/local/git/grpc/src/python/grpcio",
+          "LD_LIBRARY_PATH":"/var/local/git/grpc/libs/opt"
+        }
+      }
+    },
+    "templates": {
+      "python_client": {
+        "baseTemplate": "default",
+        "stressClientCmd": [
+          "python",
+          "/var/local/git/grpc/src/python/grpcio/tests/stress/client.py"
+        ],
+        "metricsClientCmd": ["/var/local/git/grpc/bins/opt/metrics_client"]
+      }
+    }
+  },
+
+  "serverTemplates": {
+    "baseTemplates":{
+      "default": {
+        "wrapperScriptPath": "/var/local/git/grpc/tools/gcp/stress_test/run_server.py",
+        "serverPort": 8080,
+        "serverArgs": {
+          "port": 8080
+        },
+        "env": {
+          "PYTHONPATH": "/var/local/git/grpc/src/python/gens:/var/local/git/grpc/src/python/grpcio",
+          "LD_LIBRARY_PATH":"/var/local/git/grpc/libs/opt"
+        }
+      }
+    },
+    "templates": {
+      "python_server": {
+        "baseTemplate": "default",
+        "stressServerCmd": [
+          "python",
+          "/var/local/git/grpc/src/python/grpcio/tests/interop/server.py"
+        ]
+      }
+    }
+  },
+
+  "testMatrix": {
+    "serverPodSpecs": {
+      "python-stress-server": {
+        "serverTemplate": "python_server",
+        "dockerImage": "grpc_stress_python",
+        "numInstances": 1
+      }
+    },
+
+    "clientPodSpecs": {
+      "python-stress-client": {
+        "clientTemplate": "python_client",
+        "dockerImage": "grpc_stress_python",
+        "numInstances": 5,
+        "serverPodSpec": "python-stress-server"
+      }
+    }
+  },
+
+  "globalSettings": {
+    "buildDockerImages": true,
+    "pollIntervalSecs": 60,
+    "testDurationSecs": 7200,
+    "kubernetesProxyPort": 8011,
+    "datasetIdNamePrefix": "stress_test_python",
+    "summaryTableId": "summary",
+    "qpsTableId": "qps",
+    "podWarmupSecs": 60
+  }
+}
+
diff --git a/tools/run_tests/stress_test/configs/ruby.json b/tools/run_tests/stress_test/configs/ruby.json
new file mode 100644
index 0000000..7e2afcb
--- /dev/null
+++ b/tools/run_tests/stress_test/configs/ruby.json
@@ -0,0 +1,92 @@
+{
+  "dockerImages": {
+    "grpc_stress_ruby" : {
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
+      "dockerFileDir": "grpc_interop_stress_ruby"
+    }
+  },
+
+  "clientTemplates": {
+    "baseTemplates": {
+      "default": {
+        "wrapperScriptPath": "/var/local/git/grpc/tools/gcp/stress_test/run_client.py",
+        "pollIntervalSecs": 60,
+        "clientArgs": {
+          "num_channels_per_server":5,
+          "num_stubs_per_channel":10,
+          "test_cases": "empty_unary:1,large_unary:1,client_streaming:1,server_streaming:1,empty_stream:1",
+          "metrics_port": 8081
+        },
+        "metricsPort": 8081,
+        "metricsArgs": {
+          "metrics_server_address": "localhost:8081",
+          "total_only": "true"
+        }
+      }
+    },
+    "templates": {
+      "ruby_client": {
+        "baseTemplate": "default",
+        "stressClientCmd": [
+          "/var/local/git/grpc/tools/gcp/stress_test/run_ruby.sh",
+          "ruby",
+          "/var/local/git/grpc/src/ruby/stress/stress_client.rb"
+        ],
+        "metricsClientCmd": ["/var/local/git/grpc/bins/opt/metrics_client"]
+      }
+    }
+  },
+
+  "serverTemplates": {
+    "baseTemplates":{
+      "default": {
+        "wrapperScriptPath": "/var/local/git/grpc/tools/gcp/stress_test/run_server.py",
+        "serverPort": 8080,
+        "serverArgs": {
+          "port": 8080
+        }
+      }
+    },
+    "templates": {
+      "ruby_server": {
+        "baseTemplate": "default",
+        "stressServerCmd": [
+          "/var/local/git/grpc/tools/gcp/stress_test/run_ruby.sh",
+          "ruby",
+          "/var/local/git/grpc/src/ruby/pb/test/server.rb"
+        ]
+      }
+    }
+  },
+
+  "testMatrix": {
+    "serverPodSpecs": {
+      "stress-server-ruby": {
+        "serverTemplate": "ruby_server",
+        "dockerImage": "grpc_stress_ruby",
+        "numInstances": 1
+      }
+    },
+
+    "clientPodSpecs": {
+      "stress-client-ruby": {
+        "clientTemplate": "ruby_client",
+        "dockerImage": "grpc_stress_ruby",
+        "numInstances": 10,
+        "serverPodSpec": "stress-server-ruby"
+      }
+    }
+  },
+
+  "globalSettings": {
+    "buildDockerImages": true,
+    "pollIntervalSecs": 60,
+    "testDurationSecs": 7200,
+    "kubernetesProxyPort": 8001,
+    "datasetIdNamePrefix": "stress_test_ruby",
+    "summaryTableId": "summary",
+    "qpsTableId": "qps",
+    "podWarmupSecs": 60
+  }
+}
+
diff --git a/tools/run_tests/stress_test/configs/tsan.json b/tools/run_tests/stress_test/configs/tsan.json
index 6ef3bdf..abc759c 100644
--- a/tools/run_tests/stress_test/configs/tsan.json
+++ b/tools/run_tests/stress_test/configs/tsan.json
@@ -1,7 +1,7 @@
 {
   "dockerImages": {
     "grpc_stress_cxx_tsan" : {
-      "buildScript": "tools/jenkins/build_interop_stress_image.sh",
+      "buildScript": "tools/run_tests/dockerize/build_interop_stress_image.sh",
       "dockerFileDir": "grpc_interop_stress_cxx",
       "buildType": "tsan"
     }
diff --git a/tools/run_tests/stress_test/run_on_gke.py b/tools/run_tests/stress_test/run_on_gke.py
index d4f1c4a..583e583 100755
--- a/tools/run_tests/stress_test/run_on_gke.py
+++ b/tools/run_tests/stress_test/run_on_gke.py
@@ -69,7 +69,7 @@
 
   def __init__(self, name, stress_client_cmd, metrics_client_cmd, metrics_port,
                wrapper_script_path, poll_interval_secs, client_args_dict,
-               metrics_args_dict, will_run_forever):
+               metrics_args_dict, will_run_forever, env_dict):
     self.name = name
     self.stress_client_cmd = stress_client_cmd
     self.metrics_client_cmd = metrics_client_cmd
@@ -79,19 +79,21 @@
     self.client_args_dict = client_args_dict
     self.metrics_args_dict = metrics_args_dict
     self.will_run_forever = will_run_forever
+    self.env_dict = env_dict
 
 
 class ServerTemplate:
   """ Contains all the common settings used by a stress server """
 
   def __init__(self, name, server_cmd, wrapper_script_path, server_port,
-               server_args_dict, will_run_forever):
+               server_args_dict, will_run_forever, env_dict):
     self.name = name
     self.server_cmd = server_cmd
     self.wrapper_script_path = wrapper_script_path
     self.server_port = server_port
     self.server_args_dict = server_args_dict
     self.will_run_forever = will_run_forever
+    self.env_dict = env_dict
 
 
 class DockerImage:
@@ -240,6 +242,7 @@
     # server_pod_spec.template.wrapper_script_path) are are injected into the
     # container via environment variables
     server_env = self.gke_env.copy()
+    server_env.update(server_pod_spec.template.env_dict)
     server_env.update({
         'STRESS_TEST_IMAGE_TYPE': 'SERVER',
         'STRESS_TEST_CMD': server_pod_spec.template.server_cmd,
@@ -283,6 +286,7 @@
     # client_pod_spec.template.wrapper_script_path) are are injected into the
     # container via environment variables
     client_env = self.gke_env.copy()
+    client_env.update(client_pod_spec.template.env_dict)
     client_env.update({
         'STRESS_TEST_IMAGE_TYPE': 'CLIENT',
         'STRESS_TEST_CMD': client_pod_spec.template.stress_client_cmd,
@@ -425,7 +429,8 @@
           template_name, stress_client_cmd, metrics_client_cmd,
           temp_dict['metricsPort'], temp_dict['wrapperScriptPath'],
           temp_dict['pollIntervalSecs'], temp_dict['clientArgs'].copy(),
-          temp_dict['metricsArgs'].copy(), temp_dict.get('willRunForever', 1))
+          temp_dict['metricsArgs'].copy(), temp_dict.get('willRunForever', 1),
+          temp_dict.get('env', {}).copy())
 
     return client_templates_dict
 
@@ -461,7 +466,7 @@
       server_templates_dict[template_name] = ServerTemplate(
           template_name, stress_server_cmd, temp_dict['wrapperScriptPath'],
           temp_dict['serverPort'], temp_dict['serverArgs'].copy(),
-          temp_dict.get('willRunForever', 1))
+          temp_dict.get('willRunForever', 1), temp_dict.get('env', {}).copy())
 
     return server_templates_dict
 
diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json
index 0fd7785..4f11ceb 100644
--- a/tools/run_tests/tests.json
+++ b/tools/run_tests/tests.json
@@ -2453,6 +2453,27 @@
     "ci_platforms": [
       "linux", 
       "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "gtest": true, 
+    "language": "c++", 
+    "name": "server_builder_plugin_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ]
+  }, 
+  {
+    "args": [], 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
       "posix"
     ], 
     "cpu_cost": 0.1, 
@@ -2726,6 +2747,27 @@
     "flaky": false, 
     "gtest": false, 
     "language": "c", 
+    "name": "large_metadata_bad_client_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ]
+  }, 
+  {
+    "args": [], 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "gtest": false, 
+    "language": "c", 
     "name": "server_registered_method_bad_client_test", 
     "platforms": [
       "linux", 
@@ -21531,7 +21573,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21552,7 +21596,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21573,7 +21619,9 @@
       "posix"
     ], 
     "cpu_cost": 0.1, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21594,7 +21642,9 @@
       "posix"
     ], 
     "cpu_cost": 0.1, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21615,7 +21665,9 @@
       "posix"
     ], 
     "cpu_cost": 0.1, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21636,7 +21688,9 @@
       "posix"
     ], 
     "cpu_cost": 0.1, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21657,7 +21711,9 @@
       "posix"
     ], 
     "cpu_cost": 0.1, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21678,7 +21734,9 @@
       "posix"
     ], 
     "cpu_cost": 0.1, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21699,7 +21757,9 @@
       "posix"
     ], 
     "cpu_cost": 0.1, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21720,7 +21780,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21741,7 +21803,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21762,7 +21826,9 @@
       "posix"
     ], 
     "cpu_cost": 0.1, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21783,7 +21849,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21804,7 +21872,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21825,7 +21895,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21846,7 +21918,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21867,7 +21941,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21888,7 +21964,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21909,7 +21987,9 @@
       "posix"
     ], 
     "cpu_cost": 0.1, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21930,7 +22010,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21951,7 +22033,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21972,7 +22056,9 @@
       "posix"
     ], 
     "cpu_cost": 0.1, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -21993,7 +22079,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -22014,7 +22102,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -22035,7 +22125,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -22056,7 +22148,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -22077,7 +22171,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -22098,7 +22194,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -22119,7 +22217,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -22140,7 +22240,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -22161,7 +22263,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -22182,7 +22286,9 @@
       "posix"
     ], 
     "cpu_cost": 1.0, 
-    "exclude_configs": [], 
+    "exclude_configs": [
+      "msan"
+    ], 
     "flaky": false, 
     "language": "c", 
     "name": "h2_sockpair_1byte_nosec_test", 
@@ -22942,7 +23048,137 @@
   {
     "args": [
       "--scenario_json", 
-      "'{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 4, \"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\"}, \"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}}, \"num_clients\": 0}'"
+      "'{\"name\": \"cpp_protobuf_async_streaming_ping_pong_secure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"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\"}, \"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}}, \"num_clients\": 1}'"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1000.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "json_run_localhost", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "shortname": "json_run_localhost:cpp_protobuf_async_streaming_ping_pong_secure"
+  }, 
+  {
+    "args": [
+      "--scenario_json", 
+      "'{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"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\"}, \"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}}, \"num_clients\": 1}'"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1000.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "json_run_localhost", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "shortname": "json_run_localhost:cpp_protobuf_async_unary_ping_pong_secure"
+  }, 
+  {
+    "args": [
+      "--scenario_json", 
+      "'{\"name\": \"cpp_protobuf_sync_unary_ping_pong_secure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"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\"}, \"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}}, \"num_clients\": 1}'"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1000.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "json_run_localhost", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "shortname": "json_run_localhost:cpp_protobuf_sync_unary_ping_pong_secure"
+  }, 
+  {
+    "args": [
+      "--scenario_json", 
+      "'{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"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\"}, \"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}}, \"num_clients\": 0}'"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1000.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "json_run_localhost", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "shortname": "json_run_localhost:cpp_protobuf_async_unary_qps_unconstrained_secure"
+  }, 
+  {
+    "args": [
+      "--scenario_json", 
+      "'{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"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\"}, \"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}}, \"num_clients\": 0}'"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1000.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "json_run_localhost", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "shortname": "json_run_localhost:cpp_protobuf_async_streaming_qps_unconstrained_secure"
+  }, 
+  {
+    "args": [
+      "--scenario_json", 
+      "'{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"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\"}, \"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}}, \"num_clients\": 0}'"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -22994,110 +23230,6 @@
   {
     "args": [
       "--scenario_json", 
-      "'{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 4, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"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}}, \"num_clients\": 0}'"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1000.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_run_localhost", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "shortname": "json_run_localhost:cpp_protobuf_async_streaming_qps_unconstrained_secure"
-  }, 
-  {
-    "args": [
-      "--scenario_json", 
-      "'{\"name\": \"cpp_protobuf_async_streaming_ping_pong_secure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"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\"}, \"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}}, \"num_clients\": 1}'"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1000.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_run_localhost", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "shortname": "json_run_localhost:cpp_protobuf_async_streaming_ping_pong_secure"
-  }, 
-  {
-    "args": [
-      "--scenario_json", 
-      "'{\"name\": \"cpp_protobuf_sync_unary_ping_pong_secure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"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\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}, \"num_clients\": 1}'"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1000.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_run_localhost", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "shortname": "json_run_localhost:cpp_protobuf_sync_unary_ping_pong_secure"
-  }, 
-  {
-    "args": [
-      "--scenario_json", 
-      "'{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"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\"}, \"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}}, \"num_clients\": 1}'"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1000.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_run_localhost", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "shortname": "json_run_localhost:cpp_protobuf_async_unary_ping_pong_secure"
-  }, 
-  {
-    "args": [
-      "--scenario_json", 
       "'{\"name\": \"cpp_generic_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"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\"}, \"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}}, \"num_clients\": 1}'"
     ], 
     "boringssl": true, 
@@ -23124,7 +23256,137 @@
   {
     "args": [
       "--scenario_json", 
-      "'{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 4, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"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}}, \"num_clients\": 0}'"
+      "'{\"name\": \"cpp_protobuf_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"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}}, \"num_clients\": 1}'"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1000.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "json_run_localhost", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "shortname": "json_run_localhost:cpp_protobuf_async_streaming_ping_pong_insecure"
+  }, 
+  {
+    "args": [
+      "--scenario_json", 
+      "'{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"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}}, \"num_clients\": 1}'"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1000.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "json_run_localhost", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "shortname": "json_run_localhost:cpp_protobuf_async_unary_ping_pong_insecure"
+  }, 
+  {
+    "args": [
+      "--scenario_json", 
+      "'{\"name\": \"cpp_protobuf_sync_unary_ping_pong_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"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}}, \"num_clients\": 1}'"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1000.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "json_run_localhost", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "shortname": "json_run_localhost:cpp_protobuf_sync_unary_ping_pong_insecure"
+  }, 
+  {
+    "args": [
+      "--scenario_json", 
+      "'{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"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}}, \"num_clients\": 0}'"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1000.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "json_run_localhost", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "shortname": "json_run_localhost:cpp_protobuf_async_unary_qps_unconstrained_insecure"
+  }, 
+  {
+    "args": [
+      "--scenario_json", 
+      "'{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"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}}, \"num_clients\": 0}'"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1000.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "json_run_localhost", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "shortname": "json_run_localhost:cpp_protobuf_async_streaming_qps_unconstrained_insecure"
+  }, 
+  {
+    "args": [
+      "--scenario_json", 
+      "'{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"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\"}, \"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}}, \"num_clients\": 0}'"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -23175,110 +23437,6 @@
   }, 
   {
     "args": [
-      "--scenario_json", 
-      "'{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 4, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"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}}, \"num_clients\": 0}'"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1000.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_run_localhost", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "shortname": "json_run_localhost:cpp_protobuf_async_streaming_qps_unconstrained_insecure"
-  }, 
-  {
-    "args": [
-      "--scenario_json", 
-      "'{\"name\": \"cpp_protobuf_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"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}}, \"num_clients\": 1}'"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1000.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_run_localhost", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "shortname": "json_run_localhost:cpp_protobuf_async_streaming_ping_pong_insecure"
-  }, 
-  {
-    "args": [
-      "--scenario_json", 
-      "'{\"name\": \"cpp_protobuf_sync_unary_ping_pong_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"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\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}, \"num_clients\": 1}'"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1000.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_run_localhost", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "shortname": "json_run_localhost:cpp_protobuf_sync_unary_ping_pong_insecure"
-  }, 
-  {
-    "args": [
-      "--scenario_json", 
-      "'{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure\", \"warmup_seconds\": 5, \"benchmark_seconds\": 30, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"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}}, \"num_clients\": 1}'"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1000.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "json_run_localhost", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "shortname": "json_run_localhost:cpp_protobuf_async_unary_ping_pong_insecure"
-  }, 
-  {
-    "args": [
       "test/core/end2end/fuzzers/api_fuzzer_corpus/00.bin"
     ], 
     "ci_platforms": [
@@ -23291,7 +23449,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23307,7 +23466,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23323,7 +23483,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23339,7 +23500,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23355,7 +23517,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23371,7 +23534,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23387,7 +23551,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23403,7 +23568,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23419,7 +23585,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23435,7 +23602,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23451,7 +23619,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23467,7 +23636,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23483,7 +23653,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23499,7 +23670,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23515,7 +23687,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23531,7 +23704,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23547,7 +23721,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23563,7 +23738,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23579,7 +23755,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23595,7 +23772,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23611,7 +23789,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23627,7 +23806,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23643,7 +23823,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23659,7 +23840,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23675,7 +23857,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23691,7 +23874,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23707,7 +23891,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23723,7 +23908,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23739,7 +23925,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23755,7 +23942,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23771,7 +23959,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23787,7 +23976,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23803,7 +23993,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23819,7 +24010,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23835,7 +24027,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23851,7 +24044,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23867,7 +24061,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23883,7 +24078,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23899,7 +24095,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23915,7 +24112,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23931,7 +24129,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23947,7 +24146,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23963,7 +24163,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23979,7 +24180,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -23995,7 +24197,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24011,7 +24214,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24027,7 +24231,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24043,7 +24248,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24059,7 +24265,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24075,7 +24282,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24091,7 +24299,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24107,7 +24316,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24123,7 +24333,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24139,7 +24350,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24155,7 +24367,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24171,7 +24384,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24187,7 +24401,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24203,7 +24418,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24219,7 +24435,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24235,7 +24452,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24251,7 +24469,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24267,7 +24486,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24283,7 +24503,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24299,7 +24520,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24315,7 +24537,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24331,7 +24554,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24347,7 +24571,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24363,7 +24588,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24379,7 +24605,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24395,7 +24622,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24411,7 +24639,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24427,7 +24656,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24443,7 +24673,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24459,7 +24690,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24475,7 +24707,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24491,7 +24724,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24507,7 +24741,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24523,7 +24758,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24539,7 +24775,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24555,7 +24792,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24571,7 +24809,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24587,7 +24826,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24603,7 +24843,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24619,7 +24860,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24635,7 +24877,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24651,7 +24894,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24667,7 +24911,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24683,7 +24928,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24699,7 +24945,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24715,7 +24962,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24731,7 +24979,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24747,7 +24996,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24763,7 +25013,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24779,7 +25030,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24795,7 +25047,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24811,7 +25064,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24827,7 +25081,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24843,7 +25098,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24859,7 +25115,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24875,7 +25132,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24891,7 +25149,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24907,7 +25166,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24923,7 +25183,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24939,7 +25200,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24955,7 +25217,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24971,7 +25234,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -24987,7 +25251,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25003,7 +25268,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25019,7 +25285,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25035,7 +25302,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25051,7 +25319,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25067,7 +25336,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25083,7 +25353,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25099,7 +25370,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25115,7 +25387,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25131,7 +25404,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25147,7 +25421,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25163,7 +25438,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25179,7 +25455,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25195,7 +25472,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25211,7 +25489,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25227,7 +25506,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25243,7 +25523,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25259,7 +25540,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25275,7 +25557,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25291,7 +25574,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25307,7 +25591,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25323,7 +25608,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25339,7 +25625,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25355,7 +25642,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25371,7 +25659,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25387,7 +25676,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25403,7 +25693,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25419,7 +25710,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25435,7 +25727,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25451,7 +25744,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25467,7 +25761,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25483,7 +25778,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25499,7 +25795,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25515,7 +25812,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25531,7 +25829,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25547,7 +25846,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25563,7 +25863,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25579,7 +25880,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25595,7 +25897,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25611,7 +25914,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25627,7 +25931,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25643,7 +25948,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25659,7 +25965,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25675,7 +25982,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25691,7 +25999,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25707,7 +26016,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25723,7 +26033,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25739,7 +26050,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25755,7 +26067,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25771,7 +26084,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25787,7 +26101,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25803,7 +26118,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25819,7 +26135,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25835,7 +26152,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25851,7 +26169,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25867,7 +26186,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25883,7 +26203,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25899,7 +26220,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25915,7 +26237,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25931,7 +26254,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25947,7 +26271,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25963,7 +26288,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25979,7 +26305,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -25995,7 +26322,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26011,7 +26339,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26027,7 +26356,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26043,7 +26373,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26059,7 +26390,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26075,7 +26407,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26091,7 +26424,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26107,7 +26441,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26123,7 +26458,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26139,7 +26475,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26155,7 +26492,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26171,7 +26509,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26187,7 +26526,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26203,7 +26543,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26219,7 +26560,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26235,7 +26577,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26251,7 +26594,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26267,7 +26611,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26283,7 +26628,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26299,7 +26645,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26315,7 +26662,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26331,7 +26679,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26347,7 +26696,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26363,7 +26713,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26379,7 +26730,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26395,7 +26747,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26411,7 +26764,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26427,7 +26781,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26443,7 +26798,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26459,7 +26815,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26475,7 +26832,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26491,7 +26849,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26507,7 +26866,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26523,7 +26883,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26539,7 +26900,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26555,7 +26917,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26571,7 +26934,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26587,7 +26951,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26603,7 +26968,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26619,7 +26985,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26635,7 +27002,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26651,7 +27019,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26667,7 +27036,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26683,7 +27053,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26699,7 +27070,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26715,7 +27087,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26731,7 +27104,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26747,7 +27121,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26763,7 +27138,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26779,7 +27155,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26795,7 +27172,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26811,7 +27189,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26827,7 +27206,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26843,7 +27223,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26859,7 +27240,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26875,7 +27257,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26891,7 +27274,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26907,7 +27291,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26923,7 +27308,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26939,7 +27325,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26955,7 +27342,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26971,7 +27359,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -26987,7 +27376,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27003,7 +27393,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27019,7 +27410,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27035,7 +27427,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27051,7 +27444,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27067,7 +27461,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27083,7 +27478,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27099,7 +27495,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27115,7 +27512,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27131,7 +27529,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27147,7 +27546,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27163,7 +27563,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27179,7 +27580,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27195,7 +27597,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27211,7 +27614,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27227,7 +27631,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27243,7 +27648,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27259,7 +27665,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27275,7 +27682,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27291,7 +27699,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27307,7 +27716,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27323,7 +27733,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27339,7 +27750,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27355,7 +27767,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27371,7 +27784,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27387,7 +27801,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27403,7 +27818,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27419,7 +27835,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27435,7 +27852,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27451,7 +27869,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27467,7 +27886,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27483,7 +27903,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27499,7 +27920,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27515,7 +27937,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27531,7 +27954,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27547,7 +27971,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27563,7 +27988,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27579,7 +28005,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27595,7 +28022,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27611,7 +28039,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27627,7 +28056,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27643,7 +28073,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27659,7 +28090,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27675,7 +28107,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27691,7 +28124,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27707,7 +28141,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27723,7 +28158,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27739,7 +28175,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27755,7 +28192,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27771,7 +28209,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27787,7 +28226,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27803,7 +28243,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27819,7 +28260,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27835,7 +28277,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27851,7 +28294,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27867,7 +28311,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27883,7 +28328,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27899,7 +28345,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27915,7 +28362,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27931,7 +28379,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27947,7 +28396,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27963,7 +28413,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27979,7 +28430,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -27995,7 +28447,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28011,7 +28464,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28027,7 +28481,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28043,7 +28498,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28059,7 +28515,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28075,7 +28532,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28091,7 +28549,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28107,7 +28566,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28123,7 +28583,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28139,7 +28600,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28155,7 +28617,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28171,7 +28634,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28187,7 +28651,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28203,7 +28668,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28219,7 +28685,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28235,7 +28702,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28251,7 +28719,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28267,7 +28736,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28283,7 +28753,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28299,7 +28770,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28315,7 +28787,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28331,7 +28804,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28347,7 +28821,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28363,7 +28838,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28379,7 +28855,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28395,7 +28872,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28411,7 +28889,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28427,7 +28906,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28443,7 +28923,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28459,7 +28940,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28475,7 +28957,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28491,7 +28974,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28507,7 +28991,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28523,7 +29008,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28539,7 +29025,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28555,7 +29042,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28571,7 +29059,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28587,7 +29076,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28603,7 +29093,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28619,7 +29110,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28635,7 +29127,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28651,7 +29144,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28667,7 +29161,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28683,7 +29178,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28699,7 +29195,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28715,7 +29212,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28731,7 +29229,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28747,7 +29246,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28763,7 +29263,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28779,7 +29280,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28795,7 +29297,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28811,7 +29314,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28827,7 +29331,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28843,7 +29348,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28859,7 +29365,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28875,7 +29382,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28891,7 +29399,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28907,7 +29416,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28923,7 +29433,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28939,7 +29450,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28955,7 +29467,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28971,7 +29484,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -28987,7 +29501,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29003,7 +29518,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29019,7 +29535,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29035,7 +29552,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29051,7 +29569,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29067,7 +29586,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29083,7 +29603,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29099,7 +29620,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29115,7 +29637,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29131,7 +29654,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29147,7 +29671,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29163,7 +29688,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29179,7 +29705,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29195,7 +29722,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29211,7 +29739,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29227,7 +29756,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29243,7 +29773,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29259,7 +29790,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29275,7 +29807,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29291,7 +29824,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29307,7 +29841,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29323,7 +29858,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29339,7 +29875,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29355,7 +29892,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29371,7 +29909,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29387,7 +29926,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29403,7 +29943,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29419,7 +29960,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29435,7 +29977,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29451,7 +29994,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29467,7 +30011,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29483,7 +30028,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29499,7 +30045,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29515,7 +30062,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29531,7 +30079,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29547,7 +30096,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29563,7 +30113,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29579,7 +30130,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29595,7 +30147,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29611,7 +30164,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29627,7 +30181,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29643,7 +30198,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29659,7 +30215,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29675,7 +30232,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29691,7 +30249,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29707,7 +30266,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29723,7 +30283,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29739,7 +30300,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29755,7 +30317,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29771,7 +30334,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29787,7 +30351,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29803,7 +30368,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29819,7 +30385,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29835,7 +30402,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29851,7 +30419,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29867,7 +30436,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29883,7 +30453,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29899,7 +30470,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29915,7 +30487,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29931,7 +30504,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29947,7 +30521,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29963,7 +30538,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29979,7 +30555,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -29995,7 +30572,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30011,7 +30589,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30027,7 +30606,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30043,7 +30623,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30059,7 +30640,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30075,7 +30657,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30091,7 +30674,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30107,7 +30691,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30123,7 +30708,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30139,7 +30725,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30155,7 +30742,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30171,7 +30759,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30187,7 +30776,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30203,7 +30793,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30219,7 +30810,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30235,7 +30827,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30251,7 +30844,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30267,7 +30861,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30283,7 +30878,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30299,7 +30895,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30315,7 +30912,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30331,7 +30929,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30347,7 +30946,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30363,7 +30963,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30379,7 +30980,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30395,7 +30997,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30411,7 +31014,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30427,7 +31031,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30443,7 +31048,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30459,7 +31065,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30475,7 +31082,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30491,7 +31099,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30507,7 +31116,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30523,7 +31133,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30539,7 +31150,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30555,7 +31167,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30571,7 +31184,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30587,7 +31201,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30603,7 +31218,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30619,7 +31235,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30635,7 +31252,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30651,7 +31269,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30667,7 +31286,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30683,7 +31303,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30699,7 +31320,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30715,7 +31337,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30731,7 +31354,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30747,7 +31371,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30763,7 +31388,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30779,7 +31405,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30795,7 +31422,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30811,7 +31439,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30827,7 +31456,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30843,7 +31473,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30859,7 +31490,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30875,7 +31507,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30891,7 +31524,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30907,7 +31541,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30923,7 +31558,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30939,7 +31575,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30955,7 +31592,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30971,7 +31609,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -30987,7 +31626,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31003,7 +31643,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31019,7 +31660,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31035,7 +31677,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31051,7 +31694,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31067,7 +31711,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31083,7 +31728,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31099,7 +31745,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31115,7 +31762,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31131,7 +31779,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31147,7 +31796,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31163,7 +31813,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31179,7 +31830,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31195,7 +31847,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31211,7 +31864,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31227,7 +31881,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31243,7 +31898,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31259,7 +31915,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31275,7 +31932,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31291,7 +31949,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31307,7 +31966,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31323,7 +31983,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31339,7 +32000,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31355,7 +32017,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31371,7 +32034,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31387,7 +32051,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31403,7 +32068,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31419,7 +32085,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31435,7 +32102,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31451,7 +32119,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31467,7 +32136,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31483,7 +32153,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31499,7 +32170,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31515,7 +32187,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31531,7 +32204,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31547,7 +32221,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31563,7 +32238,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31579,7 +32255,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31595,7 +32272,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31611,7 +32289,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31627,7 +32306,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31643,7 +32323,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31659,7 +32340,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31675,7 +32357,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31691,7 +32374,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31707,7 +32391,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31723,7 +32408,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31739,7 +32425,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31755,7 +32442,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31771,7 +32459,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31787,7 +32476,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31803,7 +32493,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31819,7 +32510,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31835,7 +32527,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31851,7 +32544,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31867,7 +32561,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31883,7 +32578,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31899,7 +32595,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31915,7 +32612,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31931,7 +32629,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31947,7 +32646,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31963,7 +32663,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31979,7 +32680,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -31995,7 +32697,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32011,7 +32714,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32027,7 +32731,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32043,7 +32748,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32059,7 +32765,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32075,7 +32782,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32091,7 +32799,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32107,7 +32816,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32123,7 +32833,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32139,7 +32850,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32155,7 +32867,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32171,7 +32884,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32187,7 +32901,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32203,7 +32918,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32219,7 +32935,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32235,7 +32952,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32251,7 +32969,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32267,7 +32986,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32283,7 +33003,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32299,7 +33020,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32315,7 +33037,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32331,7 +33054,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32347,7 +33071,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32363,7 +33088,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32379,7 +33105,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32395,7 +33122,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32411,7 +33139,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32427,7 +33156,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32443,7 +33173,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32459,7 +33190,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32475,7 +33207,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32491,7 +33224,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32507,7 +33241,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32523,7 +33258,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32539,7 +33275,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32555,7 +33292,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32571,7 +33309,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32587,7 +33326,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32603,7 +33343,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32619,7 +33360,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32635,7 +33377,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32651,7 +33394,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32667,7 +33411,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32683,7 +33428,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32699,7 +33445,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32715,7 +33462,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32731,7 +33479,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32747,7 +33496,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32763,7 +33513,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32779,7 +33530,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32795,7 +33547,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32811,7 +33564,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32827,7 +33581,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32843,7 +33598,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32859,7 +33615,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32875,7 +33632,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32891,7 +33649,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32907,7 +33666,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32923,7 +33683,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32939,7 +33700,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32955,7 +33717,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32971,7 +33734,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -32987,7 +33751,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33003,7 +33768,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33019,7 +33785,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33035,7 +33802,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33051,7 +33819,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33067,7 +33836,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33083,7 +33853,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33099,7 +33870,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33115,7 +33887,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33131,7 +33904,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33147,7 +33921,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33163,7 +33938,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33179,7 +33955,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33195,7 +33972,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33211,7 +33989,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33227,7 +34006,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33243,7 +34023,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33259,7 +34040,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33275,7 +34057,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33291,7 +34074,8 @@
     "name": "api_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33307,7 +34091,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33323,7 +34108,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33339,7 +34125,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33355,7 +34142,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33371,7 +34159,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33387,7 +34176,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33403,7 +34193,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33419,7 +34210,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33435,7 +34227,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33451,7 +34244,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33467,7 +34261,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33483,7 +34278,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33499,7 +34295,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33515,7 +34312,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33531,7 +34329,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33547,7 +34346,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33563,7 +34363,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33579,7 +34380,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33595,7 +34397,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33611,7 +34414,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33627,7 +34431,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33643,7 +34448,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33659,7 +34465,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33675,7 +34482,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33691,7 +34499,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33707,7 +34516,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33723,7 +34533,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33739,7 +34550,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33755,7 +34567,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33771,7 +34584,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33787,7 +34601,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33803,7 +34618,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33819,7 +34635,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33835,7 +34652,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33851,7 +34669,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33867,7 +34686,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33883,7 +34703,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33899,7 +34720,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33915,7 +34737,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33931,7 +34754,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33947,7 +34771,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33963,7 +34788,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33979,7 +34805,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -33995,7 +34822,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34011,7 +34839,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34027,7 +34856,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34043,7 +34873,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34059,7 +34890,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34075,7 +34907,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34091,7 +34924,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34107,7 +34941,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34123,7 +34958,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34139,7 +34975,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34155,7 +34992,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34171,7 +35009,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34187,7 +35026,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34203,7 +35043,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34219,7 +35060,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34235,7 +35077,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34251,7 +35094,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34267,7 +35111,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34283,7 +35128,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34299,7 +35145,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34315,7 +35162,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34331,7 +35179,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34347,7 +35196,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34363,7 +35213,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34379,7 +35230,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34395,7 +35247,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34411,7 +35264,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34427,7 +35281,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34443,7 +35298,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34459,7 +35315,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34475,7 +35332,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34491,7 +35349,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34507,7 +35366,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34523,7 +35383,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34539,7 +35400,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34555,7 +35417,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34571,7 +35434,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34587,7 +35451,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34603,7 +35468,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34619,7 +35485,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34635,7 +35502,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34651,7 +35519,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34667,7 +35536,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34683,7 +35553,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34699,7 +35570,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34715,7 +35587,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34731,7 +35604,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34747,7 +35621,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34763,7 +35638,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34779,7 +35655,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34795,7 +35672,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34811,7 +35689,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34827,7 +35706,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34843,7 +35723,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34859,7 +35740,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34875,7 +35757,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34891,7 +35774,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34907,7 +35791,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34923,7 +35808,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34939,7 +35825,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34955,7 +35842,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34971,7 +35859,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -34987,7 +35876,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35003,7 +35893,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35019,7 +35910,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35035,7 +35927,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35051,7 +35944,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35067,7 +35961,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35083,7 +35978,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35099,7 +35995,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35115,7 +36012,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35131,7 +36029,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35147,7 +36046,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35163,7 +36063,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35179,7 +36080,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35195,7 +36097,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35211,7 +36114,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35227,7 +36131,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35243,7 +36148,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35259,7 +36165,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35275,7 +36182,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35291,7 +36199,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35307,7 +36216,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35323,7 +36233,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35339,7 +36250,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35355,7 +36267,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35371,7 +36284,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35387,7 +36301,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35403,7 +36318,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35419,7 +36335,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35435,7 +36352,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35451,7 +36369,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35467,7 +36386,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35483,7 +36403,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35499,7 +36420,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35515,7 +36437,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35531,7 +36454,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35547,7 +36471,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35563,7 +36488,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35579,7 +36505,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35595,7 +36522,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35611,7 +36539,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35627,7 +36556,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35643,7 +36573,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35659,7 +36590,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35675,7 +36607,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35691,7 +36624,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35707,7 +36641,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35723,7 +36658,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35739,7 +36675,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35755,7 +36692,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35771,7 +36709,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35787,7 +36726,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35803,7 +36743,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35819,7 +36760,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35835,7 +36777,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35851,7 +36794,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35867,7 +36811,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35883,7 +36828,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35899,7 +36845,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35915,7 +36862,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35931,7 +36879,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35947,7 +36896,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35963,7 +36913,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35979,7 +36930,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -35995,7 +36947,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36011,7 +36964,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36027,7 +36981,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36043,7 +36998,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36059,7 +37015,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36075,7 +37032,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36091,7 +37049,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36107,7 +37066,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36123,7 +37083,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36139,7 +37100,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36155,7 +37117,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36171,7 +37134,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36187,7 +37151,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36203,7 +37168,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36219,7 +37185,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36235,7 +37202,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36251,7 +37219,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36267,7 +37236,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36283,7 +37253,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36299,7 +37270,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36315,7 +37287,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36331,7 +37304,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36347,7 +37321,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36363,7 +37338,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36379,7 +37355,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36395,7 +37372,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36411,7 +37389,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36427,7 +37406,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36443,7 +37423,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36459,7 +37440,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36475,7 +37457,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36491,7 +37474,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36507,7 +37491,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36523,7 +37508,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36539,7 +37525,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36555,7 +37542,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36571,7 +37559,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36587,7 +37576,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36603,7 +37593,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36619,7 +37610,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36635,7 +37627,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36651,7 +37644,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36667,7 +37661,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36683,7 +37678,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36699,7 +37695,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36715,7 +37712,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36731,7 +37729,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36747,7 +37746,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36763,7 +37763,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36779,7 +37780,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36795,7 +37797,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36811,7 +37814,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36827,7 +37831,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36843,7 +37848,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36859,7 +37865,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36875,7 +37882,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36891,7 +37899,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36907,7 +37916,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36923,7 +37933,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36939,7 +37950,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36955,7 +37967,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36971,7 +37984,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -36987,7 +38001,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37003,7 +38018,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37019,7 +38035,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37035,7 +38052,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37051,7 +38069,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37067,7 +38086,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37083,7 +38103,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37099,7 +38120,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37115,7 +38137,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37131,7 +38154,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37147,7 +38171,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37163,7 +38188,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37179,7 +38205,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37195,7 +38222,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37211,7 +38239,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37227,7 +38256,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37243,7 +38273,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37259,7 +38290,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37275,7 +38307,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37291,7 +38324,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37307,7 +38341,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37323,7 +38358,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37339,7 +38375,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37355,7 +38392,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37371,7 +38409,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37387,7 +38426,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37403,7 +38443,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37419,7 +38460,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37435,7 +38477,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37451,7 +38494,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37467,7 +38511,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37483,7 +38528,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37499,7 +38545,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37515,7 +38562,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37531,7 +38579,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37547,7 +38596,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37563,7 +38613,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37579,7 +38630,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37595,7 +38647,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37611,7 +38664,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37627,7 +38681,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37643,7 +38698,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37659,7 +38715,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37675,7 +38732,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37691,7 +38749,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37707,7 +38766,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37723,7 +38783,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37739,7 +38800,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37755,7 +38817,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37771,7 +38834,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37787,7 +38851,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37803,7 +38868,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37819,7 +38885,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37835,7 +38902,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37851,7 +38919,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37867,7 +38936,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37883,7 +38953,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37899,7 +38970,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37915,7 +38987,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37931,7 +39004,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37947,7 +39021,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37963,7 +39038,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37979,7 +39055,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -37995,7 +39072,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38011,7 +39089,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38027,7 +39106,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38043,7 +39123,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38059,7 +39140,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38075,7 +39157,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38091,7 +39174,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38107,7 +39191,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38123,7 +39208,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38139,7 +39225,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38155,7 +39242,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38171,7 +39259,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38187,7 +39276,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38203,7 +39293,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38219,7 +39310,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38235,7 +39327,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38251,7 +39344,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38267,7 +39361,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38283,7 +39378,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38299,7 +39395,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38315,7 +39412,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38331,7 +39429,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38347,7 +39446,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38363,7 +39463,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38379,7 +39480,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38395,7 +39497,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38411,7 +39514,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38427,7 +39531,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38443,7 +39548,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38459,7 +39565,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38475,7 +39582,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38491,7 +39599,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38507,7 +39616,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38523,7 +39633,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38539,7 +39650,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38555,7 +39667,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38571,7 +39684,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38587,7 +39701,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38603,7 +39718,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38619,7 +39735,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38635,7 +39752,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38651,7 +39769,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38667,7 +39786,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38683,7 +39803,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38699,7 +39820,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38715,7 +39837,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38731,7 +39854,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38747,7 +39871,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38763,7 +39888,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38779,7 +39905,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38795,7 +39922,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38811,7 +39939,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38827,7 +39956,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38843,7 +39973,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38859,7 +39990,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38875,7 +40007,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38891,7 +40024,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38907,7 +40041,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38923,7 +40058,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38939,7 +40075,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38955,7 +40092,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38971,7 +40109,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -38987,7 +40126,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39003,7 +40143,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39019,7 +40160,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39035,7 +40177,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39051,7 +40194,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39067,7 +40211,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39083,7 +40228,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39099,7 +40245,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39115,7 +40262,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39131,7 +40279,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39147,7 +40296,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39163,7 +40313,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39179,7 +40330,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39195,7 +40347,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39211,7 +40364,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39227,7 +40381,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39243,7 +40398,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39259,7 +40415,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39275,7 +40432,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39291,7 +40449,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39307,7 +40466,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39323,7 +40483,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39339,7 +40500,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39355,7 +40517,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39371,7 +40534,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39387,7 +40551,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39403,7 +40568,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39419,7 +40585,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39435,7 +40602,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39451,7 +40619,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39467,7 +40636,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39483,7 +40653,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39499,7 +40670,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39515,7 +40687,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39531,7 +40704,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39547,7 +40721,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39563,7 +40738,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39579,7 +40755,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39595,7 +40772,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39611,7 +40789,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39627,7 +40806,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39643,7 +40823,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39659,7 +40840,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39675,7 +40857,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39691,7 +40874,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39707,7 +40891,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39723,7 +40908,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39739,7 +40925,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39755,7 +40942,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39771,7 +40959,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39787,7 +40976,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39803,7 +40993,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39819,7 +41010,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39835,7 +41027,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39851,7 +41044,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39867,7 +41061,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39883,7 +41078,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39899,7 +41095,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39915,7 +41112,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39931,7 +41129,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39947,7 +41146,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39963,7 +41163,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39979,7 +41180,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -39995,7 +41197,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40011,7 +41214,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40027,7 +41231,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40043,7 +41248,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40059,7 +41265,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40075,7 +41282,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40091,7 +41299,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40107,7 +41316,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40123,7 +41333,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40139,7 +41350,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40155,7 +41367,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40171,7 +41384,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40187,7 +41401,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40203,7 +41418,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40219,7 +41435,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40235,7 +41452,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40251,7 +41469,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40267,7 +41486,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40283,7 +41503,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40299,7 +41520,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40315,7 +41537,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40331,7 +41554,8 @@
     "name": "client_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40347,7 +41571,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40363,7 +41588,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40379,7 +41605,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40395,7 +41622,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40411,7 +41639,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40427,7 +41656,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40443,7 +41673,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40459,7 +41690,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40475,7 +41707,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40491,7 +41724,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40507,7 +41741,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40523,7 +41758,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40539,7 +41775,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40555,7 +41792,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40571,7 +41809,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40587,7 +41826,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40603,7 +41843,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40619,7 +41860,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40635,7 +41877,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40651,7 +41894,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40667,7 +41911,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40683,7 +41928,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40699,7 +41945,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40715,7 +41962,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40731,7 +41979,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40747,7 +41996,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40763,7 +42013,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40779,7 +42030,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40795,7 +42047,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40811,7 +42064,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40827,7 +42081,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40843,7 +42098,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40859,7 +42115,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40875,7 +42132,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40891,7 +42149,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40907,7 +42166,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40923,7 +42183,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40939,7 +42200,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40955,7 +42217,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40971,7 +42234,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -40987,7 +42251,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41003,7 +42268,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41019,7 +42285,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41035,7 +42302,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41051,7 +42319,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41067,7 +42336,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41083,7 +42353,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41099,7 +42370,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41115,7 +42387,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41131,7 +42404,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41147,7 +42421,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41163,7 +42438,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41179,7 +42455,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41195,7 +42472,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41211,7 +42489,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41227,7 +42506,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41243,7 +42523,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41259,7 +42540,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41275,7 +42557,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41291,7 +42574,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41307,7 +42591,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41323,7 +42608,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41339,7 +42625,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41355,7 +42642,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41371,7 +42659,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41387,7 +42676,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41403,7 +42693,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41419,7 +42710,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41435,7 +42727,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41451,7 +42744,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41467,7 +42761,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41483,7 +42778,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41499,7 +42795,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41515,7 +42812,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41531,7 +42829,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41547,7 +42846,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41563,7 +42863,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41579,7 +42880,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41595,7 +42897,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41611,7 +42914,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41627,7 +42931,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41643,7 +42948,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41659,7 +42965,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41675,7 +42982,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41691,7 +42999,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41707,7 +43016,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41723,7 +43033,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41739,7 +43050,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41755,7 +43067,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41771,7 +43084,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41787,7 +43101,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41803,7 +43118,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41819,7 +43135,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41835,7 +43152,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41851,7 +43169,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41867,7 +43186,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41883,7 +43203,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41899,7 +43220,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41915,7 +43237,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41931,7 +43254,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41947,7 +43271,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41963,7 +43288,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41979,7 +43305,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -41995,7 +43322,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42011,7 +43339,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42027,7 +43356,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42043,7 +43373,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42059,7 +43390,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42075,7 +43407,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42091,7 +43424,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42107,7 +43441,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42123,7 +43458,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42139,7 +43475,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42155,7 +43492,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42171,7 +43509,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42187,7 +43526,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42203,7 +43543,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42219,7 +43560,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42235,7 +43577,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42251,7 +43594,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42267,7 +43611,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42283,7 +43628,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42299,7 +43645,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42315,7 +43662,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42331,7 +43679,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42347,7 +43696,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42363,7 +43713,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42379,7 +43730,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42395,7 +43747,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42411,7 +43764,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42427,7 +43781,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42443,7 +43798,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42459,7 +43815,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42475,7 +43832,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42491,7 +43849,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42507,7 +43866,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42523,7 +43883,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42539,7 +43900,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42555,7 +43917,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42571,7 +43934,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42587,7 +43951,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42603,7 +43968,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42619,7 +43985,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42635,7 +44002,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42651,7 +44019,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42667,7 +44036,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42683,7 +44053,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42699,7 +44070,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42715,7 +44087,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42731,7 +44104,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42747,7 +44121,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42763,7 +44138,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42779,7 +44155,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42795,7 +44172,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42811,7 +44189,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42827,7 +44206,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42843,7 +44223,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42859,7 +44240,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42875,7 +44257,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42891,7 +44274,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42907,7 +44291,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42923,7 +44308,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42939,7 +44325,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42955,7 +44342,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42971,7 +44359,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -42987,7 +44376,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43003,7 +44393,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43019,7 +44410,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43035,7 +44427,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43051,7 +44444,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43067,7 +44461,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43083,7 +44478,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43099,7 +44495,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43115,7 +44512,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43131,7 +44529,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43147,7 +44546,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43163,7 +44563,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43179,7 +44580,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43195,7 +44597,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43211,7 +44614,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43227,7 +44631,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43243,7 +44648,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43259,7 +44665,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43275,7 +44682,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43291,7 +44699,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43307,7 +44716,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43323,7 +44733,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43339,7 +44750,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43355,7 +44767,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43371,7 +44784,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43387,7 +44801,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43403,7 +44818,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43419,7 +44835,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43435,7 +44852,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43451,7 +44869,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43467,7 +44886,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43483,7 +44903,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43499,7 +44920,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43515,7 +44937,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43531,7 +44954,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43547,7 +44971,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43563,7 +44988,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43579,7 +45005,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43595,7 +45022,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43611,7 +45039,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43627,7 +45056,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43643,7 +45073,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43659,7 +45090,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43675,7 +45107,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43691,7 +45124,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43707,7 +45141,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43723,7 +45158,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43739,7 +45175,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43755,7 +45192,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43771,7 +45209,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43787,7 +45226,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43803,7 +45243,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43819,7 +45260,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43835,7 +45277,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43851,7 +45294,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43867,7 +45311,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43883,7 +45328,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43899,7 +45345,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43915,7 +45362,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43931,7 +45379,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43947,7 +45396,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43963,7 +45413,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43979,7 +45430,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -43995,7 +45447,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44011,7 +45464,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44027,7 +45481,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44043,7 +45498,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44059,7 +45515,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44075,7 +45532,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44091,7 +45549,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44107,7 +45566,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44123,7 +45583,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44139,7 +45600,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44155,7 +45617,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44171,7 +45634,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44187,7 +45651,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44203,7 +45668,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44219,7 +45685,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44235,7 +45702,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44251,7 +45719,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44267,7 +45736,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44283,7 +45753,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44299,7 +45770,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44315,7 +45787,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44331,7 +45804,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44347,7 +45821,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44363,7 +45838,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44379,7 +45855,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44395,7 +45872,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44411,7 +45889,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44427,7 +45906,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44443,7 +45923,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44459,7 +45940,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44475,7 +45957,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44491,7 +45974,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44507,7 +45991,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44523,7 +46008,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44539,7 +46025,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44555,7 +46042,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44571,7 +46059,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44587,7 +46076,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44603,7 +46093,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44619,7 +46110,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44635,7 +46127,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44651,7 +46144,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44667,7 +46161,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44683,7 +46178,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44699,7 +46195,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44715,7 +46212,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44731,7 +46229,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44747,7 +46246,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44763,7 +46263,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44779,7 +46280,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44795,7 +46297,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44811,7 +46314,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44827,7 +46331,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44843,7 +46348,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44859,7 +46365,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44875,7 +46382,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44891,7 +46399,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44907,7 +46416,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44923,7 +46433,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44939,7 +46450,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44955,7 +46467,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44971,7 +46484,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -44987,7 +46501,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45003,7 +46518,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45019,7 +46535,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45035,7 +46552,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45051,7 +46569,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45067,7 +46586,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45083,7 +46603,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45099,7 +46620,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45115,7 +46637,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45131,7 +46654,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45147,7 +46671,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45163,7 +46688,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45179,7 +46705,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45195,7 +46722,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45211,7 +46739,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45227,7 +46756,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45243,7 +46773,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45259,7 +46790,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45275,7 +46807,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45291,7 +46824,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45307,7 +46841,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45323,7 +46858,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45339,7 +46875,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45355,7 +46892,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45371,7 +46909,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45387,7 +46926,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45403,7 +46943,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45419,7 +46960,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45435,7 +46977,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45451,7 +46994,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45467,7 +47011,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45483,7 +47028,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45499,7 +47045,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45515,7 +47062,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45531,7 +47079,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45547,7 +47096,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45563,7 +47113,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45579,7 +47130,8 @@
     "name": "hpack_parser_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45595,7 +47147,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45611,7 +47164,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45627,7 +47181,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45643,7 +47198,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45659,7 +47215,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45675,7 +47232,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45691,7 +47249,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45707,7 +47266,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45723,7 +47283,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45739,7 +47300,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45755,7 +47317,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45771,7 +47334,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45787,7 +47351,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45803,7 +47368,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45819,7 +47385,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45835,7 +47402,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45851,7 +47419,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45867,7 +47436,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45883,7 +47453,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45899,7 +47470,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45915,7 +47487,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45931,7 +47504,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45947,7 +47521,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45963,7 +47538,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45979,7 +47555,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -45995,7 +47572,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46011,7 +47589,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46027,7 +47606,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46043,7 +47623,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46059,7 +47640,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46075,7 +47657,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46091,7 +47674,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46107,7 +47691,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46123,7 +47708,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46139,7 +47725,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46155,7 +47742,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46171,7 +47759,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46187,7 +47776,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46203,7 +47793,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46219,7 +47810,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46235,7 +47827,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46251,7 +47844,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46267,7 +47861,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46283,7 +47878,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46299,7 +47895,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46315,7 +47912,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46331,7 +47929,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46347,7 +47946,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46363,7 +47963,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46379,7 +47980,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46395,7 +47997,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46411,7 +48014,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46427,7 +48031,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46443,7 +48048,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46459,7 +48065,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46475,7 +48082,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46491,7 +48099,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46507,7 +48116,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46523,7 +48133,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46539,7 +48150,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46555,7 +48167,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46571,7 +48184,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46587,7 +48201,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46603,7 +48218,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46619,7 +48235,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46635,7 +48252,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46651,7 +48269,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46667,7 +48286,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46683,7 +48303,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46699,7 +48320,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46715,7 +48337,8 @@
     "name": "http_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46731,7 +48354,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46747,7 +48371,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46763,7 +48388,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46779,7 +48405,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46795,7 +48422,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46811,7 +48439,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46827,7 +48456,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46843,7 +48473,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46859,7 +48490,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46875,7 +48507,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46891,7 +48524,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46907,7 +48541,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46923,7 +48558,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46939,7 +48575,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46955,7 +48592,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46971,7 +48609,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -46987,7 +48626,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47003,7 +48643,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47019,7 +48660,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47035,7 +48677,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47051,7 +48694,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47067,7 +48711,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47083,7 +48728,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47099,7 +48745,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47115,7 +48762,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47131,7 +48779,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47147,7 +48796,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47163,7 +48813,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47179,7 +48830,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47195,7 +48847,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47211,7 +48864,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47227,7 +48881,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47243,7 +48898,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47259,7 +48915,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47275,7 +48932,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47291,7 +48949,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47307,7 +48966,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47323,7 +48983,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47339,7 +49000,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47355,7 +49017,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47371,7 +49034,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47387,7 +49051,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47403,7 +49068,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47419,7 +49085,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47435,7 +49102,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47451,7 +49119,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47467,7 +49136,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47483,7 +49153,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47499,7 +49170,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47515,7 +49187,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47531,7 +49204,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47547,7 +49221,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47563,7 +49238,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47579,7 +49255,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47595,7 +49272,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47611,7 +49289,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47627,7 +49306,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47643,7 +49323,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47659,7 +49340,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47675,7 +49357,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47691,7 +49374,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47707,7 +49391,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47723,7 +49408,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47739,7 +49425,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47755,7 +49442,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47771,7 +49459,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47787,7 +49476,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47803,7 +49493,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47819,7 +49510,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47835,7 +49527,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47851,7 +49544,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47867,7 +49561,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47883,7 +49578,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47899,7 +49595,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47915,7 +49612,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47931,7 +49629,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47947,7 +49646,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47963,7 +49663,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47979,7 +49680,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -47995,7 +49697,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48011,7 +49714,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48027,7 +49731,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48043,7 +49748,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48059,7 +49765,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48075,7 +49782,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48091,7 +49799,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48107,7 +49816,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48123,7 +49833,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48139,7 +49850,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48155,7 +49867,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48171,7 +49884,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48187,7 +49901,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48203,7 +49918,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48219,7 +49935,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48235,7 +49952,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48251,7 +49969,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48267,7 +49986,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48283,7 +50003,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48299,7 +50020,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48315,7 +50037,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48331,7 +50054,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48347,7 +50071,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48363,7 +50088,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48379,7 +50105,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48395,7 +50122,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48411,7 +50139,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48427,7 +50156,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48443,7 +50173,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48459,7 +50190,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48475,7 +50207,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48491,7 +50224,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48507,7 +50241,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48523,7 +50258,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48539,7 +50275,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48555,7 +50292,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48571,7 +50309,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48587,7 +50326,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48603,7 +50343,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48619,7 +50360,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48635,7 +50377,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48651,7 +50394,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48667,7 +50411,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48683,7 +50428,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48699,7 +50445,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48715,7 +50462,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48731,7 +50479,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48747,7 +50496,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48763,7 +50513,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48779,7 +50530,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48795,7 +50547,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48811,7 +50564,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48827,7 +50581,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48843,7 +50598,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48859,7 +50615,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48875,7 +50632,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48891,7 +50649,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48907,7 +50666,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48923,7 +50683,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48939,7 +50700,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48955,7 +50717,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48971,7 +50734,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -48987,7 +50751,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49003,7 +50768,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49019,7 +50785,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49035,7 +50802,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49051,7 +50819,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49067,7 +50836,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49083,7 +50853,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49099,7 +50870,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49115,7 +50887,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49131,7 +50904,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49147,7 +50921,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49163,7 +50938,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49179,7 +50955,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49195,7 +50972,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49211,7 +50989,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49227,7 +51006,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49243,7 +51023,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49259,7 +51040,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49275,7 +51057,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49291,7 +51074,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49307,7 +51091,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49323,7 +51108,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49339,7 +51125,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49355,7 +51142,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49371,7 +51159,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49387,7 +51176,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49403,7 +51193,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49419,7 +51210,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49435,7 +51227,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49451,7 +51244,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49467,7 +51261,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49483,7 +51278,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49499,7 +51295,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49515,7 +51312,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49531,7 +51329,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49547,7 +51346,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49563,7 +51363,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49579,7 +51380,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49595,7 +51397,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49611,7 +51414,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49627,7 +51431,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49643,7 +51448,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49659,7 +51465,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49675,7 +51482,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49691,7 +51499,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49707,7 +51516,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49723,7 +51533,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49739,7 +51550,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49755,7 +51567,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49771,7 +51584,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49787,7 +51601,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49803,7 +51618,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49819,7 +51635,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49835,7 +51652,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49851,7 +51669,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49867,7 +51686,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49883,7 +51703,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49899,7 +51720,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49915,7 +51737,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49931,7 +51754,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49947,7 +51771,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49963,7 +51788,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49979,7 +51805,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -49995,7 +51822,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50011,7 +51839,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50027,7 +51856,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50043,7 +51873,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50059,7 +51890,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50075,7 +51907,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50091,7 +51924,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50107,7 +51941,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50123,7 +51958,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50139,7 +51975,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50155,7 +51992,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50171,7 +52009,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50187,7 +52026,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50203,7 +52043,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50219,7 +52060,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50235,7 +52077,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50251,7 +52094,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50267,7 +52111,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50283,7 +52128,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50299,7 +52145,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50315,7 +52162,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50331,7 +52179,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50347,7 +52196,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50363,7 +52213,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50379,7 +52230,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50395,7 +52247,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50411,7 +52264,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50427,7 +52281,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50443,7 +52298,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50459,7 +52315,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50475,7 +52332,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50491,7 +52349,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50507,7 +52366,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50523,7 +52383,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50539,7 +52400,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50555,7 +52417,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50571,7 +52434,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50587,7 +52451,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50603,7 +52468,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50619,7 +52485,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50635,7 +52502,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50651,7 +52519,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50667,7 +52536,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50683,7 +52553,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50699,7 +52570,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50715,7 +52587,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50731,7 +52604,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50747,7 +52621,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50763,7 +52638,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50779,7 +52655,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50795,7 +52672,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50811,7 +52689,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50827,7 +52706,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50843,7 +52723,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50859,7 +52740,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50875,7 +52757,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50891,7 +52774,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50907,7 +52791,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50923,7 +52808,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50939,7 +52825,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50955,7 +52842,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50971,7 +52859,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -50987,7 +52876,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51003,7 +52893,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51019,7 +52910,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51035,7 +52927,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51051,7 +52944,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51067,7 +52961,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51083,7 +52978,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51099,7 +52995,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51115,7 +53012,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51131,7 +53029,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51147,7 +53046,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51163,7 +53063,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51179,7 +53080,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51195,7 +53097,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51211,7 +53114,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51227,7 +53131,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51243,7 +53148,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51259,7 +53165,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51275,7 +53182,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51291,7 +53199,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51307,7 +53216,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51323,7 +53233,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51339,7 +53250,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51355,7 +53267,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51371,7 +53284,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51387,7 +53301,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51403,7 +53318,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51419,7 +53335,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51435,7 +53352,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51451,7 +53369,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51467,7 +53386,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51483,7 +53403,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51499,7 +53420,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51515,7 +53437,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51531,7 +53454,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51547,7 +53471,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51563,7 +53488,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51579,7 +53505,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51595,7 +53522,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51611,7 +53539,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51627,7 +53556,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51643,7 +53573,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51659,7 +53590,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51675,7 +53607,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51691,7 +53624,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51707,7 +53641,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51723,7 +53658,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51739,7 +53675,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51755,7 +53692,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51771,7 +53709,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51787,7 +53726,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51803,7 +53743,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51819,7 +53760,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51835,7 +53777,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51851,7 +53794,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51867,7 +53811,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51883,7 +53828,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51899,7 +53845,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51915,7 +53862,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51931,7 +53879,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51947,7 +53896,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51963,7 +53913,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51979,7 +53930,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -51995,7 +53947,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52011,7 +53964,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52027,7 +53981,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52043,7 +53998,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52059,7 +54015,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52075,7 +54032,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52091,7 +54049,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52107,7 +54066,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52123,7 +54083,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52139,7 +54100,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52155,7 +54117,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52171,7 +54134,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52187,7 +54151,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52203,7 +54168,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52219,7 +54185,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52235,7 +54202,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52251,7 +54219,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52267,7 +54236,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52283,7 +54253,8 @@
     "name": "json_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52299,7 +54270,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52315,7 +54287,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52331,7 +54304,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52347,7 +54321,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52363,7 +54338,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52379,7 +54355,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52395,7 +54372,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52411,7 +54389,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52427,7 +54406,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52443,7 +54423,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52459,7 +54440,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52475,7 +54457,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52491,7 +54474,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52507,7 +54491,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52523,7 +54508,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52539,7 +54525,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52555,7 +54542,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52571,7 +54559,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52587,7 +54576,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52603,7 +54593,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52619,7 +54610,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52635,7 +54627,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52651,7 +54644,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52667,7 +54661,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52683,7 +54678,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52699,7 +54695,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52715,7 +54712,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52731,7 +54729,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52747,7 +54746,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52763,7 +54763,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52779,7 +54780,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52795,7 +54797,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52811,7 +54814,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52827,7 +54831,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52843,7 +54848,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52859,7 +54865,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52875,7 +54882,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52891,7 +54899,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52907,7 +54916,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52923,7 +54933,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52939,7 +54950,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52955,7 +54967,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52971,7 +54984,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -52987,7 +55001,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53003,7 +55018,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53019,7 +55035,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53035,7 +55052,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53051,7 +55069,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53067,7 +55086,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53083,7 +55103,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53099,7 +55120,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53115,7 +55137,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53131,7 +55154,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53147,7 +55171,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53163,7 +55188,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53179,7 +55205,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53195,7 +55222,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53211,7 +55239,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53227,7 +55256,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53243,7 +55273,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53259,7 +55290,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53275,7 +55307,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53291,7 +55324,8 @@
     "name": "nanopb_fuzzer_response_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53307,7 +55341,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53323,7 +55358,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53339,7 +55375,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53355,7 +55392,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53371,7 +55409,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53387,7 +55426,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53403,7 +55443,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53419,7 +55460,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53435,7 +55477,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53451,7 +55494,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53467,7 +55511,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53483,7 +55528,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53499,7 +55545,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53515,7 +55562,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53531,7 +55579,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53547,7 +55596,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53563,7 +55613,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53579,7 +55630,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53595,7 +55647,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53611,7 +55664,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53627,7 +55681,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53643,7 +55698,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53659,7 +55715,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53675,7 +55732,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53691,7 +55749,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53707,7 +55766,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53723,7 +55783,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53739,7 +55800,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53755,7 +55817,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53771,7 +55834,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53787,7 +55851,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53803,7 +55868,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53819,7 +55885,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53835,7 +55902,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53851,7 +55919,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53867,7 +55936,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53883,7 +55953,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53899,7 +55970,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53915,7 +55987,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53931,7 +56004,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53947,7 +56021,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53963,7 +56038,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53979,7 +56055,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -53995,7 +56072,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54011,7 +56089,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54027,7 +56106,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54043,7 +56123,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54059,7 +56140,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54075,7 +56157,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54091,7 +56174,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54107,7 +56191,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54123,7 +56208,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54139,7 +56225,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54155,7 +56242,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54171,7 +56259,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54187,7 +56276,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54203,7 +56293,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54219,7 +56310,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54235,7 +56327,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54251,7 +56344,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54267,7 +56361,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54283,7 +56378,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54299,7 +56395,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54315,7 +56412,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54331,7 +56429,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54347,7 +56446,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54363,7 +56463,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54379,7 +56480,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54395,7 +56497,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54411,7 +56514,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54427,7 +56531,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54443,7 +56548,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54459,7 +56565,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54475,7 +56582,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54491,7 +56599,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54507,7 +56616,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54523,7 +56633,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54539,7 +56650,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54555,7 +56667,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54571,7 +56684,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54587,7 +56701,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54603,7 +56718,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54619,7 +56735,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54635,7 +56752,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54651,7 +56769,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54667,7 +56786,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54683,7 +56803,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54699,7 +56820,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54715,7 +56837,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54731,7 +56854,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54747,7 +56871,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54763,7 +56888,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54779,7 +56905,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54795,7 +56922,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54811,7 +56939,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54827,7 +56956,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54843,7 +56973,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54859,7 +56990,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54875,7 +57007,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54891,7 +57024,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54907,7 +57041,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54923,7 +57058,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54939,7 +57075,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54955,7 +57092,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54971,7 +57109,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -54987,7 +57126,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55003,7 +57143,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55019,7 +57160,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55035,7 +57177,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55051,7 +57194,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55067,7 +57211,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55083,7 +57228,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55099,7 +57245,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55115,7 +57262,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55131,7 +57279,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55147,7 +57296,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55163,7 +57313,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55179,7 +57330,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55195,7 +57347,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55211,7 +57364,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55227,7 +57381,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55243,7 +57398,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55259,7 +57415,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55275,7 +57432,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55291,7 +57449,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55307,7 +57466,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55323,7 +57483,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55339,7 +57500,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55355,7 +57517,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55371,7 +57534,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55387,7 +57551,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55403,7 +57568,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55419,7 +57585,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55435,7 +57602,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55451,7 +57619,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55467,7 +57636,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55483,7 +57653,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55499,7 +57670,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55515,7 +57687,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55531,7 +57704,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55547,7 +57721,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55563,7 +57738,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55579,7 +57755,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55595,7 +57772,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55611,7 +57789,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55627,7 +57806,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55643,7 +57823,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55659,7 +57840,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55675,7 +57857,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55691,7 +57874,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55707,7 +57891,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55723,7 +57908,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55739,7 +57925,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55755,7 +57942,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55771,7 +57959,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55787,7 +57976,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55803,7 +57993,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55819,7 +58010,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55835,7 +58027,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55851,7 +58044,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55867,7 +58061,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55883,7 +58078,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55899,7 +58095,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55915,7 +58112,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55931,7 +58129,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55947,7 +58146,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55963,7 +58163,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55979,7 +58180,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -55995,7 +58197,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56011,7 +58214,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56027,7 +58231,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56043,7 +58248,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56059,7 +58265,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56075,7 +58282,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56091,7 +58299,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56107,7 +58316,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56123,7 +58333,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56139,7 +58350,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56155,7 +58367,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56171,7 +58384,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56187,7 +58401,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56203,7 +58418,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56219,7 +58435,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56235,7 +58452,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56251,7 +58469,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56267,7 +58486,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56283,7 +58503,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56299,7 +58520,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56315,7 +58537,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56331,7 +58554,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56347,7 +58571,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56363,7 +58588,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56379,7 +58605,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56395,7 +58622,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56411,7 +58639,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56427,7 +58656,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56443,7 +58673,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56459,7 +58690,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56475,7 +58707,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56491,7 +58724,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56507,7 +58741,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56523,7 +58758,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56539,7 +58775,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56555,7 +58792,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56571,7 +58809,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56587,7 +58826,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56603,7 +58843,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56619,7 +58860,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56635,7 +58877,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56651,7 +58894,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56667,7 +58911,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56683,7 +58928,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56699,7 +58945,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56715,7 +58962,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56731,7 +58979,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56747,7 +58996,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56763,7 +59013,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56779,7 +59030,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56795,7 +59047,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56811,7 +59064,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56827,7 +59081,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56843,7 +59098,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56859,7 +59115,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56875,7 +59132,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56891,7 +59149,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56907,7 +59166,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56923,7 +59183,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56939,7 +59200,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56955,7 +59217,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56971,7 +59234,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -56987,7 +59251,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57003,7 +59268,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57019,7 +59285,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57035,7 +59302,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57051,7 +59319,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57067,7 +59336,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57083,7 +59353,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57099,7 +59370,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57115,7 +59387,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57131,7 +59404,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57147,7 +59421,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57163,7 +59438,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57179,7 +59455,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57195,7 +59472,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57211,7 +59489,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57227,7 +59506,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57243,7 +59523,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57259,7 +59540,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57275,7 +59557,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57291,7 +59574,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57307,7 +59591,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57323,7 +59608,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57339,7 +59625,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57355,7 +59642,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57371,7 +59659,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57387,7 +59676,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57403,7 +59693,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57419,7 +59710,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57435,7 +59727,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57451,7 +59744,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57467,7 +59761,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57483,7 +59778,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57499,7 +59795,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57515,7 +59812,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57531,7 +59829,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57547,7 +59846,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57563,7 +59863,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57579,7 +59880,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57595,7 +59897,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57611,7 +59914,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57627,7 +59931,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57643,7 +59948,8 @@
     "name": "nanopb_fuzzer_serverlist_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57659,7 +59965,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57675,7 +59982,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57691,7 +59999,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57707,7 +60016,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57723,7 +60033,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57739,7 +60050,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57755,7 +60067,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/03a72675e1969f836094f1ecfec2a7b34418e306"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57771,7 +60101,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/0416afd6875d9ba55f1e5f86a6456a5445d5e576"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57787,7 +60135,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57803,7 +60152,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57819,7 +60169,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57835,7 +60186,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57851,7 +60203,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57867,7 +60220,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57883,7 +60237,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57899,7 +60254,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57915,7 +60271,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/08c42ef29eff83052c5887855f2fa3e07ebe470c"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57931,7 +60305,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57947,7 +60322,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57963,7 +60339,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57979,7 +60356,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -57995,7 +60373,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58011,7 +60390,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58027,7 +60407,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58043,7 +60424,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58059,7 +60441,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58075,7 +60458,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58091,7 +60475,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58107,7 +60492,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58123,7 +60509,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58139,7 +60526,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58155,7 +60543,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58171,7 +60560,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58187,7 +60577,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58203,7 +60594,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58219,7 +60611,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58235,7 +60628,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58251,7 +60645,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58267,7 +60662,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58283,7 +60679,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58299,7 +60696,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58315,7 +60713,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58331,7 +60730,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58347,7 +60747,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58363,7 +60764,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/1ba889ea1543297824e99e641e6ca8b91f45732e"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58379,7 +60798,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58395,7 +60815,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58411,7 +60832,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58427,7 +60849,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58443,7 +60866,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58459,7 +60883,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58475,7 +60900,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58491,7 +60917,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58507,7 +60934,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58523,7 +60951,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58539,7 +60968,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58555,7 +60985,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58571,7 +61002,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58587,7 +61019,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58603,7 +61036,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58619,7 +61053,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58635,7 +61070,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58651,7 +61087,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58667,7 +61104,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58683,7 +61121,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58699,7 +61138,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58715,7 +61155,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58731,7 +61172,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58747,7 +61189,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58763,7 +61206,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58779,7 +61223,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58795,7 +61240,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58811,7 +61257,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58827,7 +61274,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58843,7 +61291,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58859,7 +61308,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58875,7 +61325,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58891,7 +61342,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58907,7 +61359,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58923,7 +61376,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58939,7 +61393,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58955,7 +61410,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58971,7 +61427,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -58987,7 +61444,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59003,7 +61461,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59019,7 +61478,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59035,7 +61495,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59051,7 +61512,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59067,7 +61529,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59083,7 +61546,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59099,7 +61563,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59115,7 +61580,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59131,7 +61597,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59147,7 +61614,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/3b09bf453c6f93983c24c4d5481e55d66213f93a"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59163,7 +61648,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59179,7 +61665,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59195,7 +61682,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59211,7 +61699,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59227,7 +61716,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59243,7 +61733,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59259,7 +61750,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59275,7 +61767,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59291,7 +61784,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59307,7 +61801,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59323,7 +61818,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59339,7 +61835,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59355,7 +61852,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59371,7 +61869,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59387,7 +61886,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59403,7 +61903,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59419,7 +61920,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59435,7 +61937,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59451,7 +61954,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59467,7 +61971,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59483,7 +61988,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59499,7 +62005,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/49cb33cbb60f041e8e99dd718993acd2c3354416"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59515,7 +62039,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59531,7 +62056,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59547,7 +62073,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59563,7 +62090,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59579,7 +62107,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59595,7 +62124,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59611,7 +62141,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59627,7 +62158,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59643,7 +62175,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59659,7 +62192,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59675,7 +62209,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59691,7 +62226,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59707,7 +62243,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59723,7 +62260,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59739,7 +62277,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59755,7 +62294,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59771,7 +62311,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59787,7 +62328,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59803,7 +62345,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59819,7 +62362,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59835,7 +62379,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59851,7 +62396,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59867,7 +62413,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59883,7 +62430,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59899,7 +62447,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59915,7 +62464,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59931,7 +62481,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59947,7 +62498,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/59743fe120be6ae1aed1c02230ee1bb460f621ee"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59963,7 +62532,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59979,7 +62549,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -59995,7 +62566,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60011,7 +62583,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60027,7 +62600,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60043,7 +62617,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60059,7 +62634,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60075,7 +62651,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60091,7 +62668,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60107,7 +62685,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60123,7 +62702,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60139,7 +62719,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60155,7 +62736,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60171,7 +62753,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60187,7 +62770,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60203,7 +62787,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60219,7 +62804,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60235,7 +62821,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60251,7 +62838,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60267,7 +62855,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60283,7 +62872,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60299,7 +62889,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60315,7 +62906,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60331,7 +62923,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60347,7 +62940,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60363,7 +62957,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60379,7 +62974,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60395,7 +62991,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60411,7 +63008,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60427,7 +63025,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60443,7 +63042,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60459,7 +63059,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60475,7 +63076,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60491,7 +63093,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60507,7 +63110,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60523,7 +63127,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60539,7 +63144,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60555,7 +63161,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60571,7 +63178,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60587,7 +63195,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60603,7 +63212,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60619,7 +63229,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60635,7 +63246,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60651,7 +63263,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60667,7 +63280,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60683,7 +63297,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60699,7 +63314,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60715,7 +63331,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60731,7 +63348,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60747,7 +63365,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60763,7 +63382,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60779,7 +63399,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60795,7 +63416,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60811,7 +63433,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60827,7 +63450,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60843,7 +63467,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60859,7 +63484,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60875,7 +63501,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60891,7 +63518,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60907,7 +63535,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60923,7 +63552,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60939,7 +63569,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60955,7 +63586,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60971,7 +63603,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -60987,7 +63620,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61003,7 +63637,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61019,7 +63654,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61035,7 +63671,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61051,7 +63688,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61067,7 +63705,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61083,7 +63722,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61099,7 +63739,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61115,7 +63756,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61131,7 +63773,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61147,7 +63790,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61163,7 +63807,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61179,7 +63824,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61195,7 +63841,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61211,7 +63858,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61227,7 +63875,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61243,7 +63892,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61259,7 +63909,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61275,7 +63926,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61291,7 +63943,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61307,7 +63960,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61323,7 +63977,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61339,7 +63994,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/a5ccb8f124d8ddb5350b90bc0d6b96db280cb7c9"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61355,7 +64028,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/a7fac1265a384fe9e45a9ee3d708b79c4e80505e"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61371,7 +64062,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61387,7 +64079,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61403,7 +64096,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61419,7 +64113,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61435,7 +64130,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61451,7 +64147,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61467,7 +64164,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61483,7 +64181,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61499,7 +64198,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/aaf049720c707d4e14e47e7eb31d6a2dda60e66a"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61515,7 +64232,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61531,7 +64249,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61547,7 +64266,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61563,7 +64283,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61579,7 +64300,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61595,7 +64317,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61611,7 +64334,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61627,7 +64351,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61643,7 +64368,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61659,7 +64385,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61675,7 +64402,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61691,7 +64419,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61707,7 +64436,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61723,7 +64453,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61739,7 +64470,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61755,7 +64487,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61771,7 +64504,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61787,7 +64521,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61803,7 +64538,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61819,7 +64555,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61835,7 +64572,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61851,7 +64589,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61867,7 +64606,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61883,7 +64623,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61899,7 +64640,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61915,7 +64657,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61931,7 +64674,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61947,7 +64691,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61963,7 +64708,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/c4e4c7572e005e18d56eac407033da058737a5ab"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61979,7 +64742,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -61995,7 +64759,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62011,7 +64776,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62027,7 +64793,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62043,7 +64810,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62059,7 +64827,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62075,7 +64844,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62091,7 +64861,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62107,7 +64878,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62123,7 +64895,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62139,7 +64912,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62155,7 +64929,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62171,7 +64946,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62187,7 +64963,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62203,7 +64980,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62219,7 +64997,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62235,7 +65014,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62251,7 +65031,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62267,7 +65048,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-dae0f07934a527989f23f06e630710ff6ca8c809"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62283,7 +65082,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62299,7 +65099,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62315,7 +65116,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62331,7 +65133,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62347,7 +65150,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62363,7 +65167,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62379,7 +65184,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62395,7 +65201,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62411,7 +65218,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62427,7 +65235,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62443,7 +65252,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62459,7 +65269,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62475,7 +65286,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62491,7 +65303,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62507,7 +65320,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62523,7 +65337,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62539,7 +65354,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62555,7 +65371,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62571,7 +65388,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62587,7 +65405,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/e96ad9c17795e52edc810a08d4fc61fe8790002a"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62603,7 +65439,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62619,7 +65456,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62635,7 +65473,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62651,7 +65490,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62667,7 +65507,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62683,7 +65524,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62699,7 +65541,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62715,7 +65558,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62731,7 +65575,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62747,7 +65592,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62763,7 +65609,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62779,7 +65626,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62795,7 +65643,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62811,7 +65660,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62827,7 +65677,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62843,7 +65694,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62859,7 +65711,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62875,7 +65728,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62891,7 +65745,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62907,7 +65762,25 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [
+      "test/core/end2end/fuzzers/server_fuzzer_corpus/fa202a5f51cd49f8ea5af60c5f403f797c01c504"
+    ], 
+    "ci_platforms": [
+      "linux"
+    ], 
+    "cpu_cost": 0.1, 
+    "exclude_configs": [], 
+    "flaky": false, 
+    "language": "c", 
+    "name": "server_fuzzer_one_entry", 
+    "platforms": [
+      "linux"
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62923,7 +65796,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62939,7 +65813,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62955,7 +65830,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62971,7 +65847,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -62987,7 +65864,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63003,7 +65881,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63019,7 +65898,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63035,7 +65915,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63051,7 +65932,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63067,7 +65949,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63083,7 +65966,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63099,7 +65983,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63115,7 +66000,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63131,7 +66017,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63147,7 +66034,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63163,7 +66051,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63179,7 +66068,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63195,7 +66085,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63211,7 +66102,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63227,7 +66119,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63243,7 +66136,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63259,7 +66153,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63275,7 +66170,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63291,7 +66187,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63307,7 +66204,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63323,7 +66221,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63339,7 +66238,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63355,7 +66255,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63371,7 +66272,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63387,7 +66289,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63403,7 +66306,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63419,7 +66323,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63435,7 +66340,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63451,7 +66357,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63467,7 +66374,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63483,7 +66391,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63499,7 +66408,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63515,7 +66425,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63531,7 +66442,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63547,7 +66459,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63563,7 +66476,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63579,7 +66493,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63595,7 +66510,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63611,7 +66527,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63627,7 +66544,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63643,7 +66561,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63659,7 +66578,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63675,7 +66595,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63691,7 +66612,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63707,7 +66629,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63723,7 +66646,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63739,7 +66663,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63755,7 +66680,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63771,7 +66697,8 @@
     "name": "server_fuzzer_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63787,7 +66714,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63803,7 +66731,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63819,7 +66748,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63835,7 +66765,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63851,7 +66782,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63867,7 +66799,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63883,7 +66816,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63899,7 +66833,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63915,7 +66850,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63931,7 +66867,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63947,7 +66884,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63963,7 +66901,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63979,7 +66918,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -63995,7 +66935,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64011,7 +66952,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64027,7 +66969,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64043,7 +66986,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64059,7 +67003,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64075,7 +67020,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64091,7 +67037,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64107,7 +67054,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64123,7 +67071,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64139,7 +67088,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64155,7 +67105,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64171,7 +67122,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64187,7 +67139,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64203,7 +67156,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64219,7 +67173,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64235,7 +67190,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64251,7 +67207,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64267,7 +67224,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64283,7 +67241,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64299,7 +67258,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64315,7 +67275,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64331,7 +67292,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64347,7 +67309,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64363,7 +67326,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64379,7 +67343,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64395,7 +67360,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64411,7 +67377,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64427,7 +67394,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64443,7 +67411,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64459,7 +67428,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64475,7 +67445,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64491,7 +67462,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64507,7 +67479,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64523,7 +67496,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64539,7 +67513,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64555,7 +67530,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64571,7 +67547,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64587,7 +67564,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64603,7 +67581,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64619,7 +67598,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64635,7 +67615,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64651,7 +67632,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64667,7 +67649,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64683,7 +67666,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64699,7 +67683,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64715,7 +67700,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64731,7 +67717,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64747,7 +67734,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64763,7 +67751,8 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }, 
   {
     "args": [
@@ -64779,6 +67768,7 @@
     "name": "uri_fuzzer_test_one_entry", 
     "platforms": [
       "linux"
-    ]
+    ], 
+    "uses_polling": false
   }
 ]
diff --git a/vsprojects/buildtests_c.sln b/vsprojects/buildtests_c.sln
index bdae447..be8b5d4 100644
--- a/vsprojects/buildtests_c.sln
+++ b/vsprojects/buildtests_c.sln
@@ -1095,6 +1095,18 @@
 		{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}
 	EndProjectSection
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "large_metadata_bad_client_test", "vcxproj\test\large_metadata_bad_client_test\large_metadata_bad_client_test.vcxproj", "{B706A9EC-7982-0DBC-495D-07B165F6CF56}"
+	ProjectSection(myProperties) = preProject
+        	lib = "False"
+	EndProjectSection
+	ProjectSection(ProjectDependencies) = postProject
+		{BA67B418-B699-E41A-9CC4-0279C49481A5} = {BA67B418-B699-E41A-9CC4-0279C49481A5}
+		{0A7E7F92-FDEA-40F1-A9EC-3BA484F98BBF} = {0A7E7F92-FDEA-40F1-A9EC-3BA484F98BBF}
+		{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5} = {46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}
+		{EAB0A629-17A9-44DB-B5FF-E91A721FE037} = {EAB0A629-17A9-44DB-B5FF-E91A721FE037}
+		{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}
+	EndProjectSection
+EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "server_registered_method_bad_client_test", "vcxproj\test\server_registered_method_bad_client_test\server_registered_method_bad_client_test.vcxproj", "{B4E7CD82-988A-BD3A-29F8-8590D3A8BC28}"
 	ProjectSection(myProperties) = preProject
         	lib = "False"
@@ -3087,6 +3099,22 @@
 		{6756895E-05BF-8CC7-58F2-868DF0C0300C}.Release-DLL|Win32.Build.0 = Release|Win32
 		{6756895E-05BF-8CC7-58F2-868DF0C0300C}.Release-DLL|x64.ActiveCfg = Release|x64
 		{6756895E-05BF-8CC7-58F2-868DF0C0300C}.Release-DLL|x64.Build.0 = Release|x64
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Debug|Win32.ActiveCfg = Debug|Win32
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Debug|x64.ActiveCfg = Debug|x64
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Release|Win32.ActiveCfg = Release|Win32
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Release|x64.ActiveCfg = Release|x64
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Debug|Win32.Build.0 = Debug|Win32
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Debug|x64.Build.0 = Debug|x64
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Release|Win32.Build.0 = Release|Win32
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Release|x64.Build.0 = Release|x64
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Debug-DLL|Win32.ActiveCfg = Debug|Win32
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Debug-DLL|Win32.Build.0 = Debug|Win32
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Debug-DLL|x64.ActiveCfg = Debug|x64
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Debug-DLL|x64.Build.0 = Debug|x64
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Release-DLL|Win32.ActiveCfg = Release|Win32
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Release-DLL|Win32.Build.0 = Release|Win32
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Release-DLL|x64.ActiveCfg = Release|x64
+		{B706A9EC-7982-0DBC-495D-07B165F6CF56}.Release-DLL|x64.Build.0 = Release|x64
 		{B4E7CD82-988A-BD3A-29F8-8590D3A8BC28}.Debug|Win32.ActiveCfg = Debug|Win32
 		{B4E7CD82-988A-BD3A-29F8-8590D3A8BC28}.Debug|x64.ActiveCfg = Debug|x64
 		{B4E7CD82-988A-BD3A-29F8-8590D3A8BC28}.Release|Win32.ActiveCfg = Release|Win32
diff --git a/vsprojects/vcxproj/grpc++/grpc++.vcxproj b/vsprojects/vcxproj/grpc++/grpc++.vcxproj
index 29cab37..65de5e9 100644
--- a/vsprojects/vcxproj/grpc++/grpc++.vcxproj
+++ b/vsprojects/vcxproj/grpc++/grpc++.vcxproj
@@ -275,6 +275,8 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\rpc_service_method.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\serialization_traits.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_builder_option.h" />
+    <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_builder_plugin.h" />
+    <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_initializer.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\service_type.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\sync.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\sync_cxx11.h" />
@@ -331,6 +333,7 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\sync_stream.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\time.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h" />
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\connectivity_state.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\grpc_types.h" />
diff --git a/vsprojects/vcxproj/grpc++/grpc++.vcxproj.filters b/vsprojects/vcxproj/grpc++/grpc++.vcxproj.filters
index 15e2807..ce50bd9 100644
--- a/vsprojects/vcxproj/grpc++/grpc++.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc++/grpc++.vcxproj.filters
@@ -147,6 +147,12 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_builder_option.h">
       <Filter>include\grpc++\impl</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_builder_plugin.h">
+      <Filter>include\grpc++\impl</Filter>
+    </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_initializer.h">
+      <Filter>include\grpc++\impl</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\service_type.h">
       <Filter>include\grpc++\impl</Filter>
     </ClInclude>
@@ -315,6 +321,9 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h">
+      <Filter>include\grpc\impl\codegen</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
diff --git a/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj b/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj
index fcda361..895e223 100644
--- a/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj
+++ b/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj
@@ -275,6 +275,8 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\rpc_service_method.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\serialization_traits.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_builder_option.h" />
+    <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_builder_plugin.h" />
+    <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_initializer.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\service_type.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\sync.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\sync_cxx11.h" />
@@ -331,6 +333,7 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\sync_stream.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\time.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h" />
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\connectivity_state.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\grpc_types.h" />
diff --git a/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj.filters
index 1dc95f9..ab305fa 100644
--- a/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj.filters
@@ -132,6 +132,12 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_builder_option.h">
       <Filter>include\grpc++\impl</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_builder_plugin.h">
+      <Filter>include\grpc++\impl</Filter>
+    </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\server_initializer.h">
+      <Filter>include\grpc++\impl</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\service_type.h">
       <Filter>include\grpc++\impl</Filter>
     </ClInclude>
@@ -300,6 +306,9 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h">
+      <Filter>include\grpc\impl\codegen</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj
index 4eec05a..a20d386 100644
--- a/vsprojects/vcxproj/grpc/grpc.vcxproj
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj
@@ -273,6 +273,7 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc\grpc.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\status.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h" />
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\connectivity_state.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\grpc_types.h" />
@@ -292,6 +293,7 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\sync_posix.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\sync_win32.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\time.h" />
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_cronet.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security_constants.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\census.h" />
@@ -315,6 +317,7 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.h" />
+    <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\executor.h" />
@@ -421,8 +424,9 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_config\subchannel_call_holder.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_config\subchannel_index.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_config\uri_parser.h" />
+    <ClInclude Include="$(SolutionDir)\..\third_party\objective_c\Cronet\cronet_c_for_grpc.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\load_balancer_api.h" />
-    <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0\load_balancer.pb.h" />
+    <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1\load_balancer.pb.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_common.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_decode.h" />
@@ -473,6 +477,8 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.c">
@@ -727,9 +733,15 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\chttp2\client\insecure\channel_create.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\cronet\client\secure\cronet_channel_create.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\cronet\transport\cronet_api_dummy.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\cronet\transport\cronet_transport.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\load_balancer_api.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0\load_balancer.pb.c">
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1\load_balancer.pb.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_common.c">
     </ClCompile>
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
index 17c88c4..d546517 100644
--- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
@@ -58,6 +58,9 @@
     <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.c">
       <Filter>src\core\lib\iomgr</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.c">
+      <Filter>src\core\lib\iomgr</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.c">
       <Filter>src\core\lib\iomgr</Filter>
     </ClCompile>
@@ -439,11 +442,20 @@
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\chttp2\client\insecure\channel_create.c">
       <Filter>src\core\ext\transport\chttp2\client\insecure</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\cronet\client\secure\cronet_channel_create.c">
+      <Filter>src\core\ext\transport\cronet\client\secure</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\cronet\transport\cronet_api_dummy.c">
+      <Filter>src\core\ext\transport\cronet\transport</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\cronet\transport\cronet_transport.c">
+      <Filter>src\core\ext\transport\cronet\transport</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\load_balancer_api.c">
       <Filter>src\core\ext\lb_policy\grpclb</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0\load_balancer.pb.c">
-      <Filter>src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0</Filter>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1\load_balancer.pb.c">
+      <Filter>src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1</Filter>
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_common.c">
       <Filter>third_party\nanopb</Filter>
@@ -516,6 +528,9 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h">
+      <Filter>include\grpc\impl\codegen</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
@@ -573,6 +588,9 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\time.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_cronet.h">
+      <Filter>include\grpc</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security.h">
       <Filter>include\grpc</Filter>
     </ClInclude>
@@ -638,6 +656,9 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.h">
       <Filter>src\core\lib\iomgr</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.h">
+      <Filter>src\core\lib\iomgr</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.h">
       <Filter>src\core\lib\iomgr</Filter>
     </ClInclude>
@@ -956,11 +977,14 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_config\uri_parser.h">
       <Filter>src\core\ext\client_config</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\third_party\objective_c\Cronet\cronet_c_for_grpc.h">
+      <Filter>third_party\objective_c\Cronet</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\load_balancer_api.h">
       <Filter>src\core\ext\lb_policy\grpclb</Filter>
     </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0\load_balancer.pb.h">
-      <Filter>src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0</Filter>
+    <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1\load_balancer.pb.h">
+      <Filter>src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1</Filter>
     </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb.h">
       <Filter>third_party\nanopb</Filter>
@@ -1037,8 +1061,8 @@
     <Filter Include="src\core\ext\lb_policy\grpclb\proto\grpc\lb">
       <UniqueIdentifier>{adf7e553-94ef-14fd-e845-03104f00a06f}</UniqueIdentifier>
     </Filter>
-    <Filter Include="src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0">
-      <UniqueIdentifier>{0406d191-8817-38c3-a562-e3541201f424}</UniqueIdentifier>
+    <Filter Include="src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1">
+      <UniqueIdentifier>{bc357e2d-8ddd-a688-88a3-255228fc0818}</UniqueIdentifier>
     </Filter>
     <Filter Include="src\core\ext\lb_policy\pick_first">
       <UniqueIdentifier>{b63ded00-b24f-708e-333f-ce199e421875}</UniqueIdentifier>
@@ -1088,6 +1112,18 @@
     <Filter Include="src\core\ext\transport\chttp2\transport">
       <UniqueIdentifier>{6f34254e-e69f-c9b4-156d-5024bade5408}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src\core\ext\transport\cronet">
+      <UniqueIdentifier>{1e9c85e9-5522-7ef8-0017-7e19990a6194}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\core\ext\transport\cronet\client">
+      <UniqueIdentifier>{d0530883-75d9-b5f7-d594-26735a70ac7b}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\core\ext\transport\cronet\client\secure">
+      <UniqueIdentifier>{4fa6fe90-b7a8-5c8f-d629-db1e68d89eed}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\core\ext\transport\cronet\transport">
+      <UniqueIdentifier>{31518af8-5860-6d0d-ff78-4059fce29ec2}</UniqueIdentifier>
+    </Filter>
     <Filter Include="src\core\lib">
       <UniqueIdentifier>{5b2ded3f-84a5-f6b4-2060-286c7d1dc945}</UniqueIdentifier>
     </Filter>
@@ -1130,6 +1166,12 @@
     <Filter Include="third_party\nanopb">
       <UniqueIdentifier>{93d6596d-330c-1d27-6f84-3c840e57869e}</UniqueIdentifier>
     </Filter>
+    <Filter Include="third_party\objective_c">
+      <UniqueIdentifier>{3a56a516-857e-d2aa-95cc-11685baf4e8c}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\objective_c\Cronet">
+      <UniqueIdentifier>{a165c6e3-0776-6f40-7351-d7865668e220}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
 </Project>
 
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
index 26050dc..09748f0 100644
--- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
@@ -264,6 +264,7 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc\grpc.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\status.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h" />
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\connectivity_state.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\grpc_types.h" />
@@ -304,6 +305,7 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.h" />
+    <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\executor.h" />
@@ -397,7 +399,7 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_config\subchannel_index.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_config\uri_parser.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\load_balancer_api.h" />
-    <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0\load_balancer.pb.h" />
+    <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1\load_balancer.pb.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_common.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_decode.h" />
@@ -450,6 +452,8 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.c">
@@ -668,7 +672,7 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\load_balancer_api.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0\load_balancer.pb.c">
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1\load_balancer.pb.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_common.c">
     </ClCompile>
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
index a4acf51..a85bfee 100644
--- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
@@ -61,6 +61,9 @@
     <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.c">
       <Filter>src\core\lib\iomgr</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.c">
+      <Filter>src\core\lib\iomgr</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.c">
       <Filter>src\core\lib\iomgr</Filter>
     </ClCompile>
@@ -388,8 +391,8 @@
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\load_balancer_api.c">
       <Filter>src\core\ext\lb_policy\grpclb</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0\load_balancer.pb.c">
-      <Filter>src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0</Filter>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1\load_balancer.pb.c">
+      <Filter>src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1</Filter>
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_common.c">
       <Filter>third_party\nanopb</Filter>
@@ -456,6 +459,9 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h">
+      <Filter>include\grpc\impl\codegen</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
@@ -572,6 +578,9 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.h">
       <Filter>src\core\lib\iomgr</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.h">
+      <Filter>src\core\lib\iomgr</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.h">
       <Filter>src\core\lib\iomgr</Filter>
     </ClInclude>
@@ -851,8 +860,8 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\load_balancer_api.h">
       <Filter>src\core\ext\lb_policy\grpclb</Filter>
     </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0\load_balancer.pb.h">
-      <Filter>src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0</Filter>
+    <ClInclude Include="$(SolutionDir)\..\src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1\load_balancer.pb.h">
+      <Filter>src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1</Filter>
     </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb.h">
       <Filter>third_party\nanopb</Filter>
@@ -929,8 +938,8 @@
     <Filter Include="src\core\ext\lb_policy\grpclb\proto\grpc\lb">
       <UniqueIdentifier>{21858d9d-30b5-8847-5882-6b47df0fa293}</UniqueIdentifier>
     </Filter>
-    <Filter Include="src\core\ext\lb_policy\grpclb\proto\grpc\lb\v0">
-      <UniqueIdentifier>{1795a20b-3e7c-e27d-eae1-96582fa9a958}</UniqueIdentifier>
+    <Filter Include="src\core\ext\lb_policy\grpclb\proto\grpc\lb\v1">
+      <UniqueIdentifier>{e9256e96-ea3d-c1fd-6426-9d53d9f08f66}</UniqueIdentifier>
     </Filter>
     <Filter Include="src\core\ext\lb_policy\pick_first">
       <UniqueIdentifier>{e27f9ecf-97bb-1a2e-3135-a41f732dcf55}</UniqueIdentifier>
diff --git a/vsprojects/vcxproj/test/codegen_test_full/codegen_test_full.vcxproj b/vsprojects/vcxproj/test/codegen_test_full/codegen_test_full.vcxproj
index cd0b40c..34e939c 100644
--- a/vsprojects/vcxproj/test/codegen_test_full/codegen_test_full.vcxproj
+++ b/vsprojects/vcxproj/test/codegen_test_full/codegen_test_full.vcxproj
@@ -191,6 +191,7 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\sync_stream.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\time.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h" />
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\connectivity_state.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\grpc_types.h" />
diff --git a/vsprojects/vcxproj/test/codegen_test_full/codegen_test_full.vcxproj.filters b/vsprojects/vcxproj/test/codegen_test_full/codegen_test_full.vcxproj.filters
index 029b8ef..d662365 100644
--- a/vsprojects/vcxproj/test/codegen_test_full/codegen_test_full.vcxproj.filters
+++ b/vsprojects/vcxproj/test/codegen_test_full/codegen_test_full.vcxproj.filters
@@ -120,6 +120,9 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h">
+      <Filter>include\grpc\impl\codegen</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
diff --git a/vsprojects/vcxproj/test/codegen_test_minimal/codegen_test_minimal.vcxproj b/vsprojects/vcxproj/test/codegen_test_minimal/codegen_test_minimal.vcxproj
index 6d138fa..890d77d 100644
--- a/vsprojects/vcxproj/test/codegen_test_minimal/codegen_test_minimal.vcxproj
+++ b/vsprojects/vcxproj/test/codegen_test_minimal/codegen_test_minimal.vcxproj
@@ -191,6 +191,7 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\sync_stream.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\time.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h" />
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\connectivity_state.h" />
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\grpc_types.h" />
diff --git a/vsprojects/vcxproj/test/codegen_test_minimal/codegen_test_minimal.vcxproj.filters b/vsprojects/vcxproj/test/codegen_test_minimal/codegen_test_minimal.vcxproj.filters
index dc3f0b2..4e0ba65 100644
--- a/vsprojects/vcxproj/test/codegen_test_minimal/codegen_test_minimal.vcxproj.filters
+++ b/vsprojects/vcxproj/test/codegen_test_minimal/codegen_test_minimal.vcxproj.filters
@@ -120,6 +120,9 @@
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\byte_buffer_reader.h">
+      <Filter>include\grpc\impl\codegen</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\compression_types.h">
       <Filter>include\grpc\impl\codegen</Filter>
     </ClInclude>
diff --git a/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj b/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj
index 1509ece..91b11a1 100644
--- a/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj
+++ b/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj
@@ -160,13 +160,13 @@
   </ItemDefinitionGroup>
 
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v0\load_balancer.pb.cc">
+    <ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v1\load_balancer.pb.cc">
     </ClCompile>
-    <ClInclude Include="$(SolutionDir)\..\src\proto\grpc\lb\v0\load_balancer.pb.h">
+    <ClInclude Include="$(SolutionDir)\..\src\proto\grpc\lb\v1\load_balancer.pb.h">
     </ClInclude>
-    <ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v0\load_balancer.grpc.pb.cc">
+    <ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v1\load_balancer.grpc.pb.cc">
     </ClCompile>
-    <ClInclude Include="$(SolutionDir)\..\src\proto\grpc\lb\v0\load_balancer.grpc.pb.h">
+    <ClInclude Include="$(SolutionDir)\..\src\proto\grpc\lb\v1\load_balancer.grpc.pb.h">
     </ClInclude>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\grpclb\grpclb_api_test.cc">
     </ClCompile>
diff --git a/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj.filters b/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj.filters
index 6c57b8c..50f0a3e 100644
--- a/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj.filters
+++ b/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj.filters
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v0\load_balancer.proto">
-      <Filter>src\proto\grpc\lb\v0</Filter>
+    <ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v1\load_balancer.proto">
+      <Filter>src\proto\grpc\lb\v1</Filter>
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\grpclb\grpclb_api_test.cc">
       <Filter>test\cpp\grpclb</Filter>
@@ -22,8 +22,8 @@
     <Filter Include="src\proto\grpc\lb">
       <UniqueIdentifier>{2981699e-c196-c599-bc17-c177770f89ee}</UniqueIdentifier>
     </Filter>
-    <Filter Include="src\proto\grpc\lb\v0">
-      <UniqueIdentifier>{3d04774a-1c2f-e100-435e-08af5d539250}</UniqueIdentifier>
+    <Filter Include="src\proto\grpc\lb\v1">
+      <UniqueIdentifier>{6cce8ddf-d9a9-1d71-0810-d1e6f8685d76}</UniqueIdentifier>
     </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{64736e1d-eb77-664f-34ab-6cf41263d3d8}</UniqueIdentifier>
diff --git a/vsprojects/vcxproj/test/large_metadata_bad_client_test/large_metadata_bad_client_test.vcxproj b/vsprojects/vcxproj/test/large_metadata_bad_client_test/large_metadata_bad_client_test.vcxproj
new file mode 100644
index 0000000..0a14694
--- /dev/null
+++ b/vsprojects/vcxproj/test/large_metadata_bad_client_test/large_metadata_bad_client_test.vcxproj
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\1.0.204.1.props')" />
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{B706A9EC-7982-0DBC-495D-07B165F6CF56}</ProjectGuid>
+    <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
+    <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(VisualStudioVersion)' == '10.0'" Label="Configuration">
+    <PlatformToolset>v100</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(VisualStudioVersion)' == '11.0'" Label="Configuration">
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(VisualStudioVersion)' == '12.0'" Label="Configuration">
+    <PlatformToolset>v120</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(VisualStudioVersion)' == '14.0'" Label="Configuration">
+    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(SolutionDir)\..\vsprojects\global.props" />
+    <Import Project="$(SolutionDir)\..\vsprojects\openssl.props" />
+    <Import Project="$(SolutionDir)\..\vsprojects\winsock.props" />
+    <Import Project="$(SolutionDir)\..\vsprojects\zlib.props" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+    <TargetName>large_metadata_bad_client_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>large_metadata_bad_client_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>
+    <Configuration-grpc_dependencies_openssl>Release</Configuration-grpc_dependencies_openssl>
+  </PropertyGroup>
+    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+      <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+      <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+
+    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+      <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+      <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+
+    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+      <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+      <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+
+    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+      <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+      <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\test\core\bad_client\tests\large_metadata.c">
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/bad_client\bad_client_test\bad_client_test.vcxproj">
+      <Project>{BA67B418-B699-E41A-9CC4-0279C49481A5}</Project>
+    </ProjectReference>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc_test_util_unsecure\grpc_test_util_unsecure.vcxproj">
+      <Project>{0A7E7F92-FDEA-40F1-A9EC-3BA484F98BBF}</Project>
+    </ProjectReference>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc_unsecure\grpc_unsecure.vcxproj">
+      <Project>{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}</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" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" />
+  <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" />
+  <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" />
+  <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" />
+  </ImportGroup>
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" />
+    <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" />
+    <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" />
+    <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" />
+    <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" />
+  </Target>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/large_metadata_bad_client_test/large_metadata_bad_client_test.vcxproj.filters b/vsprojects/vcxproj/test/large_metadata_bad_client_test/large_metadata_bad_client_test.vcxproj.filters
new file mode 100644
index 0000000..5eb9a5e
--- /dev/null
+++ b/vsprojects/vcxproj/test/large_metadata_bad_client_test/large_metadata_bad_client_test.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)\..\test\core\bad_client\tests\large_metadata.c">
+      <Filter>test\core\bad_client\tests</Filter>
+    </ClCompile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Filter Include="test">
+      <UniqueIdentifier>{6c1eb0cb-9d82-f961-7220-1f6edc913666}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="test\core">
+      <UniqueIdentifier>{79d5006f-93a1-aa0e-2568-37aa63eef567}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="test\core\bad_client">
+      <UniqueIdentifier>{dbde5995-24a0-2332-4bee-0540ed3aa848}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="test\core\bad_client\tests">
+      <UniqueIdentifier>{5cf4a13f-ae24-fd98-eb59-b5301f30367c}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/server_builder_plugin_test/server_builder_plugin_test.vcxproj b/vsprojects/vcxproj/test/server_builder_plugin_test/server_builder_plugin_test.vcxproj
new file mode 100644
index 0000000..0ebdd98
--- /dev/null
+++ b/vsprojects/vcxproj/test/server_builder_plugin_test/server_builder_plugin_test.vcxproj
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\1.0.204.1.props')" />
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{86751DC8-C8D9-57B6-2C8A-BB33021C773C}</ProjectGuid>
+    <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
+    <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(VisualStudioVersion)' == '10.0'" Label="Configuration">
+    <PlatformToolset>v100</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(VisualStudioVersion)' == '11.0'" Label="Configuration">
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(VisualStudioVersion)' == '12.0'" Label="Configuration">
+    <PlatformToolset>v120</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(VisualStudioVersion)' == '14.0'" Label="Configuration">
+    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(SolutionDir)\..\vsprojects\cpptest.props" />
+    <Import Project="$(SolutionDir)\..\vsprojects\global.props" />
+    <Import Project="$(SolutionDir)\..\vsprojects\openssl.props" />
+    <Import Project="$(SolutionDir)\..\vsprojects\protobuf.props" />
+    <Import Project="$(SolutionDir)\..\vsprojects\winsock.props" />
+    <Import Project="$(SolutionDir)\..\vsprojects\zlib.props" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+    <TargetName>server_builder_plugin_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>server_builder_plugin_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>
+    <Configuration-grpc_dependencies_openssl>Release</Configuration-grpc_dependencies_openssl>
+  </PropertyGroup>
+    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+      <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+      <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+
+    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+      <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+      <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+
+    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+      <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+      <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+
+    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+      <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+      <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\test\cpp\end2end\server_builder_plugin_test.cc">
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <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" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" />
+  <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" />
+  <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" />
+  <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" />
+  </ImportGroup>
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" />
+    <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" />
+    <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" />
+    <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" />
+    <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" />
+  </Target>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/server_builder_plugin_test/server_builder_plugin_test.vcxproj.filters b/vsprojects/vcxproj/test/server_builder_plugin_test/server_builder_plugin_test.vcxproj.filters
new file mode 100644
index 0000000..629b913
--- /dev/null
+++ b/vsprojects/vcxproj/test/server_builder_plugin_test/server_builder_plugin_test.vcxproj.filters
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\test\cpp\end2end\server_builder_plugin_test.cc">
+      <Filter>test\cpp\end2end</Filter>
+    </ClCompile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Filter Include="test">
+      <UniqueIdentifier>{37b2ebc1-b2f2-ecb9-37b7-f6d757bb99e3}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="test\cpp">
+      <UniqueIdentifier>{39400fed-f7b7-0f44-0ef3-ba3693d42011}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="test\cpp\end2end">
+      <UniqueIdentifier>{dab9dd19-3e5b-005e-4b5a-456de6111d71}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+</Project>
+