Merge pull request #1259 from ctiller/metadata

Eliminate channel-wide lock for grpc_mdelem_ref.
diff --git a/BUILD b/BUILD
index 233cf65..12fd648 100644
--- a/BUILD
+++ b/BUILD
@@ -104,6 +104,10 @@
     "include/grpc/support/sync_win32.h",
     "include/grpc/support/thd.h",
     "include/grpc/support/time.h",
+    "include/grpc/support/tls.h",
+    "include/grpc/support/tls_gcc.h",
+    "include/grpc/support/tls_msvc.h",
+    "include/grpc/support/tls_pthread.h",
     "include/grpc/support/useful.h",
   ],
   includes = [
@@ -261,6 +265,7 @@
     "src/core/iomgr/alarm_heap.c",
     "src/core/iomgr/endpoint.c",
     "src/core/iomgr/endpoint_pair_posix.c",
+    "src/core/iomgr/endpoint_pair_windows.c",
     "src/core/iomgr/fd_posix.c",
     "src/core/iomgr/iocp_windows.c",
     "src/core/iomgr/iomgr.c",
@@ -468,6 +473,7 @@
     "src/core/iomgr/alarm_heap.c",
     "src/core/iomgr/endpoint.c",
     "src/core/iomgr/endpoint_pair_posix.c",
+    "src/core/iomgr/endpoint_pair_windows.c",
     "src/core/iomgr/fd_posix.c",
     "src/core/iomgr/iocp_windows.c",
     "src/core/iomgr/iomgr.c",
@@ -616,6 +622,12 @@
     "include/grpc++/impl/rpc_method.h",
     "include/grpc++/impl/rpc_service_method.h",
     "include/grpc++/impl/service_type.h",
+    "include/grpc++/impl/sync.h",
+    "include/grpc++/impl/sync_cxx11.h",
+    "include/grpc++/impl/sync_no_cxx11.h",
+    "include/grpc++/impl/thd.h",
+    "include/grpc++/impl/thd_cxx11.h",
+    "include/grpc++/impl/thd_no_cxx11.h",
     "include/grpc++/server.h",
     "include/grpc++/server_builder.h",
     "include/grpc++/server_context.h",
@@ -688,6 +700,12 @@
     "include/grpc++/impl/rpc_method.h",
     "include/grpc++/impl/rpc_service_method.h",
     "include/grpc++/impl/service_type.h",
+    "include/grpc++/impl/sync.h",
+    "include/grpc++/impl/sync_cxx11.h",
+    "include/grpc++/impl/sync_no_cxx11.h",
+    "include/grpc++/impl/thd.h",
+    "include/grpc++/impl/thd_cxx11.h",
+    "include/grpc++/impl/thd_no_cxx11.h",
     "include/grpc++/server.h",
     "include/grpc++/server_builder.h",
     "include/grpc++/server_context.h",
diff --git a/Makefile b/Makefile
index 20e5e36..b86e76a 100644
--- a/Makefile
+++ b/Makefile
@@ -1077,7 +1077,7 @@
 
 privatelibs_c:  $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fake_security.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_fullstack_uds.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair.a $(LIBDIR)/$(CONFIG)/libend2end_fixture_chttp2_socket_pair_one_byte_at_a_time.a $(LIBDIR)/$(CONFIG)/libend2end_test_bad_hostname.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags.a $(LIBDIR)/$(CONFIG)/libend2end_test_empty_batch.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request.a $(LIBDIR)/$(CONFIG)/libend2end_test_thread_stress.a $(LIBDIR)/$(CONFIG)/libend2end_test_writes_done_hangs_with_pending_read.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_accept_and_writes_closed_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_after_invoke_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_before_invoke_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_cancel_in_a_vacuum_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_census_simple_request_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_disappearing_server_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_inflight_calls_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_early_server_shutdown_finishes_tags_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_graceful_server_shutdown_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_invoke_large_request_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_max_concurrent_streams_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_no_op_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_ping_pong_streaming_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_binary_metadata_and_payload_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_metadata_and_payload_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_payload_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_response_with_trailing_metadata_and_payload_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_large_metadata_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_request_with_payload_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_delayed_request_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_simple_request_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_thread_stress_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_test_writes_done_hangs_with_pending_read_legacy.a $(LIBDIR)/$(CONFIG)/libend2end_certs.a
 
-privatelibs_cxx:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libinterop_client_lib.a $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a $(LIBDIR)/$(CONFIG)/libpubsub_client_lib.a $(LIBDIR)/$(CONFIG)/libqps.a
+privatelibs_cxx:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a $(LIBDIR)/$(CONFIG)/libinterop_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a $(LIBDIR)/$(CONFIG)/libinterop_server_main.a $(LIBDIR)/$(CONFIG)/libpubsub_client_lib.a $(LIBDIR)/$(CONFIG)/libqps.a
 
 buildtests: buildtests_c buildtests_cxx
 
@@ -2601,6 +2601,7 @@
     src/core/iomgr/alarm_heap.c \
     src/core/iomgr/endpoint.c \
     src/core/iomgr/endpoint_pair_posix.c \
+    src/core/iomgr/endpoint_pair_windows.c \
     src/core/iomgr/fd_posix.c \
     src/core/iomgr/iocp_windows.c \
     src/core/iomgr/iomgr.c \
@@ -2748,6 +2749,7 @@
 src/core/iomgr/alarm_heap.c: $(OPENSSL_DEP)
 src/core/iomgr/endpoint.c: $(OPENSSL_DEP)
 src/core/iomgr/endpoint_pair_posix.c: $(OPENSSL_DEP)
+src/core/iomgr/endpoint_pair_windows.c: $(OPENSSL_DEP)
 src/core/iomgr/fd_posix.c: $(OPENSSL_DEP)
 src/core/iomgr/iocp_windows.c: $(OPENSSL_DEP)
 src/core/iomgr/iomgr.c: $(OPENSSL_DEP)
@@ -2911,6 +2913,7 @@
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm_heap.o: 
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint.o: 
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_posix.o: 
+$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_windows.o: 
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/fd_posix.o: 
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/iocp_windows.o: 
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr.o: 
@@ -3000,6 +3003,7 @@
     test/core/util/grpc_profiler.c \
     test/core/util/parse_hexstring.c \
     test/core/util/port_posix.c \
+    test/core/util/port_windows.c \
     test/core/util/slice_splitter.c \
 
 
@@ -3029,6 +3033,7 @@
 test/core/util/grpc_profiler.c: $(OPENSSL_DEP)
 test/core/util/parse_hexstring.c: $(OPENSSL_DEP)
 test/core/util/port_posix.c: $(OPENSSL_DEP)
+test/core/util/port_windows.c: $(OPENSSL_DEP)
 test/core/util/slice_splitter.c: $(OPENSSL_DEP)
 endif
 
@@ -3062,6 +3067,7 @@
 $(OBJDIR)/$(CONFIG)/test/core/util/grpc_profiler.o: 
 $(OBJDIR)/$(CONFIG)/test/core/util/parse_hexstring.o: 
 $(OBJDIR)/$(CONFIG)/test/core/util/port_posix.o: 
+$(OBJDIR)/$(CONFIG)/test/core/util/port_windows.o: 
 $(OBJDIR)/$(CONFIG)/test/core/util/slice_splitter.o: 
 
 
@@ -3087,6 +3093,7 @@
     src/core/iomgr/alarm_heap.c \
     src/core/iomgr/endpoint.c \
     src/core/iomgr/endpoint_pair_posix.c \
+    src/core/iomgr/endpoint_pair_windows.c \
     src/core/iomgr/fd_posix.c \
     src/core/iomgr/iocp_windows.c \
     src/core/iomgr/iomgr.c \
@@ -3227,6 +3234,7 @@
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm_heap.o: 
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint.o: 
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_posix.o: 
+$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_windows.o: 
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/fd_posix.o: 
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/iocp_windows.o: 
 $(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr.o: 
@@ -3743,21 +3751,17 @@
 $(OBJDIR)/$(CONFIG)/src/compiler/ruby_generator.o: 
 
 
-LIBINTEROP_CLIENT_LIB_SRC = \
-    $(GENDIR)/test/cpp/interop/empty.pb.cc $(GENDIR)/test/cpp/interop/empty.grpc.pb.cc \
-    $(GENDIR)/test/cpp/interop/messages.pb.cc $(GENDIR)/test/cpp/interop/messages.grpc.pb.cc \
-    $(GENDIR)/test/cpp/interop/test.pb.cc $(GENDIR)/test/cpp/interop/test.grpc.pb.cc \
+LIBINTEROP_CLIENT_HELPER_SRC = \
     test/cpp/interop/client_helper.cc \
-    test/cpp/interop/interop_client.cc \
 
 
-LIBINTEROP_CLIENT_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBINTEROP_CLIENT_LIB_SRC))))
+LIBINTEROP_CLIENT_HELPER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBINTEROP_CLIENT_HELPER_SRC))))
 
 ifeq ($(NO_SECURE),true)
 
 # You can't build secure libraries if you don't have OpenSSL with ALPN.
 
-$(LIBDIR)/$(CONFIG)/libinterop_client_lib.a: openssl_dep_error
+$(LIBDIR)/$(CONFIG)/libinterop_client_helper.a: openssl_dep_error
 
 
 else
@@ -3766,7 +3770,67 @@
 
 # You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
 
-$(LIBDIR)/$(CONFIG)/libinterop_client_lib.a: protobuf_dep_error
+$(LIBDIR)/$(CONFIG)/libinterop_client_helper.a: protobuf_dep_error
+
+
+else
+
+ifneq ($(OPENSSL_DEP),)
+# This is to ensure the embedded OpenSSL is built beforehand, properly
+# installing headers to their final destination on the drive. We need this
+# otherwise parallel compilation will fail if a source is compiled first.
+test/cpp/interop/client_helper.cc: $(OPENSSL_DEP)
+endif
+
+$(LIBDIR)/$(CONFIG)/libinterop_client_helper.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(PROTOBUF_DEP) $(LIBINTEROP_CLIENT_HELPER_OBJS)
+	$(E) "[AR]      Creating $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a
+	$(Q) $(AR) rcs $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a $(LIBINTEROP_CLIENT_HELPER_OBJS)
+ifeq ($(SYSTEM),Darwin)
+	$(Q) ranlib $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a
+endif
+
+
+
+
+endif
+
+endif
+
+ifneq ($(NO_SECURE),true)
+ifneq ($(NO_DEPS),true)
+-include $(LIBINTEROP_CLIENT_HELPER_OBJS:.o=.dep)
+endif
+endif
+
+$(OBJDIR)/$(CONFIG)/test/cpp/interop/client_helper.o: 
+
+
+LIBINTEROP_CLIENT_MAIN_SRC = \
+    $(GENDIR)/test/cpp/interop/empty.pb.cc $(GENDIR)/test/cpp/interop/empty.grpc.pb.cc \
+    $(GENDIR)/test/cpp/interop/messages.pb.cc $(GENDIR)/test/cpp/interop/messages.grpc.pb.cc \
+    $(GENDIR)/test/cpp/interop/test.pb.cc $(GENDIR)/test/cpp/interop/test.grpc.pb.cc \
+    test/cpp/interop/client.cc \
+    test/cpp/interop/interop_client.cc \
+
+
+LIBINTEROP_CLIENT_MAIN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBINTEROP_CLIENT_MAIN_SRC))))
+
+ifeq ($(NO_SECURE),true)
+
+# You can't build secure libraries if you don't have OpenSSL with ALPN.
+
+$(LIBDIR)/$(CONFIG)/libinterop_client_main.a: openssl_dep_error
+
+
+else
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libinterop_client_main.a: protobuf_dep_error
 
 
 else
@@ -3778,17 +3842,17 @@
 test/cpp/interop/empty.proto: $(OPENSSL_DEP)
 test/cpp/interop/messages.proto: $(OPENSSL_DEP)
 test/cpp/interop/test.proto: $(OPENSSL_DEP)
-test/cpp/interop/client_helper.cc: $(OPENSSL_DEP)
+test/cpp/interop/client.cc: $(OPENSSL_DEP)
 test/cpp/interop/interop_client.cc: $(OPENSSL_DEP)
 endif
 
-$(LIBDIR)/$(CONFIG)/libinterop_client_lib.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(PROTOBUF_DEP) $(LIBINTEROP_CLIENT_LIB_OBJS)
+$(LIBDIR)/$(CONFIG)/libinterop_client_main.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(PROTOBUF_DEP) $(LIBINTEROP_CLIENT_MAIN_OBJS)
 	$(E) "[AR]      Creating $@"
 	$(Q) mkdir -p `dirname $@`
-	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libinterop_client_lib.a
-	$(Q) $(AR) rcs $(LIBDIR)/$(CONFIG)/libinterop_client_lib.a $(LIBINTEROP_CLIENT_LIB_OBJS)
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libinterop_client_main.a
+	$(Q) $(AR) rcs $(LIBDIR)/$(CONFIG)/libinterop_client_main.a $(LIBINTEROP_CLIENT_MAIN_OBJS)
 ifeq ($(SYSTEM),Darwin)
-	$(Q) ranlib $(LIBDIR)/$(CONFIG)/libinterop_client_lib.a
+	$(Q) ranlib $(LIBDIR)/$(CONFIG)/libinterop_client_main.a
 endif
 
 
@@ -3800,28 +3864,28 @@
 
 ifneq ($(NO_SECURE),true)
 ifneq ($(NO_DEPS),true)
--include $(LIBINTEROP_CLIENT_LIB_OBJS:.o=.dep)
+-include $(LIBINTEROP_CLIENT_MAIN_OBJS:.o=.dep)
 endif
 endif
 
 
 
 
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/client_helper.o:     $(GENDIR)/test/cpp/interop/empty.pb.cc $(GENDIR)/test/cpp/interop/empty.grpc.pb.cc    $(GENDIR)/test/cpp/interop/messages.pb.cc $(GENDIR)/test/cpp/interop/messages.grpc.pb.cc    $(GENDIR)/test/cpp/interop/test.pb.cc $(GENDIR)/test/cpp/interop/test.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/interop/client.o:     $(GENDIR)/test/cpp/interop/empty.pb.cc $(GENDIR)/test/cpp/interop/empty.grpc.pb.cc    $(GENDIR)/test/cpp/interop/messages.pb.cc $(GENDIR)/test/cpp/interop/messages.grpc.pb.cc    $(GENDIR)/test/cpp/interop/test.pb.cc $(GENDIR)/test/cpp/interop/test.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_client.o:     $(GENDIR)/test/cpp/interop/empty.pb.cc $(GENDIR)/test/cpp/interop/empty.grpc.pb.cc    $(GENDIR)/test/cpp/interop/messages.pb.cc $(GENDIR)/test/cpp/interop/messages.grpc.pb.cc    $(GENDIR)/test/cpp/interop/test.pb.cc $(GENDIR)/test/cpp/interop/test.grpc.pb.cc
 
 
-LIBINTEROP_SERVER_LIB_SRC = \
+LIBINTEROP_SERVER_HELPER_SRC = \
     test/cpp/interop/server_helper.cc \
 
 
-LIBINTEROP_SERVER_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBINTEROP_SERVER_LIB_SRC))))
+LIBINTEROP_SERVER_HELPER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBINTEROP_SERVER_HELPER_SRC))))
 
 ifeq ($(NO_SECURE),true)
 
 # You can't build secure libraries if you don't have OpenSSL with ALPN.
 
-$(LIBDIR)/$(CONFIG)/libinterop_server_lib.a: openssl_dep_error
+$(LIBDIR)/$(CONFIG)/libinterop_server_helper.a: openssl_dep_error
 
 
 else
@@ -3830,7 +3894,7 @@
 
 # You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
 
-$(LIBDIR)/$(CONFIG)/libinterop_server_lib.a: protobuf_dep_error
+$(LIBDIR)/$(CONFIG)/libinterop_server_helper.a: protobuf_dep_error
 
 
 else
@@ -3842,13 +3906,13 @@
 test/cpp/interop/server_helper.cc: $(OPENSSL_DEP)
 endif
 
-$(LIBDIR)/$(CONFIG)/libinterop_server_lib.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(PROTOBUF_DEP) $(LIBINTEROP_SERVER_LIB_OBJS)
+$(LIBDIR)/$(CONFIG)/libinterop_server_helper.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(PROTOBUF_DEP) $(LIBINTEROP_SERVER_HELPER_OBJS)
 	$(E) "[AR]      Creating $@"
 	$(Q) mkdir -p `dirname $@`
-	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a
-	$(Q) $(AR) rcs $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a $(LIBINTEROP_SERVER_LIB_OBJS)
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a
+	$(Q) $(AR) rcs $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a $(LIBINTEROP_SERVER_HELPER_OBJS)
 ifeq ($(SYSTEM),Darwin)
-	$(Q) ranlib $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a
+	$(Q) ranlib $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a
 endif
 
 
@@ -3860,13 +3924,78 @@
 
 ifneq ($(NO_SECURE),true)
 ifneq ($(NO_DEPS),true)
--include $(LIBINTEROP_SERVER_LIB_OBJS:.o=.dep)
+-include $(LIBINTEROP_SERVER_HELPER_OBJS:.o=.dep)
 endif
 endif
 
 $(OBJDIR)/$(CONFIG)/test/cpp/interop/server_helper.o: 
 
 
+LIBINTEROP_SERVER_MAIN_SRC = \
+    $(GENDIR)/test/cpp/interop/empty.pb.cc $(GENDIR)/test/cpp/interop/empty.grpc.pb.cc \
+    $(GENDIR)/test/cpp/interop/messages.pb.cc $(GENDIR)/test/cpp/interop/messages.grpc.pb.cc \
+    $(GENDIR)/test/cpp/interop/test.pb.cc $(GENDIR)/test/cpp/interop/test.grpc.pb.cc \
+    test/cpp/interop/server.cc \
+
+
+LIBINTEROP_SERVER_MAIN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBINTEROP_SERVER_MAIN_SRC))))
+
+ifeq ($(NO_SECURE),true)
+
+# You can't build secure libraries if you don't have OpenSSL with ALPN.
+
+$(LIBDIR)/$(CONFIG)/libinterop_server_main.a: openssl_dep_error
+
+
+else
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libinterop_server_main.a: protobuf_dep_error
+
+
+else
+
+ifneq ($(OPENSSL_DEP),)
+# This is to ensure the embedded OpenSSL is built beforehand, properly
+# installing headers to their final destination on the drive. We need this
+# otherwise parallel compilation will fail if a source is compiled first.
+test/cpp/interop/empty.proto: $(OPENSSL_DEP)
+test/cpp/interop/messages.proto: $(OPENSSL_DEP)
+test/cpp/interop/test.proto: $(OPENSSL_DEP)
+test/cpp/interop/server.cc: $(OPENSSL_DEP)
+endif
+
+$(LIBDIR)/$(CONFIG)/libinterop_server_main.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(PROTOBUF_DEP) $(LIBINTEROP_SERVER_MAIN_OBJS)
+	$(E) "[AR]      Creating $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libinterop_server_main.a
+	$(Q) $(AR) rcs $(LIBDIR)/$(CONFIG)/libinterop_server_main.a $(LIBINTEROP_SERVER_MAIN_OBJS)
+ifeq ($(SYSTEM),Darwin)
+	$(Q) ranlib $(LIBDIR)/$(CONFIG)/libinterop_server_main.a
+endif
+
+
+
+
+endif
+
+endif
+
+ifneq ($(NO_SECURE),true)
+ifneq ($(NO_DEPS),true)
+-include $(LIBINTEROP_SERVER_MAIN_OBJS:.o=.dep)
+endif
+endif
+
+
+
+
+$(OBJDIR)/$(CONFIG)/test/cpp/interop/server.o:     $(GENDIR)/test/cpp/interop/empty.pb.cc $(GENDIR)/test/cpp/interop/empty.grpc.pb.cc    $(GENDIR)/test/cpp/interop/messages.pb.cc $(GENDIR)/test/cpp/interop/messages.grpc.pb.cc    $(GENDIR)/test/cpp/interop/test.pb.cc $(GENDIR)/test/cpp/interop/test.grpc.pb.cc
+
+
 LIBPUBSUB_CLIENT_LIB_SRC = \
     $(GENDIR)/examples/pubsub/label.pb.cc $(GENDIR)/examples/pubsub/label.grpc.pb.cc \
     $(GENDIR)/examples/pubsub/empty.pb.cc $(GENDIR)/examples/pubsub/empty.grpc.pb.cc \
@@ -3937,8 +4066,13 @@
 
 LIBQPS_SRC = \
     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc \
+    test/cpp/qps/client_async.cc \
+    test/cpp/qps/client_sync.cc \
     test/cpp/qps/driver.cc \
+    test/cpp/qps/qps_worker.cc \
     test/cpp/qps/report.cc \
+    test/cpp/qps/server_async.cc \
+    test/cpp/qps/server_sync.cc \
     test/cpp/qps/timer.cc \
 
 
@@ -3967,8 +4101,13 @@
 # installing headers to their final destination on the drive. We need this
 # otherwise parallel compilation will fail if a source is compiled first.
 test/cpp/qps/qpstest.proto: $(OPENSSL_DEP)
+test/cpp/qps/client_async.cc: $(OPENSSL_DEP)
+test/cpp/qps/client_sync.cc: $(OPENSSL_DEP)
 test/cpp/qps/driver.cc: $(OPENSSL_DEP)
+test/cpp/qps/qps_worker.cc: $(OPENSSL_DEP)
 test/cpp/qps/report.cc: $(OPENSSL_DEP)
+test/cpp/qps/server_async.cc: $(OPENSSL_DEP)
+test/cpp/qps/server_sync.cc: $(OPENSSL_DEP)
 test/cpp/qps/timer.cc: $(OPENSSL_DEP)
 endif
 
@@ -3995,8 +4134,13 @@
 endif
 
 
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/qps/driver.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_worker.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/qps/report.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/qps/timer.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
 
 
@@ -8238,7 +8382,7 @@
 $(BINDIR)/$(CONFIG)/async_end2end_test: $(PROTOBUF_DEP) $(ASYNC_END2END_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) $(ASYNC_END2END_TEST_OBJS) $(GTEST_LIB) $(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) -o $(BINDIR)/$(CONFIG)/async_end2end_test
+	$(Q) $(LDXX) $(LDFLAGS) $(ASYNC_END2END_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)/async_end2end_test
 
 endif
 
@@ -8280,7 +8424,7 @@
 $(BINDIR)/$(CONFIG)/channel_arguments_test: $(PROTOBUF_DEP) $(CHANNEL_ARGUMENTS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a
 	$(E) "[LD]      Linking $@"
 	$(Q) mkdir -p `dirname $@`
-	$(Q) $(LDXX) $(LDFLAGS) $(CHANNEL_ARGUMENTS_TEST_OBJS) $(GTEST_LIB) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/channel_arguments_test
+	$(Q) $(LDXX) $(LDFLAGS) $(CHANNEL_ARGUMENTS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/channel_arguments_test
 
 endif
 
@@ -8322,7 +8466,7 @@
 $(BINDIR)/$(CONFIG)/cli_call_test: $(PROTOBUF_DEP) $(CLI_CALL_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) $(CLI_CALL_TEST_OBJS) $(GTEST_LIB) $(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) -o $(BINDIR)/$(CONFIG)/cli_call_test
+	$(Q) $(LDXX) $(LDFLAGS) $(CLI_CALL_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)/cli_call_test
 
 endif
 
@@ -8364,7 +8508,7 @@
 $(BINDIR)/$(CONFIG)/credentials_test: $(PROTOBUF_DEP) $(CREDENTIALS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a
 	$(E) "[LD]      Linking $@"
 	$(Q) mkdir -p `dirname $@`
-	$(Q) $(LDXX) $(LDFLAGS) $(CREDENTIALS_TEST_OBJS) $(GTEST_LIB) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/credentials_test
+	$(Q) $(LDXX) $(LDFLAGS) $(CREDENTIALS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/credentials_test
 
 endif
 
@@ -8406,7 +8550,7 @@
 $(BINDIR)/$(CONFIG)/cxx_time_test: $(PROTOBUF_DEP) $(CXX_TIME_TEST_OBJS) $(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) $(CXX_TIME_TEST_OBJS) $(GTEST_LIB) $(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) -o $(BINDIR)/$(CONFIG)/cxx_time_test
+	$(Q) $(LDXX) $(LDFLAGS) $(CXX_TIME_TEST_OBJS) $(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)/cxx_time_test
 
 endif
 
@@ -8448,7 +8592,7 @@
 $(BINDIR)/$(CONFIG)/end2end_test: $(PROTOBUF_DEP) $(END2END_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) $(END2END_TEST_OBJS) $(GTEST_LIB) $(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) -o $(BINDIR)/$(CONFIG)/end2end_test
+	$(Q) $(LDXX) $(LDFLAGS) $(END2END_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)/end2end_test
 
 endif
 
@@ -8490,7 +8634,7 @@
 $(BINDIR)/$(CONFIG)/generic_end2end_test: $(PROTOBUF_DEP) $(GENERIC_END2END_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) $(GENERIC_END2END_TEST_OBJS) $(GTEST_LIB) $(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) -o $(BINDIR)/$(CONFIG)/generic_end2end_test
+	$(Q) $(LDXX) $(LDFLAGS) $(GENERIC_END2END_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)/generic_end2end_test
 
 endif
 
@@ -8532,7 +8676,7 @@
 $(BINDIR)/$(CONFIG)/grpc_cli: $(PROTOBUF_DEP) $(GRPC_CLI_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) $(GRPC_CLI_OBJS) $(GTEST_LIB) $(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) -o $(BINDIR)/$(CONFIG)/grpc_cli
+	$(Q) $(LDXX) $(LDFLAGS) $(GRPC_CLI_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)/grpc_cli
 
 endif
 
@@ -8670,7 +8814,6 @@
 
 
 INTEROP_CLIENT_SRC = \
-    test/cpp/interop/client.cc \
 
 INTEROP_CLIENT_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INTEROP_CLIENT_SRC))))
 
@@ -8691,16 +8834,15 @@
 
 else
 
-$(BINDIR)/$(CONFIG)/interop_client: $(PROTOBUF_DEP) $(INTEROP_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libinterop_client_lib.a $(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
+$(BINDIR)/$(CONFIG)/interop_client: $(PROTOBUF_DEP) $(INTEROP_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libinterop_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a $(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) $(INTEROP_CLIENT_OBJS) $(GTEST_LIB) $(LIBDIR)/$(CONFIG)/libinterop_client_lib.a $(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) -o $(BINDIR)/$(CONFIG)/interop_client
+	$(Q) $(LDXX) $(LDFLAGS) $(INTEROP_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libinterop_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a $(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)/interop_client
 
 endif
 
 endif
 
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/client.o:  $(LIBDIR)/$(CONFIG)/libinterop_client_lib.a $(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_interop_client: $(INTEROP_CLIENT_OBJS:.o=.dep)
 
@@ -8712,10 +8854,6 @@
 
 
 INTEROP_SERVER_SRC = \
-    $(GENDIR)/test/cpp/interop/empty.pb.cc $(GENDIR)/test/cpp/interop/empty.grpc.pb.cc \
-    $(GENDIR)/test/cpp/interop/messages.pb.cc $(GENDIR)/test/cpp/interop/messages.grpc.pb.cc \
-    $(GENDIR)/test/cpp/interop/test.pb.cc $(GENDIR)/test/cpp/interop/test.grpc.pb.cc \
-    test/cpp/interop/server.cc \
 
 INTEROP_SERVER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INTEROP_SERVER_SRC))))
 
@@ -8736,19 +8874,15 @@
 
 else
 
-$(BINDIR)/$(CONFIG)/interop_server: $(PROTOBUF_DEP) $(INTEROP_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a $(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
+$(BINDIR)/$(CONFIG)/interop_server: $(PROTOBUF_DEP) $(INTEROP_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libinterop_server_main.a $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a $(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) $(INTEROP_SERVER_OBJS) $(GTEST_LIB) $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a $(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) -o $(BINDIR)/$(CONFIG)/interop_server
+	$(Q) $(LDXX) $(LDFLAGS) $(INTEROP_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libinterop_server_main.a $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a $(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)/interop_server
 
 endif
 
 endif
 
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/empty.o:  $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/messages.o:  $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/test.o:  $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/server.o:  $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a $(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_interop_server: $(INTEROP_SERVER_OBJS:.o=.dep)
 
@@ -8784,7 +8918,7 @@
 $(BINDIR)/$(CONFIG)/interop_test: $(PROTOBUF_DEP) $(INTEROP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.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) $(INTEROP_TEST_OBJS) $(GTEST_LIB) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/interop_test
+	$(Q) $(LDXX) $(LDFLAGS) $(INTEROP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.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)/interop_test
 
 endif
 
@@ -8826,7 +8960,7 @@
 $(BINDIR)/$(CONFIG)/pubsub_client: $(PROTOBUF_DEP) $(PUBSUB_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libpubsub_client_lib.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) $(PUBSUB_CLIENT_OBJS) $(GTEST_LIB) $(LIBDIR)/$(CONFIG)/libpubsub_client_lib.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) -o $(BINDIR)/$(CONFIG)/pubsub_client
+	$(Q) $(LDXX) $(LDFLAGS) $(PUBSUB_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libpubsub_client_lib.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)/pubsub_client
 
 endif
 
@@ -8868,7 +9002,7 @@
 $(BINDIR)/$(CONFIG)/pubsub_publisher_test: $(PROTOBUF_DEP) $(PUBSUB_PUBLISHER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libpubsub_client_lib.a $(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) $(PUBSUB_PUBLISHER_TEST_OBJS) $(GTEST_LIB) $(LIBDIR)/$(CONFIG)/libpubsub_client_lib.a $(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) -o $(BINDIR)/$(CONFIG)/pubsub_publisher_test
+	$(Q) $(LDXX) $(LDFLAGS) $(PUBSUB_PUBLISHER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libpubsub_client_lib.a $(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)/pubsub_publisher_test
 
 endif
 
@@ -8910,7 +9044,7 @@
 $(BINDIR)/$(CONFIG)/pubsub_subscriber_test: $(PROTOBUF_DEP) $(PUBSUB_SUBSCRIBER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libpubsub_client_lib.a $(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) $(PUBSUB_SUBSCRIBER_TEST_OBJS) $(GTEST_LIB) $(LIBDIR)/$(CONFIG)/libpubsub_client_lib.a $(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) -o $(BINDIR)/$(CONFIG)/pubsub_subscriber_test
+	$(Q) $(LDXX) $(LDFLAGS) $(PUBSUB_SUBSCRIBER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libpubsub_client_lib.a $(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)/pubsub_subscriber_test
 
 endif
 
@@ -8952,7 +9086,7 @@
 $(BINDIR)/$(CONFIG)/qps_driver: $(PROTOBUF_DEP) $(QPS_DRIVER_OBJS) $(LIBDIR)/$(CONFIG)/libqps.a $(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) $(QPS_DRIVER_OBJS) $(GTEST_LIB) $(LIBDIR)/$(CONFIG)/libqps.a $(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) -o $(BINDIR)/$(CONFIG)/qps_driver
+	$(Q) $(LDXX) $(LDFLAGS) $(QPS_DRIVER_OBJS) $(LIBDIR)/$(CONFIG)/libqps.a $(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)/qps_driver
 
 endif
 
@@ -8994,7 +9128,7 @@
 $(BINDIR)/$(CONFIG)/qps_smoke_test: $(PROTOBUF_DEP) $(QPS_SMOKE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libqps.a $(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) $(QPS_SMOKE_TEST_OBJS) $(GTEST_LIB) $(LIBDIR)/$(CONFIG)/libqps.a $(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) -o $(BINDIR)/$(CONFIG)/qps_smoke_test
+	$(Q) $(LDXX) $(LDFLAGS) $(QPS_SMOKE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libqps.a $(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)/qps_smoke_test
 
 endif
 
@@ -9012,10 +9146,6 @@
 
 
 QPS_WORKER_SRC = \
-    test/cpp/qps/client_async.cc \
-    test/cpp/qps/client_sync.cc \
-    test/cpp/qps/server_async.cc \
-    test/cpp/qps/server_sync.cc \
     test/cpp/qps/worker.cc \
 
 QPS_WORKER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(QPS_WORKER_SRC))))
@@ -9040,16 +9170,12 @@
 $(BINDIR)/$(CONFIG)/qps_worker: $(PROTOBUF_DEP) $(QPS_WORKER_OBJS) $(LIBDIR)/$(CONFIG)/libqps.a $(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) $(QPS_WORKER_OBJS) $(GTEST_LIB) $(LIBDIR)/$(CONFIG)/libqps.a $(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) -o $(BINDIR)/$(CONFIG)/qps_worker
+	$(Q) $(LDXX) $(LDFLAGS) $(QPS_WORKER_OBJS) $(LIBDIR)/$(CONFIG)/libqps.a $(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)/qps_worker
 
 endif
 
 endif
 
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o:  $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o:  $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o:  $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o:  $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
 $(OBJDIR)/$(CONFIG)/test/cpp/qps/worker.o:  $(LIBDIR)/$(CONFIG)/libqps.a $(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_qps_worker: $(QPS_WORKER_OBJS:.o=.dep)
@@ -9086,7 +9212,7 @@
 $(BINDIR)/$(CONFIG)/status_test: $(PROTOBUF_DEP) $(STATUS_TEST_OBJS) $(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) $(STATUS_TEST_OBJS) $(GTEST_LIB) $(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) -o $(BINDIR)/$(CONFIG)/status_test
+	$(Q) $(LDXX) $(LDFLAGS) $(STATUS_TEST_OBJS) $(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)/status_test
 
 endif
 
@@ -9128,7 +9254,7 @@
 $(BINDIR)/$(CONFIG)/thread_pool_test: $(PROTOBUF_DEP) $(THREAD_POOL_TEST_OBJS) $(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) $(THREAD_POOL_TEST_OBJS) $(GTEST_LIB) $(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) -o $(BINDIR)/$(CONFIG)/thread_pool_test
+	$(Q) $(LDXX) $(LDFLAGS) $(THREAD_POOL_TEST_OBJS) $(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)/thread_pool_test
 
 endif
 
diff --git a/build.json b/build.json
index 94b66b0..cb8d943 100644
--- a/build.json
+++ b/build.json
@@ -197,6 +197,7 @@
         "src/core/iomgr/alarm_heap.c",
         "src/core/iomgr/endpoint.c",
         "src/core/iomgr/endpoint_pair_posix.c",
+        "src/core/iomgr/endpoint_pair_windows.c",
         "src/core/iomgr/fd_posix.c",
         "src/core/iomgr/iocp_windows.c",
         "src/core/iomgr/iomgr.c",
@@ -444,6 +445,7 @@
         "test/core/util/grpc_profiler.c",
         "test/core/util/parse_hexstring.c",
         "test/core/util/port_posix.c",
+        "test/core/util/port_windows.c",
         "test/core/util/slice_splitter.c"
       ],
       "deps": [
@@ -546,15 +548,11 @@
       "secure": "no"
     },
     {
-      "name": "interop_client_lib",
+      "name": "interop_client_helper",
       "build": "private",
       "language": "c++",
       "src": [
-        "test/cpp/interop/empty.proto",
-        "test/cpp/interop/messages.proto",
-        "test/cpp/interop/test.proto",
-        "test/cpp/interop/client_helper.cc",
-        "test/cpp/interop/interop_client.cc"
+        "test/cpp/interop/client_helper.cc"
       ],
       "deps": [
         "grpc++_test_util",
@@ -565,7 +563,27 @@
       ]
     },
     {
-      "name": "interop_server_lib",
+      "name": "interop_client_main",
+      "build": "private",
+      "language": "c++",
+      "src": [
+        "test/cpp/interop/empty.proto",
+        "test/cpp/interop/messages.proto",
+        "test/cpp/interop/test.proto",
+        "test/cpp/interop/client.cc",
+        "test/cpp/interop/interop_client.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "interop_server_helper",
       "build": "private",
       "language": "c++",
       "src": [
@@ -579,6 +597,25 @@
       ]
     },
     {
+      "name": "interop_server_main",
+      "build": "private",
+      "language": "c++",
+      "src": [
+        "test/cpp/interop/empty.proto",
+        "test/cpp/interop/messages.proto",
+        "test/cpp/interop/test.proto",
+        "test/cpp/interop/server.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
       "name": "pubsub_client_lib",
       "build": "private",
       "language": "c++",
@@ -601,13 +638,19 @@
       "language": "c++",
       "headers": [
         "test/cpp/qps/driver.h",
+        "test/cpp/qps/qps_worker.h",
         "test/cpp/qps/report.h",
         "test/cpp/qps/timer.h"
       ],
       "src": [
         "test/cpp/qps/qpstest.proto",
+        "test/cpp/qps/client_async.cc",
+        "test/cpp/qps/client_sync.cc",
         "test/cpp/qps/driver.cc",
+        "test/cpp/qps/qps_worker.cc",
         "test/cpp/qps/report.cc",
+        "test/cpp/qps/server_async.cc",
+        "test/cpp/qps/server_sync.cc",
         "test/cpp/qps/timer.cc"
       ]
     },
@@ -906,6 +949,9 @@
         "grpc",
         "gpr_test_util",
         "gpr"
+      ],
+      "platforms": [
+        "posix"
       ]
     },
     {
@@ -1922,11 +1968,10 @@
       "build": "test",
       "run": false,
       "language": "c++",
-      "src": [
-        "test/cpp/interop/client.cc"
-      ],
+      "src": [],
       "deps": [
-        "interop_client_lib",
+        "interop_client_main",
+        "interop_client_helper",
         "grpc++_test_util",
         "grpc_test_util",
         "grpc++",
@@ -1940,14 +1985,10 @@
       "build": "test",
       "run": false,
       "language": "c++",
-      "src": [
-        "test/cpp/interop/empty.proto",
-        "test/cpp/interop/messages.proto",
-        "test/cpp/interop/test.proto",
-        "test/cpp/interop/server.cc"
-      ],
+      "src": [],
       "deps": [
-        "interop_server_lib",
+        "interop_server_main",
+        "interop_server_helper",
         "grpc++_test_util",
         "grpc_test_util",
         "grpc++",
@@ -2067,10 +2108,6 @@
         "test/cpp/qps/server.h"
       ],
       "src": [
-        "test/cpp/qps/client_async.cc",
-        "test/cpp/qps/client_sync.cc",
-        "test/cpp/qps/server_async.cc",
-        "test/cpp/qps/server_sync.cc",
         "test/cpp/qps/worker.cc"
       ],
       "deps": [
diff --git a/include/grpc/support/slice_buffer.h b/include/grpc/support/slice_buffer.h
index c7e5dbc..1545dbf 100644
--- a/include/grpc/support/slice_buffer.h
+++ b/include/grpc/support/slice_buffer.h
@@ -40,6 +40,8 @@
 extern "C" {
 #endif
 
+#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 */
@@ -52,6 +54,8 @@
   size_t capacity;
   /* the combined length of all slices in the array */
   size_t length;
+  /* inlined elements to avoid allocations */
+  gpr_slice inlined[GRPC_SLICE_BUFFER_INLINE_ELEMENTS];
 } gpr_slice_buffer;
 
 /* initialize a slice buffer */
@@ -78,9 +82,11 @@
 void gpr_slice_buffer_pop(gpr_slice_buffer *sb);
 /* clear a slice buffer, unref all elements */
 void gpr_slice_buffer_reset_and_unref(gpr_slice_buffer *sb);
+/* swap the contents of two slice buffers */
+void gpr_slice_buffer_swap(gpr_slice_buffer *a, gpr_slice_buffer *b);
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif  /* GRPC_SUPPORT_SLICE_BUFFER_H */
+#endif /* GRPC_SUPPORT_SLICE_BUFFER_H */
diff --git a/src/core/iomgr/endpoint_pair_windows.c b/src/core/iomgr/endpoint_pair_windows.c
new file mode 100644
index 0000000..d78b6ea
--- /dev/null
+++ b/src/core/iomgr/endpoint_pair_windows.c
@@ -0,0 +1,85 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <grpc/support/port_platform.h>
+
+#ifdef GPR_WINSOCK_SOCKET
+#include "src/core/iomgr/sockaddr_utils.h"
+#include "src/core/iomgr/endpoint_pair.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include "src/core/iomgr/tcp_windows.h"
+#include "src/core/iomgr/socket_windows.h"
+#include <grpc/support/log.h>
+
+static void create_sockets(SOCKET sv[2]) {
+  SOCKET svr_sock = INVALID_SOCKET;
+  SOCKET lst_sock = INVALID_SOCKET;
+  SOCKET cli_sock = INVALID_SOCKET;
+  SOCKADDR_IN addr;
+  int addr_len;
+
+  lst_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
+  GPR_ASSERT(lst_sock != INVALID_SOCKET);
+
+  memset(&addr, 0, sizeof(addr));
+  GPR_ASSERT(bind(lst_sock, (struct sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR);
+  GPR_ASSERT(listen(lst_sock, SOMAXCONN) != SOCKET_ERROR);
+  GPR_ASSERT(getsockname(lst_sock, (struct sockaddr*)&addr, &addr_len) != SOCKET_ERROR);
+
+  cli_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
+  GPR_ASSERT(cli_sock != INVALID_SOCKET);
+
+  GPR_ASSERT(WSAConnect(cli_sock, (struct sockaddr*)&addr, addr_len, NULL, NULL, NULL, NULL) == 0);
+  svr_sock = accept(lst_sock, (struct sockaddr*)&addr, &addr_len);
+  GPR_ASSERT(svr_sock != INVALID_SOCKET);
+
+  closesocket(lst_sock);
+
+  sv[1] = cli_sock;
+  sv[0] = svr_sock;
+}
+
+grpc_endpoint_pair grpc_iomgr_create_endpoint_pair(size_t read_slice_size) {
+  SOCKET sv[2];
+  grpc_endpoint_pair p;
+  create_sockets(sv);
+  p.client = grpc_tcp_create(grpc_winsocket_create(sv[1]));
+  p.server = grpc_tcp_create(grpc_winsocket_create(sv[0]));
+  return p;
+}
+
+#endif
diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c
index 895f85f..7e31f2d 100644
--- a/src/core/iomgr/tcp_server_posix.c
+++ b/src/core/iomgr/tcp_server_posix.c
@@ -174,7 +174,6 @@
   while (s->active_ports) {
     gpr_cv_wait(&s->cv, &s->mu, gpr_inf_future);
   }
-  gpr_mu_unlock(&s->mu);
 
   /* delete ALL the things */
   if (s->nports) {
@@ -185,7 +184,9 @@
       }
       grpc_fd_orphan(sp->emfd, destroyed_port, s);
     }
+    gpr_mu_unlock(&s->mu);
   } else {
+    gpr_mu_unlock(&s->mu);
     finish_shutdown(s);
   }
 }
diff --git a/src/core/security/factories.c b/src/core/security/factories.c
index 02267d5..3d9216a 100644
--- a/src/core/security/factories.c
+++ b/src/core/security/factories.c
@@ -50,3 +50,19 @@
   return grpc_secure_channel_create_with_factories(
       factories, GPR_ARRAY_SIZE(factories), creds, target, args);
 }
+
+grpc_security_status grpc_server_security_context_create(
+    grpc_server_credentials *creds, grpc_security_context **ctx) {
+  grpc_security_status status = GRPC_SECURITY_ERROR;
+
+  *ctx = NULL;
+  if (strcmp(creds->type, GRPC_CREDENTIALS_TYPE_SSL) == 0) {
+    status = grpc_ssl_server_security_context_create(
+        grpc_ssl_server_credentials_get_config(creds), ctx);
+  } else if (strcmp(creds->type,
+                    GRPC_CREDENTIALS_TYPE_FAKE_TRANSPORT_SECURITY) == 0) {
+    *ctx = grpc_fake_server_security_context_create();
+    status = GRPC_SECURITY_OK;
+  }
+  return status;
+}
diff --git a/src/core/security/security_context.h b/src/core/security/security_context.h
index 0b5821c..2b4e38f 100644
--- a/src/core/security/security_context.h
+++ b/src/core/security/security_context.h
@@ -206,10 +206,9 @@
     const grpc_secure_channel_factory *factories, size_t num_factories,
     grpc_credentials *creds, const char *target, const grpc_channel_args *args);
 
-/* Secure server creation. */
+/* Secure server context creation. */
 
-grpc_server *grpc_secure_server_create_internal(grpc_completion_queue *cq,
-                                                const grpc_channel_args *args,
-                                                grpc_security_context *ctx);
+grpc_security_status grpc_server_security_context_create(
+    grpc_server_credentials *creds, grpc_security_context **ctx);
 
 #endif  /* GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H */
diff --git a/src/core/security/server_secure_chttp2.c b/src/core/security/server_secure_chttp2.c
index 0812727..165ed54 100644
--- a/src/core/security/server_secure_chttp2.c
+++ b/src/core/security/server_secure_chttp2.c
@@ -141,16 +141,7 @@
 
   /* create security context */
   if (creds == NULL) goto error;
-
-  if (strcmp(creds->type, GRPC_CREDENTIALS_TYPE_SSL) == 0) {
-    status = grpc_ssl_server_security_context_create(
-        grpc_ssl_server_credentials_get_config(creds), &ctx);
-  } else if (strcmp(creds->type,
-                    GRPC_CREDENTIALS_TYPE_FAKE_TRANSPORT_SECURITY) == 0) {
-    ctx = grpc_fake_server_security_context_create();
-    status = GRPC_SECURITY_OK;
-  }
-
+  status = grpc_server_security_context_create(creds, &ctx);
   if (status != GRPC_SECURITY_OK) {
     gpr_log(GPR_ERROR,
             "Unable to create secure server with credentials of type %s.",
diff --git a/src/core/support/slice_buffer.c b/src/core/support/slice_buffer.c
index b280e4b..3b1daa0 100644
--- a/src/core/support/slice_buffer.c
+++ b/src/core/support/slice_buffer.c
@@ -38,21 +38,34 @@
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 
-/* initial allocation size (# of slices) */
-#define INITIAL_CAPACITY 4
-/* grow a buffer; requires INITIAL_CAPACITY > 1 */
+/* grow a buffer; requires GRPC_SLICE_BUFFER_INLINE_ELEMENTS > 1 */
 #define GROW(x) (3 * (x) / 2)
 
+static void maybe_embiggen(gpr_slice_buffer *sb) {
+  if (sb->count == sb->capacity) {
+    sb->capacity = GROW(sb->capacity);
+    GPR_ASSERT(sb->capacity > sb->count);
+    if (sb->slices == sb->inlined) {
+      sb->slices = gpr_malloc(sb->capacity * sizeof(gpr_slice));
+      memcpy(sb->slices, sb->inlined, sb->count * sizeof(gpr_slice));
+    } else {
+      sb->slices = gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice));
+    }
+  }
+}
+
 void gpr_slice_buffer_init(gpr_slice_buffer *sb) {
   sb->count = 0;
   sb->length = 0;
-  sb->capacity = INITIAL_CAPACITY;
-  sb->slices = gpr_malloc(sizeof(gpr_slice) * INITIAL_CAPACITY);
+  sb->capacity = GRPC_SLICE_BUFFER_INLINE_ELEMENTS;
+  sb->slices = sb->inlined;
 }
 
 void gpr_slice_buffer_destroy(gpr_slice_buffer *sb) {
   gpr_slice_buffer_reset_and_unref(sb);
-  gpr_free(sb->slices);
+  if (sb->slices != sb->inlined) {
+    gpr_free(sb->slices);
+  }
 }
 
 gpr_uint8 *gpr_slice_buffer_tiny_add(gpr_slice_buffer *sb, unsigned n) {
@@ -71,11 +84,7 @@
   return out;
 
 add_new:
-  if (sb->count == sb->capacity) {
-    sb->capacity = GROW(sb->capacity);
-    GPR_ASSERT(sb->capacity > sb->count);
-    sb->slices = gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice));
-  }
+  maybe_embiggen(sb);
   back = &sb->slices[sb->count];
   sb->count++;
   back->refcount = NULL;
@@ -85,11 +94,7 @@
 
 size_t gpr_slice_buffer_add_indexed(gpr_slice_buffer *sb, gpr_slice s) {
   size_t out = sb->count;
-  if (out == sb->capacity) {
-    sb->capacity = GROW(sb->capacity);
-    GPR_ASSERT(sb->capacity > sb->count);
-    sb->slices = gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice));
-  }
+  maybe_embiggen(sb);
   sb->slices[out] = s;
   sb->length += GPR_SLICE_LENGTH(s);
   sb->count = out + 1;
@@ -116,12 +121,7 @@
         memcpy(back->data.inlined.bytes + back->data.inlined.length,
                s.data.inlined.bytes, cp1);
         back->data.inlined.length = GPR_SLICE_INLINED_SIZE;
-        if (n == sb->capacity) {
-          sb->capacity = GROW(sb->capacity);
-          GPR_ASSERT(sb->capacity > sb->count);
-          sb->slices =
-              gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice));
-        }
+        maybe_embiggen(sb);
         back = &sb->slices[n];
         sb->count = n + 1;
         back->refcount = NULL;
@@ -160,3 +160,16 @@
   sb->count = 0;
   sb->length = 0;
 }
+
+void gpr_slice_buffer_swap(gpr_slice_buffer *a, gpr_slice_buffer *b) {
+  gpr_slice_buffer temp = *a;
+  *a = *b;
+  *b = temp;
+
+  if (a->slices == b->inlined) {
+    a->slices = a->inlined;
+  }
+  if (b->slices == a->inlined) {
+    b->slices = b->inlined;
+  }
+}
diff --git a/src/core/support/time_win32.c b/src/core/support/time_win32.c
index f221cb5..539470b 100644
--- a/src/core/support/time_win32.c
+++ b/src/core/support/time_win32.c
@@ -39,6 +39,7 @@
 
 #include <grpc/support/time.h>
 #include <sys/timeb.h>
+#include <windows.h>
 
 gpr_timespec gpr_now(void) {
   gpr_timespec now_tv;
@@ -49,4 +50,23 @@
   return now_tv;
 }
 
+void gpr_sleep_until(gpr_timespec until) {
+  gpr_timespec now;
+  gpr_timespec delta;
+  DWORD sleep_millis;
+
+  for (;;) {
+    /* We could simplify by using clock_nanosleep instead, but it might be
+     * slightly less portable. */
+    now = gpr_now();
+    if (gpr_time_cmp(until, now) <= 0) {
+      return;
+    }
+
+    delta = gpr_time_sub(until, now);
+    sleep_millis = delta.tv_sec * GPR_MS_PER_SEC + delta.tv_nsec / GPR_NS_PER_MS;
+    Sleep(sleep_millis);
+  }
+}
+
 #endif /* GPR_WIN32 */
diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c
index 4c0394d..110a4b5 100644
--- a/src/core/transport/chttp2_transport.c
+++ b/src/core/transport/chttp2_transport.c
@@ -834,13 +834,10 @@
 
 static int prepare_write(transport *t) {
   stream *s;
-  gpr_slice_buffer tempbuf;
   gpr_uint32 window_delta;
 
   /* simple writes are queued to qbuf, and flushed here */
-  tempbuf = t->qbuf;
-  t->qbuf = t->outbuf;
-  t->outbuf = tempbuf;
+  gpr_slice_buffer_swap(&t->qbuf, &t->outbuf);
   GPR_ASSERT(t->qbuf.count == 0);
 
   if (t->dirtied_local_settings && !t->sent_local_settings) {
diff --git a/src/node/examples/math_server.js b/src/node/examples/math_server.js
index ae548c8..3fac193 100644
--- a/src/node/examples/math_server.js
+++ b/src/node/examples/math_server.js
@@ -33,10 +33,6 @@
 
 'use strict';
 
-var util = require('util');
-
-var Transform = require('stream').Transform;
-
 var grpc = require('..');
 var math = grpc.load(__dirname + '/math.proto').math;
 
@@ -54,11 +50,12 @@
   // Unary + is explicit coersion to integer
   if (+req.divisor === 0) {
     cb(new Error('cannot divide by zero'));
+  } else {
+    cb(null, {
+      quotient: req.dividend / req.divisor,
+      remainder: req.dividend % req.divisor
+    });
   }
-  cb(null, {
-    quotient: req.dividend / req.divisor,
-    remainder: req.dividend % req.divisor
-  });
 }
 
 /**
@@ -97,24 +94,19 @@
 }
 
 function mathDivMany(stream) {
-  // Here, call is a standard duplex Node object Stream
-  util.inherits(DivTransform, Transform);
-  function DivTransform() {
-    var options = {objectMode: true};
-    Transform.call(this, options);
-  }
-  DivTransform.prototype._transform = function(div_args, encoding, callback) {
+  stream.on('data', function(div_args) {
     if (+div_args.divisor === 0) {
-      callback(new Error('cannot divide by zero'));
+      stream.emit('error', new Error('cannot divide by zero'));
+    } else {
+      stream.write({
+        quotient: div_args.dividend / div_args.divisor,
+        remainder: div_args.dividend % div_args.divisor
+      });
     }
-    callback(null, {
-      quotient: div_args.dividend / div_args.divisor,
-      remainder: div_args.dividend % div_args.divisor
-    });
-  };
-  var transform = new DivTransform();
-  stream.pipe(transform);
-  transform.pipe(stream);
+  });
+  stream.on('end', function() {
+    stream.end();
+  });
 }
 
 var server = new Server({
diff --git a/src/node/package.json b/src/node/package.json
index 9f52f8c..fc3ca1f 100644
--- a/src/node/package.json
+++ b/src/node/package.json
@@ -1,6 +1,6 @@
 {
   "name": "grpc",
-  "version": "0.6.0",
+  "version": "0.6.1",
   "author": "Google Inc.",
   "description": "gRPC Library for Node",
   "homepage": "http://www.grpc.io/",
diff --git a/src/node/src/server.js b/src/node/src/server.js
index 05de162..eef705c 100644
--- a/src/node/src/server.js
+++ b/src/node/src/server.js
@@ -360,7 +360,9 @@
     }
     handler.func(emitter, function sendUnaryData(err, value, trailer) {
       if (err) {
-        err.metadata = trailer;
+        if (trailer) {
+          err.metadata = trailer;
+        }
         handleError(call, err);
       } else {
         sendUnaryResponse(call, value, handler.serialize, trailer);
@@ -406,7 +408,9 @@
   handler.func(stream, function(err, value, trailer) {
     stream.terminate();
     if (err) {
-      err.metadata = trailer;
+      if (trailer) {
+        err.metadata = trailer;
+      }
       handleError(call, err);
     } else {
       sendUnaryResponse(call, value, handler.serialize, trailer);
diff --git a/src/node/test/math_client_test.js b/src/node/test/math_client_test.js
index d83f641..79df978 100644
--- a/src/node/test/math_client_test.js
+++ b/src/node/test/math_client_test.js
@@ -68,6 +68,13 @@
       done();
     });
   });
+  it('should handle an error from a unary request', function(done) {
+    var arg = {dividend: 7, divisor: 0};
+    math_client.div(arg, function handleDivResult(err, value) {
+      assert(err);
+      done();
+    });
+  });
   it('should handle a server streaming request', function(done) {
     var call = math_client.fib({limit: 7});
     var expected_results = [1, 1, 2, 3, 5, 8, 13];
@@ -115,4 +122,17 @@
       done();
     });
   });
+  it('should handle an error from a bidi request', function(done) {
+    var call = math_client.divMany();
+    call.on('data', function(value) {
+      assert.fail(value, undefined, 'Unexpected data response on failing call',
+                  '!=');
+    });
+    call.write({dividend: 7, divisor: 0});
+    call.end();
+    call.on('status', function checkStatus(status) {
+      assert.notEqual(status.code, grpc.status.OK);
+      done();
+    });
+  });
 });
diff --git a/src/python/interop/interop/client.py b/src/python/interop/interop/client.py
index bae5e17..41f0d94 100644
--- a/src/python/interop/interop/client.py
+++ b/src/python/interop/interop/client.py
@@ -64,7 +64,7 @@
   return parser.parse_args()
 
 def _oauth_access_token(args):
-  credentials = client.GoogleCredentials.get_application_default()
+  credentials = oauth2client_client.GoogleCredentials.get_application_default()
   scoped_credentials = credentials.create_scoped([args.oauth_scope])
   return scoped_credentials.get_access_token().access_token
 
diff --git a/src/python/interop/interop/methods.py b/src/python/interop/interop/methods.py
index c69771d..909b738 100644
--- a/src/python/interop/interop/methods.py
+++ b/src/python/interop/interop/methods.py
@@ -292,7 +292,7 @@
   if wanted_email != response.username:
     raise ValueError(
         'expected username %s, got %s' % (wanted_email, response.username))
-  if response.oauth_scope in args.oauth_scope:
+  if args.oauth_scope.find(response.oauth_scope) == -1:
     raise ValueError(
         'expected to find oauth scope "%s" in received "%s"' %
             (response.oauth_scope, args.oauth_scope))
diff --git a/src/python/src/grpc/early_adopter/implementations.py b/src/python/src/grpc/early_adopter/implementations.py
index 35456d3..f3f2a04 100644
--- a/src/python/src/grpc/early_adopter/implementations.py
+++ b/src/python/src/grpc/early_adopter/implementations.py
@@ -223,7 +223,8 @@
   breakdown = _face_utilities.break_down_invocation(service_name, methods)
   return _Stub(
       breakdown, host, port, secure, root_certificates, private_key,
-      certificate_chain, server_host_override=server_host_override)
+      certificate_chain, server_host_override=server_host_override,
+      metadata_transformer=metadata_transformer)
 
 
 def server(
diff --git a/templates/Makefile.template b/templates/Makefile.template
index 2cfbfa3..331141f 100644
--- a/templates/Makefile.template
+++ b/templates/Makefile.template
@@ -1269,9 +1269,6 @@
 	$(Q) mkdir -p `dirname $@`
 	$(Q) $(LDXX) $(LDFLAGS) $(${tgt.name.upper()}_OBJS)\
 % endif
-% if tgt.build == 'test':
- $(GTEST_LIB)\
-% endif
 % else:
 ## C-only targets specificities.
 	$(E) "[LD]      Linking $@"
@@ -1298,6 +1295,9 @@
 % elif tgt.get('secure', 'check') == 'yes' or tgt.get('secure', 'check') == 'check':
  $(LDLIBS_SECURE)\
 % endif
+% if tgt.language == 'c++' and tgt.build == 'test':
+ $(GTEST_LIB)\
+% endif
  -o $(BINDIR)/$(CONFIG)/${tgt.name}
 % if tgt.build == 'protoc' or tgt.language == 'c++':
 
diff --git a/templates/tools/run_tests/tests.json.template b/templates/tools/run_tests/tests.json.template
index 6d7520b..337858d 100644
--- a/templates/tools/run_tests/tests.json.template
+++ b/templates/tools/run_tests/tests.json.template
@@ -4,7 +4,8 @@
 
 ${json.dumps([{"name": tgt.name,
                "language": tgt.language,
-               "flaky": tgt.get("flaky", False)}
+	       "platforms": tgt.platforms,
+               "flaky": tgt.flaky}
               for tgt in targets
               if tgt.get('run', True) and tgt.build == 'test'],
              sort_keys=True, indent=2)}
diff --git a/templates/vsprojects/vs2013/Grpc.mak.template b/templates/vsprojects/vs2013/Grpc.mak.template
index 8e1b33b..c1c15df 100644
--- a/templates/vsprojects/vs2013/Grpc.mak.template
+++ b/templates/vsprojects/vs2013/Grpc.mak.template
@@ -32,8 +32,12 @@
 <%def name="to_windows_path(path)">${path.replace('/','\\')}</%def>\
 <%
   allowed_dependencies = set(['gpr', 'grpc', 'gpr_test_util', 'grpc_test_util'])
-  buildable_targets = [ target for target in targets if set(target.deps).issubset(allowed_dependencies) and all([src.endswith('.c') for src in target.src])]
-  test_targets = [ target for target in buildable_targets if target.name.endswith('_test') ]
+  buildable_targets = [ target for target in targets
+                        if set(target.deps).issubset(allowed_dependencies) and
+		           all([src.endswith('.c') for src in target.src]) and
+			   'windows' in target.platforms ]
+  c_test_targets = [ target for target in buildable_targets if target.build == 'test' and not target.language == 'c++' ]
+  cxx_test_targets = [ target for target in buildable_targets if target.build == 'test' and target.language == 'c++' ]
 %>\
 # NMake file to build secondary gRPC targets on Windows.
 # Use grpc.sln to solution to build the gRPC libraries.
@@ -62,29 +66,24 @@
 $(OUT_DIR):
 	mkdir $(OUT_DIR)
 
-buildtests: \
-% for target in test_targets:
+buildtests: buildtests_c buildtests_cxx
+
+buildtests_c: \
+% for target in c_test_targets:
 ${target.name}.exe \
 % endfor
 
 	echo All tests built.
 
-test: \
-% for target in test_targets:
-${target.name} \
+buildtests_cxx: \
+% for target in cxx_test_targets:
+${target.name}.exe \
 % endfor
 
-	echo All tests ran.
-
-test_gpr: \
-% for target in [ tgt for tgt in test_targets if tgt.name.startswith('gpr_')]:
-${target.name} \
-% endfor
-
-	echo All tests ran.
+	echo All tests built.
 
 % for target in buildable_targets:
-${target.name}.exe: grpc_test_util
+${target.name}.exe: grpc_test_util $(OUT_DIR)
 	echo Building ${target.name}
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ \
 %for source in target.src:
diff --git a/test/core/end2end/dualstack_socket_test.c b/test/core/end2end/dualstack_socket_test.c
index 66b76dc..2909766 100644
--- a/test/core/end2end/dualstack_socket_test.c
+++ b/test/core/end2end/dualstack_socket_test.c
@@ -192,7 +192,7 @@
     do_ipv6 = 0;
   }
 
-    /* For coverage, test with and without dualstack sockets. */
+  /* For coverage, test with and without dualstack sockets. */
   for (grpc_forbid_dualstack_sockets_for_testing = 0;
        grpc_forbid_dualstack_sockets_for_testing <= 1;
        grpc_forbid_dualstack_sockets_for_testing++) {
diff --git a/test/core/iomgr/alarm_test.c b/test/core/iomgr/alarm_test.c
index 8d49332..e677ba3 100644
--- a/test/core/iomgr/alarm_test.c
+++ b/test/core/iomgr/alarm_test.c
@@ -37,13 +37,9 @@
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
-#include <netinet/in.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <unistd.h>
 
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
diff --git a/test/core/transport/chttp2_transport_end2end_test.c b/test/core/transport/chttp2_transport_end2end_test.c
index b90fe22..766fd19 100644
--- a/test/core/transport/chttp2_transport_end2end_test.c
+++ b/test/core/transport/chttp2_transport_end2end_test.c
@@ -38,8 +38,6 @@
 #include <string.h>
 #include <signal.h>
 #include <sys/types.h>
-#include <sys/socket.h>
-#include <unistd.h>
 
 #include "test/core/util/test_config.h"
 #include "src/core/iomgr/iomgr.h"
diff --git a/test/core/util/port_posix.c b/test/core/util/port_posix.c
index 7467c2f..b07df39 100644
--- a/test/core/util/port_posix.c
+++ b/test/core/util/port_posix.c
@@ -44,10 +44,37 @@
 #include <string.h>
 #include <unistd.h>
 
+#include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 
 #define NUM_RANDOM_PORTS_TO_PICK 100
 
+static int *chosen_ports = NULL;
+static size_t num_chosen_ports = 0;
+
+static int has_port_been_chosen(int port) {
+  size_t i;
+  for (i = 0; i < num_chosen_ports; i++) {
+    if (chosen_ports[i] == port) {
+      return 1;
+    }
+  }
+  return 0;
+}
+
+static void free_chosen_ports() {
+  gpr_free(chosen_ports);
+}
+
+static void chose_port(int port) {
+  if (chosen_ports == NULL) {
+    atexit(free_chosen_ports);
+  }
+  num_chosen_ports++;
+  chosen_ports = gpr_realloc(chosen_ports, sizeof(int) * num_chosen_ports);
+  chosen_ports[num_chosen_ports - 1] = port;
+}
+
 static int is_port_available(int *port, int is_tcp) {
   const int proto = is_tcp ? IPPROTO_TCP : 0;
   const int fd = socket(AF_INET, is_tcp ? SOCK_STREAM : SOCK_DGRAM, proto);
@@ -127,6 +154,10 @@
       port = 0;
     }
 
+    if (has_port_been_chosen(port)) {
+      continue;
+    }
+
     if (!is_port_available(&port, is_tcp)) {
       continue;
     }
@@ -140,9 +171,7 @@
       continue;
     }
 
-    /* TODO(ctiller): consider caching this port in some structure, to avoid
-                      handing it out again */
-
+    chose_port(port);
     return port;
   }
 
diff --git a/test/core/util/port_windows.c b/test/core/util/port_windows.c
new file mode 100644
index 0000000..17058c3
--- /dev/null
+++ b/test/core/util/port_windows.c
@@ -0,0 +1,158 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <grpc/support/port_platform.h>
+#include "test/core/util/test_config.h"
+#if defined(GPR_WINSOCK_SOCKET) && defined(GRPC_TEST_PICK_PORT)
+
+#include "src/core/iomgr/sockaddr_utils.h"
+#include "test/core/util/port.h"
+
+#include <process.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include <grpc/support/log.h>
+
+#define NUM_RANDOM_PORTS_TO_PICK 100
+
+static int is_port_available(int *port, int is_tcp) {
+  const int proto = is_tcp ? IPPROTO_TCP : 0;
+  const SOCKET fd = socket(AF_INET, is_tcp ? SOCK_STREAM : SOCK_DGRAM, proto);
+  int one = 1;
+  struct sockaddr_in addr;
+  socklen_t alen = sizeof(addr);
+  int actual_port;
+
+  GPR_ASSERT(*port >= 0);
+  GPR_ASSERT(*port <= 65535);
+  if (fd < 0) {
+    gpr_log(GPR_ERROR, "socket() failed: %s", strerror(errno));
+    return 0;
+  }
+
+  /* Reuseaddr lets us start up a server immediately after it exits */
+  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&one, sizeof(one)) < 0) {
+    gpr_log(GPR_ERROR, "setsockopt() failed: %s", strerror(errno));
+    closesocket(fd);
+    return 0;
+  }
+
+  /* Try binding to port */
+  addr.sin_family = AF_INET;
+  addr.sin_addr.s_addr = INADDR_ANY;
+  addr.sin_port = htons(*port);
+  if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+    gpr_log(GPR_DEBUG, "bind(port=%d) failed: %s", *port, strerror(errno));
+	closesocket(fd);
+    return 0;
+  }
+
+  /* Get the bound port number */
+  if (getsockname(fd, (struct sockaddr *)&addr, &alen) < 0) {
+    gpr_log(GPR_ERROR, "getsockname() failed: %s", strerror(errno));
+	closesocket(fd);
+    return 0;
+  }
+  GPR_ASSERT(alen <= sizeof(addr));
+  actual_port = ntohs(addr.sin_port);
+  GPR_ASSERT(actual_port > 0);
+  if (*port == 0) {
+    *port = actual_port;
+  } else {
+    GPR_ASSERT(*port == actual_port);
+  }
+
+  closesocket(fd);
+  return 1;
+}
+
+int grpc_pick_unused_port(void) {
+  /* We repeatedly pick a port and then see whether or not it is
+     available for use both as a TCP socket and a UDP socket.  First, we
+     pick a random large port number.  For subsequent
+     iterations, we bind to an anonymous port and let the OS pick the
+     port number.  The random port picking reduces the probability of
+     races with other processes on kernels that want to reuse the same
+     port numbers over and over. */
+
+  /* In alternating iterations we try UDP ports before TCP ports UDP
+     ports -- it could be the case that this machine has been using up
+     UDP ports and they are scarcer. */
+
+  /* Type of port to first pick in next iteration */
+  int is_tcp = 1;
+  int try = 0;
+
+  for (;;) {
+    int port;
+    try++;
+    if (try == 1) {
+      port = _getpid() % (65536 - 30000) + 30000;
+    } else if (try <= NUM_RANDOM_PORTS_TO_PICK) {
+      port = rand() % (65536 - 30000) + 30000;
+    } else {
+      port = 0;
+    }
+
+    if (!is_port_available(&port, is_tcp)) {
+      continue;
+    }
+
+    GPR_ASSERT(port > 0);
+    /* Check that the port # is free for the other type of socket also */
+    if (!is_port_available(&port, !is_tcp)) {
+      /* In the next iteration try to bind to the other type first
+         because perhaps it is more rare. */
+      is_tcp = !is_tcp;
+      continue;
+    }
+
+    /* TODO(ctiller): consider caching this port in some structure, to avoid
+                      handing it out again */
+
+    return port;
+  }
+
+  /* The port iterator reached the end without finding a suitable port. */
+  return 0;
+}
+
+int grpc_pick_unused_port_or_die(void) {
+  int port = grpc_pick_unused_port();
+  GPR_ASSERT(port > 0);
+  return port;
+}
+
+#endif /* GPR_WINSOCK_SOCKET && GRPC_TEST_PICK_PORT */
diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc
index f448837..9f7d3b5 100644
--- a/test/cpp/qps/driver.cc
+++ b/test/cpp/qps/driver.cc
@@ -42,21 +42,25 @@
 #include <grpc++/stream.h>
 #include <list>
 #include <thread>
+#include <deque>
 #include <vector>
 #include "test/cpp/qps/histogram.h"
+#include "test/cpp/qps/qps_worker.h"
+#include "test/core/util/port.h"
 
 using std::list;
 using std::thread;
 using std::unique_ptr;
+using std::deque;
 using std::vector;
 
 namespace grpc {
 namespace testing {
-static vector<string> get_hosts(const string& name) {
+static deque<string> get_hosts(const string& name) {
   char* env = gpr_getenv(name.c_str());
-  if (!env) return vector<string>();
+  if (!env) return deque<string>();
 
-  vector<string> out;
+  deque<string> out;
   char* p = env;
   for (;;) {
     char* comma = strchr(p, ',');
@@ -76,7 +80,8 @@
                            const ServerConfig& server_config,
                            size_t num_servers,
                            int warmup_seconds,
-                           int benchmark_seconds) {
+                           int benchmark_seconds,
+                           int spawn_local_worker_count) {
   // ClientContext allocator (all are destroyed at scope exit)
   list<ClientContext> contexts;
   auto alloc_context = [&contexts]() {
@@ -88,6 +93,21 @@
   auto workers = get_hosts("QPS_WORKERS");
   ClientConfig client_config = initial_client_config;
 
+  // Spawn some local workers if desired
+  vector<unique_ptr<QpsWorker>> local_workers;
+  for (int i = 0; i < abs(spawn_local_worker_count); i++) {
+    int driver_port = grpc_pick_unused_port_or_die();
+    int benchmark_port = grpc_pick_unused_port_or_die();
+    local_workers.emplace_back(new QpsWorker(driver_port, benchmark_port));
+    char addr[256];
+    sprintf(addr, "localhost:%d", driver_port);
+    if (spawn_local_worker_count < 0) {
+      workers.push_front(addr);
+    } else {
+      workers.push_back(addr);
+    }
+  }
+
   // TODO(ctiller): support running multiple configurations, and binpack
   // client/server pairs
   // to available workers
diff --git a/test/cpp/qps/driver.h b/test/cpp/qps/driver.h
index b3a8bf8..eb7119a 100644
--- a/test/cpp/qps/driver.h
+++ b/test/cpp/qps/driver.h
@@ -56,7 +56,8 @@
                            const grpc::testing::ServerConfig& server_config,
                            size_t num_servers,
                            int warmup_seconds,
-                           int benchmark_seconds);
+                           int benchmark_seconds,
+                           int spawn_local_worker_count);
 
 }  // namespace testing
 }  // namespace grpc
diff --git a/test/cpp/qps/qps_driver.cc b/test/cpp/qps/qps_driver.cc
index 220f826..8959f7b 100644
--- a/test/cpp/qps/qps_driver.cc
+++ b/test/cpp/qps/qps_driver.cc
@@ -42,6 +42,7 @@
 
 DEFINE_int32(warmup_seconds, 5, "Warmup time (in seconds)");
 DEFINE_int32(benchmark_seconds, 30, "Benchmark time (in seconds)");
+DEFINE_int32(local_workers, 0, "Number of local workers to start");
 
 // Common config
 DEFINE_bool(enable_ssl, false, "Use SSL");
@@ -102,7 +103,8 @@
 
   auto result = RunScenario(client_config, FLAGS_num_clients,
                             server_config, FLAGS_num_servers,
-                            FLAGS_warmup_seconds, FLAGS_benchmark_seconds);
+                            FLAGS_warmup_seconds, FLAGS_benchmark_seconds,
+                            FLAGS_local_workers);
 
   ReportQPSPerCore(result, server_config);
   ReportLatency(result);
diff --git a/test/cpp/qps/qps_worker.cc b/test/cpp/qps/qps_worker.cc
new file mode 100644
index 0000000..46d70dc
--- /dev/null
+++ b/test/cpp/qps/qps_worker.cc
@@ -0,0 +1,233 @@
+/*
+ *
+ * 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 "qps_worker.h"
+
+#include <cassert>
+#include <memory>
+#include <mutex>
+#include <string>
+#include <thread>
+#include <vector>
+#include <sstream>
+
+#include <grpc/grpc.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/histogram.h>
+#include <grpc/support/log.h>
+#include <grpc/support/host_port.h>
+#include <grpc++/client_context.h>
+#include <grpc++/status.h>
+#include <grpc++/server.h>
+#include <grpc++/server_builder.h>
+#include <grpc++/server_credentials.h>
+#include <grpc++/stream.h>
+#include "test/core/util/grpc_profiler.h"
+#include "test/cpp/util/create_test_channel.h"
+#include "test/cpp/qps/qpstest.pb.h"
+#include "test/cpp/qps/client.h"
+#include "test/cpp/qps/server.h"
+
+namespace grpc {
+namespace testing {
+
+std::unique_ptr<Client> CreateClient(const ClientConfig& config) {
+  switch (config.client_type()) {
+    case ClientType::SYNCHRONOUS_CLIENT:
+      return (config.rpc_type() == RpcType::UNARY) ?
+	CreateSynchronousUnaryClient(config) :
+	CreateSynchronousStreamingClient(config);
+    case ClientType::ASYNC_CLIENT:
+      return (config.rpc_type() == RpcType::UNARY) ?
+	CreateAsyncUnaryClient(config) : CreateAsyncStreamingClient(config);
+  }
+  abort();
+}
+
+std::unique_ptr<Server> CreateServer(const ServerConfig& config, int server_port) {
+  switch (config.server_type()) {
+    case ServerType::SYNCHRONOUS_SERVER:
+      return CreateSynchronousServer(config, server_port);
+    case ServerType::ASYNC_SERVER:
+      return CreateAsyncServer(config, server_port);
+  }
+  abort();
+}
+
+class WorkerImpl GRPC_FINAL : public Worker::Service {
+ public:
+  explicit WorkerImpl(int server_port) : server_port_(server_port), acquired_(false) {}
+
+  Status RunTest(ServerContext* ctx,
+                 ServerReaderWriter<ClientStatus, ClientArgs>* stream)
+      GRPC_OVERRIDE {
+    InstanceGuard g(this);
+    if (!g.Acquired()) {
+      return Status(RESOURCE_EXHAUSTED);
+    }
+
+    grpc_profiler_start("qps_client.prof");
+    Status ret = RunTestBody(ctx,stream);
+    grpc_profiler_stop();
+    return ret;
+  }
+
+  Status RunServer(ServerContext* ctx,
+                   ServerReaderWriter<ServerStatus, ServerArgs>* stream)
+      GRPC_OVERRIDE {
+    InstanceGuard g(this);
+    if (!g.Acquired()) {
+      return Status(RESOURCE_EXHAUSTED);
+    }
+
+    grpc_profiler_start("qps_server.prof");
+    Status ret = RunServerBody(ctx,stream);
+    grpc_profiler_stop();
+    return ret;
+  }
+
+ private:
+  // Protect against multiple clients using this worker at once.
+  class InstanceGuard {
+   public:
+    InstanceGuard(WorkerImpl* impl)
+        : impl_(impl), acquired_(impl->TryAcquireInstance()) {}
+    ~InstanceGuard() {
+      if (acquired_) {
+        impl_->ReleaseInstance();
+      }
+    }
+
+    bool Acquired() const { return acquired_; }
+
+   private:
+    WorkerImpl* const impl_;
+    const bool acquired_;
+  };
+
+  bool TryAcquireInstance() {
+    std::lock_guard<std::mutex> g(mu_);
+    if (acquired_) return false;
+    acquired_ = true;
+    return true;
+  }
+
+  void ReleaseInstance() {
+    std::lock_guard<std::mutex> g(mu_);
+    GPR_ASSERT(acquired_);
+    acquired_ = false;
+  }
+
+  Status RunTestBody(ServerContext* ctx,
+                     ServerReaderWriter<ClientStatus, ClientArgs>* stream) {
+    ClientArgs args;
+    if (!stream->Read(&args)) {
+      return Status(INVALID_ARGUMENT);
+    }
+    if (!args.has_setup()) {
+      return Status(INVALID_ARGUMENT);
+    }
+    auto client = CreateClient(args.setup());
+    if (!client) {
+      return Status(INVALID_ARGUMENT);
+    }
+    ClientStatus status;
+    if (!stream->Write(status)) {
+      return Status(UNKNOWN);
+    }
+    while (stream->Read(&args)) {
+      if (!args.has_mark()) {
+        return Status(INVALID_ARGUMENT);
+      }
+      *status.mutable_stats() = client->Mark();
+      stream->Write(status);
+    }
+
+    return Status::OK;
+  }
+
+  Status RunServerBody(ServerContext* ctx,
+                       ServerReaderWriter<ServerStatus, ServerArgs>* stream) {
+    ServerArgs args;
+    if (!stream->Read(&args)) {
+      return Status(INVALID_ARGUMENT);
+    }
+    if (!args.has_setup()) {
+      return Status(INVALID_ARGUMENT);
+    }
+    auto server = CreateServer(args.setup(), server_port_);
+    if (!server) {
+      return Status(INVALID_ARGUMENT);
+    }
+    ServerStatus status;
+    status.set_port(server_port_);
+    if (!stream->Write(status)) {
+      return Status(UNKNOWN);
+    }
+    while (stream->Read(&args)) {
+      if (!args.has_mark()) {
+        return Status(INVALID_ARGUMENT);
+      }
+      *status.mutable_stats() = server->Mark();
+      stream->Write(status);
+    }
+
+    return Status::OK;
+  }
+
+  const int server_port_;
+
+  std::mutex mu_;
+  bool acquired_;
+};
+
+QpsWorker::QpsWorker(int driver_port, int server_port) {
+  impl_.reset(new WorkerImpl(server_port));
+
+  char* server_address = NULL;
+  gpr_join_host_port(&server_address, "::", driver_port);
+
+  ServerBuilder builder;
+  builder.AddListeningPort(server_address, InsecureServerCredentials());
+  builder.RegisterService(impl_.get());
+
+  gpr_free(server_address);
+
+  server_ = std::move(builder.BuildAndStart());
+}
+
+QpsWorker::~QpsWorker() {
+}
+
+}  // namespace testing
+}  // namespace grpc
diff --git a/test/cpp/qps/qps_worker.h b/test/cpp/qps/qps_worker.h
new file mode 100644
index 0000000..8615889
--- /dev/null
+++ b/test/cpp/qps/qps_worker.h
@@ -0,0 +1,60 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef QPS_WORKER_H
+#define QPS_WORKER_H
+
+#include <memory>
+
+namespace grpc {
+
+class Server;
+
+namespace testing {
+
+class WorkerImpl;
+
+class QpsWorker {
+ public:
+  QpsWorker(int driver_port, int server_port);
+  ~QpsWorker();
+
+ private:
+  std::unique_ptr<WorkerImpl> impl_;
+  std::unique_ptr<Server> server_;
+};
+
+}  // namespace testing
+}  // namespace grpc
+
+#endif
diff --git a/test/cpp/qps/smoke_test.cc b/test/cpp/qps/smoke_test.cc
index c9d321f..9531913 100644
--- a/test/cpp/qps/smoke_test.cc
+++ b/test/cpp/qps/smoke_test.cc
@@ -58,7 +58,7 @@
   server_config.set_enable_ssl(false);
   server_config.set_threads(1);
 
-  auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK);
+  auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2);
 
   ReportQPS(result);
   ReportLatency(result);
@@ -80,7 +80,7 @@
   server_config.set_enable_ssl(false);
   server_config.set_threads(1);
 
-  auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK);
+  auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2);
 
   ReportQPS(result);
   ReportLatency(result);
@@ -103,7 +103,7 @@
   server_config.set_enable_ssl(false);
   server_config.set_threads(1);
 
-  auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK);
+  auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2);
 
   ReportQPS(result);
   ReportLatency(result);
@@ -126,7 +126,7 @@
   server_config.set_enable_ssl(false);
   server_config.set_threads(4);
 
-  auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK);
+  auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2);
 
   ReportQPSPerCore(result, server_config);
   ReportLatency(result);
diff --git a/test/cpp/qps/smoke_test.sh b/test/cpp/qps/smoke_test.sh
deleted file mode 100755
index ba7f0a4..0000000
--- a/test/cpp/qps/smoke_test.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/sh
-
-# performs a single qps run with one client and one server
-
-set -ex
-
-cd $(dirname $0)/../../..
-
-killall qps_worker || true
-
-config=opt
-
-NUMCPUS=`python2.7 -c 'import multiprocessing; print multiprocessing.cpu_count()'`
-
-make CONFIG=$config qps_worker qps_smoke_test -j$NUMCPUS
-
-bins/$config/qps_worker -driver_port 10000 -server_port 10001 &
-PID1=$!
-bins/$config/qps_worker -driver_port 10010 -server_port 10011 &
-PID2=$!
-
-export QPS_WORKERS="localhost:10000,localhost:10010"
-
-bins/$config/qps_smoke_test $*
-
-kill -2 $PID1 $PID2
-wait
-
diff --git a/test/cpp/qps/worker.cc b/test/cpp/qps/worker.cc
index 101eb9f..1ef5313 100644
--- a/test/cpp/qps/worker.cc
+++ b/test/cpp/qps/worker.cc
@@ -31,33 +31,15 @@
  *
  */
 
-#include <cassert>
-#include <memory>
-#include <mutex>
-#include <string>
-#include <thread>
-#include <vector>
-#include <sstream>
-
 #include <sys/signal.h>
 
+#include <chrono>
+#include <thread>
+
 #include <grpc/grpc.h>
-#include <grpc/support/alloc.h>
-#include <grpc/support/histogram.h>
-#include <grpc/support/log.h>
-#include <grpc/support/host_port.h>
 #include <gflags/gflags.h>
-#include <grpc++/client_context.h>
-#include <grpc++/status.h>
-#include <grpc++/server.h>
-#include <grpc++/server_builder.h>
-#include <grpc++/server_credentials.h>
-#include <grpc++/stream.h>
-#include "test/core/util/grpc_profiler.h"
-#include "test/cpp/util/create_test_channel.h"
-#include "test/cpp/qps/qpstest.grpc.pb.h"
-#include "test/cpp/qps/client.h"
-#include "test/cpp/qps/server.h"
+
+#include "qps_worker.h"
 
 DEFINE_int32(driver_port, 0, "Driver server port.");
 DEFINE_int32(server_port, 0, "Spawned server port.");
@@ -76,167 +58,8 @@
 namespace grpc {
 namespace testing {
 
-std::unique_ptr<Client> CreateClient(const ClientConfig& config) {
-  switch (config.client_type()) {
-    case ClientType::SYNCHRONOUS_CLIENT:
-      return (config.rpc_type() == RpcType::UNARY) ?
-	CreateSynchronousUnaryClient(config) :
-	CreateSynchronousStreamingClient(config);
-    case ClientType::ASYNC_CLIENT:
-      return (config.rpc_type() == RpcType::UNARY) ?
-	CreateAsyncUnaryClient(config) : CreateAsyncStreamingClient(config);
-  }
-  abort();
-}
-
-std::unique_ptr<Server> CreateServer(const ServerConfig& config) {
-  switch (config.server_type()) {
-    case ServerType::SYNCHRONOUS_SERVER:
-      return CreateSynchronousServer(config, FLAGS_server_port);
-    case ServerType::ASYNC_SERVER:
-      return CreateAsyncServer(config, FLAGS_server_port);
-  }
-  abort();
-}
-
-class WorkerImpl GRPC_FINAL : public Worker::Service {
- public:
-  WorkerImpl() : acquired_(false) {}
-
-  Status RunTest(ServerContext* ctx,
-                 ServerReaderWriter<ClientStatus, ClientArgs>* stream)
-      GRPC_OVERRIDE {
-    InstanceGuard g(this);
-    if (!g.Acquired()) {
-      return Status(RESOURCE_EXHAUSTED);
-    }
-
-    grpc_profiler_start("qps_client.prof");
-    Status ret = RunTestBody(ctx,stream);
-    grpc_profiler_stop();
-    return ret;
-  }
-
-  Status RunServer(ServerContext* ctx,
-                   ServerReaderWriter<ServerStatus, ServerArgs>* stream)
-      GRPC_OVERRIDE {
-    InstanceGuard g(this);
-    if (!g.Acquired()) {
-      return Status(RESOURCE_EXHAUSTED);
-    }
-
-    grpc_profiler_start("qps_server.prof");
-    Status ret = RunServerBody(ctx,stream);
-    grpc_profiler_stop();
-    return ret;
-  }
-
- private:
-  // Protect against multiple clients using this worker at once.
-  class InstanceGuard {
-   public:
-    InstanceGuard(WorkerImpl* impl)
-        : impl_(impl), acquired_(impl->TryAcquireInstance()) {}
-    ~InstanceGuard() {
-      if (acquired_) {
-        impl_->ReleaseInstance();
-      }
-    }
-
-    bool Acquired() const { return acquired_; }
-
-   private:
-    WorkerImpl* const impl_;
-    const bool acquired_;
-  };
-
-  bool TryAcquireInstance() {
-    std::lock_guard<std::mutex> g(mu_);
-    if (acquired_) return false;
-    acquired_ = true;
-    return true;
-  }
-
-  void ReleaseInstance() {
-    std::lock_guard<std::mutex> g(mu_);
-    GPR_ASSERT(acquired_);
-    acquired_ = false;
-  }
-
-  Status RunTestBody(ServerContext* ctx,
-                     ServerReaderWriter<ClientStatus, ClientArgs>* stream) {
-    ClientArgs args;
-    if (!stream->Read(&args)) {
-      return Status(INVALID_ARGUMENT);
-    }
-    if (!args.has_setup()) {
-      return Status(INVALID_ARGUMENT);
-    }
-    auto client = CreateClient(args.setup());
-    if (!client) {
-      return Status(INVALID_ARGUMENT);
-    }
-    ClientStatus status;
-    if (!stream->Write(status)) {
-      return Status(UNKNOWN);
-    }
-    while (stream->Read(&args)) {
-      if (!args.has_mark()) {
-        return Status(INVALID_ARGUMENT);
-      }
-      *status.mutable_stats() = client->Mark();
-      stream->Write(status);
-    }
-
-    return Status::OK;
-  }
-
-  Status RunServerBody(ServerContext* ctx,
-                       ServerReaderWriter<ServerStatus, ServerArgs>* stream) {
-    ServerArgs args;
-    if (!stream->Read(&args)) {
-      return Status(INVALID_ARGUMENT);
-    }
-    if (!args.has_setup()) {
-      return Status(INVALID_ARGUMENT);
-    }
-    auto server = CreateServer(args.setup());
-    if (!server) {
-      return Status(INVALID_ARGUMENT);
-    }
-    ServerStatus status;
-    status.set_port(FLAGS_server_port);
-    if (!stream->Write(status)) {
-      return Status(UNKNOWN);
-    }
-    while (stream->Read(&args)) {
-      if (!args.has_mark()) {
-        return Status(INVALID_ARGUMENT);
-      }
-      *status.mutable_stats() = server->Mark();
-      stream->Write(status);
-    }
-
-    return Status::OK;
-  }
-
-  std::mutex mu_;
-  bool acquired_;
-};
-
 static void RunServer() {
-  char* server_address = NULL;
-  gpr_join_host_port(&server_address, "::", FLAGS_driver_port);
-
-  WorkerImpl service;
-
-  ServerBuilder builder;
-  builder.AddListeningPort(server_address, InsecureServerCredentials());
-  builder.RegisterService(&service);
-
-  gpr_free(server_address);
-
-  auto server = builder.BuildAndStart();
+  QpsWorker worker(FLAGS_driver_port, FLAGS_server_port);
 
   while (!got_sigint) {
     std::this_thread::sleep_for(std::chrono::seconds(5));
diff --git a/tools/buildgen/plugins/expand_bin_attrs.py b/tools/buildgen/plugins/expand_bin_attrs.py
new file mode 100755
index 0000000..0896a5a
--- /dev/null
+++ b/tools/buildgen/plugins/expand_bin_attrs.py
@@ -0,0 +1,51 @@
+# 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.
+
+"""Buildgen expand binary attributes plugin.
+
+This fills in any optional attributes.
+
+"""
+
+
+def mako_plugin(dictionary):
+  """The exported plugin code for expand_filegroups.
+
+  The list of libs in the build.json file can contain "filegroups" tags.
+  These refer to the filegroups in the root object. We will expand and
+  merge filegroups on the src, headers and public_headers properties.
+
+  """
+
+  targets = dictionary.get('targets')
+
+  for tgt in targets:
+    tgt['flaky'] = tgt.get('flaky', False)
+    tgt['platforms'] = tgt.get('platforms', ['windows', 'posix'])
+
diff --git a/tools/run_tests/jobset.py b/tools/run_tests/jobset.py
index 81cdd0e..efe040a 100755
--- a/tools/run_tests/jobset.py
+++ b/tools/run_tests/jobset.py
@@ -32,6 +32,7 @@
 import hashlib
 import multiprocessing
 import os
+import platform
 import random
 import signal
 import subprocess
@@ -43,17 +44,19 @@
 _DEFAULT_MAX_JOBS = 16 * multiprocessing.cpu_count()
 
 
-have_alarm = False
-def alarm_handler(unused_signum, unused_frame):
-  global have_alarm
-  have_alarm = False
-
-
 # setup a signal handler so that signal.pause registers 'something'
 # when a child finishes
 # not using futures and threading to avoid a dependency on subprocess32
-signal.signal(signal.SIGCHLD, lambda unused_signum, unused_frame: None)
-signal.signal(signal.SIGALRM, alarm_handler)
+if platform.system() == "Windows":
+  pass
+else:
+  have_alarm = False
+  def alarm_handler(unused_signum, unused_frame):
+    global have_alarm
+    have_alarm = False
+
+  signal.signal(signal.SIGCHLD, lambda unused_signum, unused_frame: None)
+  signal.signal(signal.SIGALRM, alarm_handler)
 
 
 def shuffle_iteratable(it):
@@ -109,6 +112,11 @@
 
 
 def message(tag, message, explanatory_text=None, do_newline=False):
+  if platform.system() == 'Windows':
+    if explanatory_text:
+      print explanatory_text
+    print '%s: %s' % (tag, message)
+    return
   try:
     sys.stdout.write('%s%s%s\x1b[%d;%dm%s\x1b[0m: %s%s' % (
         _BEGINNING_OF_LINE,
@@ -136,7 +144,7 @@
 class JobSpec(object):
   """Specifies what to run for a job."""
 
-  def __init__(self, cmdline, shortname=None, environ=None, hash_targets=None):
+  def __init__(self, cmdline, shortname=None, environ=None, hash_targets=None, cwd=None):
     """
     Arguments:
       cmdline: a list of arguments to pass as the command line
@@ -152,6 +160,7 @@
     self.environ = environ
     self.shortname = cmdline[0] if shortname is None else shortname
     self.hash_targets = hash_targets or []
+    self.cwd = cwd
 
   def identity(self):
     return '%r %r %r' % (self.cmdline, self.environ, self.hash_targets)
@@ -177,6 +186,7 @@
     self._process = subprocess.Popen(args=spec.cmdline,
                                      stderr=subprocess.STDOUT,
                                      stdout=self._tempfile,
+                                     cwd=spec.cwd,
                                      env=env)
     self._state = _RUNNING
     self._newline_on_success = newline_on_success
@@ -241,10 +251,15 @@
       bin_hash = None
       should_run = True
     if should_run:
-      self._running.add(Job(spec,
-                            bin_hash,
-                            self._newline_on_success,
-                            self._travis))
+      try:
+        self._running.add(Job(spec,
+                              bin_hash,
+                              self._newline_on_success,
+                              self._travis))
+      except:
+        message('FAILED', spec.shortname)
+        self._cancelled = True
+        return False
     return True
 
   def reap(self):
@@ -264,11 +279,14 @@
       if (not self._travis):
         message('WAITING', '%d jobs running, %d complete, %d failed' % (
             len(self._running), self._completed, self._failures))
-      global have_alarm
-      if not have_alarm:
-        have_alarm = True
-        signal.alarm(10)
-      signal.pause()
+      if platform.system() == 'Windows':
+        time.sleep(0.1)
+      else:
+        global have_alarm
+        if not have_alarm:
+          have_alarm = True
+          signal.alarm(10)
+        signal.pause()
 
   def cancelled(self):
     """Poll for cancellation."""
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index 14ee179..c279c3e 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -39,6 +39,7 @@
 import re
 import sys
 import time
+import platform
 
 import jobset
 import watch_dirs
@@ -101,9 +102,16 @@
 
   def __init__(self, make_target, test_lang):
     self.make_target = make_target
+    if platform.system() == 'Windows':
+      plat = 'windows'
+    else:
+      plat = 'posix'
     with open('tools/run_tests/tests.json') as f:
       js = json.load(f)
-      self.binaries = [tgt for tgt in js if tgt['language'] == test_lang]
+      self.binaries = [tgt
+                       for tgt in js
+                       if tgt['language'] == test_lang and
+                          plat in tgt['platforms']]
 
   def test_specs(self, config, travis):
     out = []
@@ -190,6 +198,7 @@
   def __str__(self):
     return 'python'
 
+
 class RubyLanguage(object):
 
   def test_specs(self, config, travis):
@@ -207,6 +216,7 @@
   def __str__(self):
     return 'ruby'
 
+
 class CSharpLanguage(object):
 
   def test_specs(self, config, travis):
@@ -224,6 +234,7 @@
   def __str__(self):
     return 'csharp'
 
+
 class Build(object):
 
   def test_specs(self, config, travis):
@@ -314,17 +325,27 @@
       print language, 'does not support multiple build configurations'
       sys.exit(1)
 
-build_steps = [jobset.JobSpec(['make',
-                               '-j', '%d' % (multiprocessing.cpu_count() + 1),
-                               'EXTRA_DEFINES=GRPC_TEST_SLOWDOWN_MACHINE_FACTOR=%f' % args.slowdown,
-                               'CONFIG=%s' % cfg] + list(set(
-                                   itertools.chain.from_iterable(
-                                       l.make_targets() for l in languages))))
-               for cfg in build_configs] + list(set(
+if platform.system() == 'Windows':
+  def make_jobspec(cfg, targets):
+    return jobset.JobSpec(['nmake', '/f', 'Grpc.mak', 'CONFIG=%s' % cfg] + targets,
+                          cwd='vsprojects\\vs2013')
+else:
+  def make_jobspec(cfg, targets):
+    return jobset.JobSpec(['make',
+                           '-j', '%d' % (multiprocessing.cpu_count() + 1),
+                           'EXTRA_DEFINES=GRPC_TEST_SLOWDOWN_MACHINE_FACTOR=%f' % 
+                               args.slowdown,
+                           'CONFIG=%s' % cfg] + targets)
+
+build_steps = [make_jobspec(cfg, 
+                            list(set(itertools.chain.from_iterable(
+                                         l.make_targets() for l in languages))))
+               for cfg in build_configs]
+build_steps.extend(set(
                    jobset.JobSpec(cmdline, environ={'CONFIG': cfg})
                    for cfg in build_configs
                    for l in languages
-                   for cmdline in l.build_steps()))
+                   for cmdline in l.build_steps()))               
 one_run = set(
     spec
     for config in run_configs
diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json
index b256164..cb37986 100644
--- a/tools/run_tests/tests.json
+++ b/tools/run_tests/tests.json
@@ -4,2117 +4,3808 @@
   {
     "flaky": false, 
     "language": "c", 
-    "name": "alarm_heap_test"
+    "name": "alarm_heap_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "alarm_list_test"
+    "name": "alarm_list_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "alarm_test"
+    "name": "alarm_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "alpn_test"
+    "name": "alpn_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "bin_encoder_test"
+    "name": "bin_encoder_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "census_hash_table_test"
+    "name": "census_hash_table_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": true, 
     "language": "c", 
-    "name": "census_statistics_multiple_writers_circular_buffer_test"
+    "name": "census_statistics_multiple_writers_circular_buffer_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "census_statistics_multiple_writers_test"
+    "name": "census_statistics_multiple_writers_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "census_statistics_performance_test"
+    "name": "census_statistics_performance_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "census_statistics_quick_test"
+    "name": "census_statistics_quick_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": true, 
     "language": "c", 
-    "name": "census_statistics_small_log_test"
+    "name": "census_statistics_small_log_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "census_stub_test"
+    "name": "census_stub_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "census_window_stats_test"
+    "name": "census_window_stats_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_status_conversion_test"
+    "name": "chttp2_status_conversion_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_stream_encoder_test"
+    "name": "chttp2_stream_encoder_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_stream_map_test"
+    "name": "chttp2_stream_map_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_transport_end2end_test"
+    "name": "chttp2_transport_end2end_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "dualstack_socket_test"
+    "name": "dualstack_socket_test", 
+    "platforms": [
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "echo_test"
+    "name": "echo_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "fd_posix_test"
+    "name": "fd_posix_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "fling_stream_test"
+    "name": "fling_stream_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "fling_test"
+    "name": "fling_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_cancellable_test"
+    "name": "gpr_cancellable_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_cmdline_test"
+    "name": "gpr_cmdline_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_env_test"
+    "name": "gpr_env_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_file_test"
+    "name": "gpr_file_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_histogram_test"
+    "name": "gpr_histogram_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_host_port_test"
+    "name": "gpr_host_port_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_log_test"
+    "name": "gpr_log_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_slice_buffer_test"
+    "name": "gpr_slice_buffer_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_slice_test"
+    "name": "gpr_slice_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_string_test"
+    "name": "gpr_string_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_sync_test"
+    "name": "gpr_sync_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_thd_test"
+    "name": "gpr_thd_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_time_test"
+    "name": "gpr_time_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_tls_test"
+    "name": "gpr_tls_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "gpr_useful_test"
+    "name": "gpr_useful_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "grpc_base64_test"
+    "name": "grpc_base64_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "grpc_byte_buffer_reader_test"
+    "name": "grpc_byte_buffer_reader_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "grpc_channel_stack_test"
+    "name": "grpc_channel_stack_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "grpc_completion_queue_test"
+    "name": "grpc_completion_queue_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "grpc_credentials_test"
+    "name": "grpc_credentials_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "grpc_json_token_test"
+    "name": "grpc_json_token_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "grpc_stream_op_test"
+    "name": "grpc_stream_op_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "hpack_parser_test"
+    "name": "hpack_parser_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "hpack_table_test"
+    "name": "hpack_table_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "httpcli_format_request_test"
+    "name": "httpcli_format_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "httpcli_parser_test"
+    "name": "httpcli_parser_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "json_rewrite_test"
+    "name": "json_rewrite_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "json_test"
+    "name": "json_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "lame_client_test"
+    "name": "lame_client_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "message_compress_test"
+    "name": "message_compress_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "metadata_buffer_test"
+    "name": "metadata_buffer_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "multi_init_test"
+    "name": "multi_init_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "murmur_hash_test"
+    "name": "murmur_hash_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "no_server_test"
+    "name": "no_server_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "poll_kick_posix_test"
+    "name": "poll_kick_posix_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "resolve_address_test"
+    "name": "resolve_address_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "secure_endpoint_test"
+    "name": "secure_endpoint_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "sockaddr_utils_test"
+    "name": "sockaddr_utils_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "tcp_client_posix_test"
+    "name": "tcp_client_posix_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "tcp_posix_test"
+    "name": "tcp_posix_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "tcp_server_posix_test"
+    "name": "tcp_server_posix_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "time_averaged_stats_test"
+    "name": "time_averaged_stats_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "time_test"
+    "name": "time_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "timeout_encoding_test"
+    "name": "timeout_encoding_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "transport_metadata_test"
+    "name": "transport_metadata_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "transport_security_test"
+    "name": "transport_security_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "async_end2end_test"
+    "name": "async_end2end_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "channel_arguments_test"
+    "name": "channel_arguments_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "cli_call_test"
+    "name": "cli_call_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "credentials_test"
+    "name": "credentials_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "cxx_time_test"
+    "name": "cxx_time_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "end2end_test"
+    "name": "end2end_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "generic_end2end_test"
+    "name": "generic_end2end_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "interop_test"
+    "name": "interop_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "pubsub_publisher_test"
+    "name": "pubsub_publisher_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "pubsub_subscriber_test"
+    "name": "pubsub_subscriber_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "status_test"
+    "name": "status_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c++", 
-    "name": "thread_pool_test"
+    "name": "thread_pool_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_bad_hostname_test"
+    "name": "chttp2_fake_security_bad_hostname_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_cancel_after_accept_test"
+    "name": "chttp2_fake_security_cancel_after_accept_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_test"
+    "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_cancel_after_invoke_test"
+    "name": "chttp2_fake_security_cancel_after_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_cancel_before_invoke_test"
+    "name": "chttp2_fake_security_cancel_before_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_cancel_in_a_vacuum_test"
+    "name": "chttp2_fake_security_cancel_in_a_vacuum_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_census_simple_request_test"
+    "name": "chttp2_fake_security_census_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_disappearing_server_test"
+    "name": "chttp2_fake_security_disappearing_server_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test"
+    "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_test"
+    "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_empty_batch_test"
+    "name": "chttp2_fake_security_empty_batch_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_graceful_server_shutdown_test"
+    "name": "chttp2_fake_security_graceful_server_shutdown_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_invoke_large_request_test"
+    "name": "chttp2_fake_security_invoke_large_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_max_concurrent_streams_test"
+    "name": "chttp2_fake_security_max_concurrent_streams_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_no_op_test"
+    "name": "chttp2_fake_security_no_op_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_ping_pong_streaming_test"
+    "name": "chttp2_fake_security_ping_pong_streaming_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_test"
+    "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_request_response_with_metadata_and_payload_test"
+    "name": "chttp2_fake_security_request_response_with_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_request_response_with_payload_test"
+    "name": "chttp2_fake_security_request_response_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_request_with_large_metadata_test"
+    "name": "chttp2_fake_security_request_with_large_metadata_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_request_with_payload_test"
+    "name": "chttp2_fake_security_request_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_simple_delayed_request_test"
+    "name": "chttp2_fake_security_simple_delayed_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_simple_request_test"
+    "name": "chttp2_fake_security_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_thread_stress_test"
+    "name": "chttp2_fake_security_thread_stress_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_test"
+    "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_cancel_after_accept_legacy_test"
+    "name": "chttp2_fake_security_cancel_after_accept_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_legacy_test"
+    "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_cancel_after_invoke_legacy_test"
+    "name": "chttp2_fake_security_cancel_after_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_cancel_before_invoke_legacy_test"
+    "name": "chttp2_fake_security_cancel_before_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_cancel_in_a_vacuum_legacy_test"
+    "name": "chttp2_fake_security_cancel_in_a_vacuum_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_census_simple_request_legacy_test"
+    "name": "chttp2_fake_security_census_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_disappearing_server_legacy_test"
+    "name": "chttp2_fake_security_disappearing_server_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_legacy_test"
+    "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_legacy_test"
+    "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_graceful_server_shutdown_legacy_test"
+    "name": "chttp2_fake_security_graceful_server_shutdown_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_invoke_large_request_legacy_test"
+    "name": "chttp2_fake_security_invoke_large_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_max_concurrent_streams_legacy_test"
+    "name": "chttp2_fake_security_max_concurrent_streams_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_no_op_legacy_test"
+    "name": "chttp2_fake_security_no_op_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_ping_pong_streaming_legacy_test"
+    "name": "chttp2_fake_security_ping_pong_streaming_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_legacy_test"
+    "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_request_response_with_metadata_and_payload_legacy_test"
+    "name": "chttp2_fake_security_request_response_with_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_request_response_with_payload_legacy_test"
+    "name": "chttp2_fake_security_request_response_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_request_response_with_trailing_metadata_and_payload_legacy_test"
+    "name": "chttp2_fake_security_request_response_with_trailing_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_request_with_large_metadata_legacy_test"
+    "name": "chttp2_fake_security_request_with_large_metadata_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_request_with_payload_legacy_test"
+    "name": "chttp2_fake_security_request_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_simple_delayed_request_legacy_test"
+    "name": "chttp2_fake_security_simple_delayed_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_simple_request_legacy_test"
+    "name": "chttp2_fake_security_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_thread_stress_legacy_test"
+    "name": "chttp2_fake_security_thread_stress_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_legacy_test"
+    "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_bad_hostname_test"
+    "name": "chttp2_fullstack_bad_hostname_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_cancel_after_accept_test"
+    "name": "chttp2_fullstack_cancel_after_accept_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_test"
+    "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_cancel_after_invoke_test"
+    "name": "chttp2_fullstack_cancel_after_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_cancel_before_invoke_test"
+    "name": "chttp2_fullstack_cancel_before_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_cancel_in_a_vacuum_test"
+    "name": "chttp2_fullstack_cancel_in_a_vacuum_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_census_simple_request_test"
+    "name": "chttp2_fullstack_census_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_disappearing_server_test"
+    "name": "chttp2_fullstack_disappearing_server_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test"
+    "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_test"
+    "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_empty_batch_test"
+    "name": "chttp2_fullstack_empty_batch_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_graceful_server_shutdown_test"
+    "name": "chttp2_fullstack_graceful_server_shutdown_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_invoke_large_request_test"
+    "name": "chttp2_fullstack_invoke_large_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_max_concurrent_streams_test"
+    "name": "chttp2_fullstack_max_concurrent_streams_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_no_op_test"
+    "name": "chttp2_fullstack_no_op_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_ping_pong_streaming_test"
+    "name": "chttp2_fullstack_ping_pong_streaming_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_test"
+    "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_request_response_with_metadata_and_payload_test"
+    "name": "chttp2_fullstack_request_response_with_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_request_response_with_payload_test"
+    "name": "chttp2_fullstack_request_response_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_request_with_large_metadata_test"
+    "name": "chttp2_fullstack_request_with_large_metadata_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_request_with_payload_test"
+    "name": "chttp2_fullstack_request_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_simple_delayed_request_test"
+    "name": "chttp2_fullstack_simple_delayed_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_simple_request_test"
+    "name": "chttp2_fullstack_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_thread_stress_test"
+    "name": "chttp2_fullstack_thread_stress_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_test"
+    "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_cancel_after_accept_legacy_test"
+    "name": "chttp2_fullstack_cancel_after_accept_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_legacy_test"
+    "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_cancel_after_invoke_legacy_test"
+    "name": "chttp2_fullstack_cancel_after_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_cancel_before_invoke_legacy_test"
+    "name": "chttp2_fullstack_cancel_before_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_cancel_in_a_vacuum_legacy_test"
+    "name": "chttp2_fullstack_cancel_in_a_vacuum_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_census_simple_request_legacy_test"
+    "name": "chttp2_fullstack_census_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_disappearing_server_legacy_test"
+    "name": "chttp2_fullstack_disappearing_server_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test"
+    "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_legacy_test"
+    "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_graceful_server_shutdown_legacy_test"
+    "name": "chttp2_fullstack_graceful_server_shutdown_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_invoke_large_request_legacy_test"
+    "name": "chttp2_fullstack_invoke_large_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_max_concurrent_streams_legacy_test"
+    "name": "chttp2_fullstack_max_concurrent_streams_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_no_op_legacy_test"
+    "name": "chttp2_fullstack_no_op_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_ping_pong_streaming_legacy_test"
+    "name": "chttp2_fullstack_ping_pong_streaming_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test"
+    "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_request_response_with_metadata_and_payload_legacy_test"
+    "name": "chttp2_fullstack_request_response_with_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_request_response_with_payload_legacy_test"
+    "name": "chttp2_fullstack_request_response_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test"
+    "name": "chttp2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_request_with_large_metadata_legacy_test"
+    "name": "chttp2_fullstack_request_with_large_metadata_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_request_with_payload_legacy_test"
+    "name": "chttp2_fullstack_request_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_simple_delayed_request_legacy_test"
+    "name": "chttp2_fullstack_simple_delayed_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_simple_request_legacy_test"
+    "name": "chttp2_fullstack_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_thread_stress_legacy_test"
+    "name": "chttp2_fullstack_thread_stress_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_legacy_test"
+    "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_bad_hostname_test"
+    "name": "chttp2_fullstack_uds_bad_hostname_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_cancel_after_accept_test"
+    "name": "chttp2_fullstack_uds_cancel_after_accept_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_test"
+    "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_cancel_after_invoke_test"
+    "name": "chttp2_fullstack_uds_cancel_after_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_cancel_before_invoke_test"
+    "name": "chttp2_fullstack_uds_cancel_before_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_test"
+    "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_census_simple_request_test"
+    "name": "chttp2_fullstack_uds_census_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_disappearing_server_test"
+    "name": "chttp2_fullstack_uds_disappearing_server_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_test"
+    "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_test"
+    "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_empty_batch_test"
+    "name": "chttp2_fullstack_uds_empty_batch_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_graceful_server_shutdown_test"
+    "name": "chttp2_fullstack_uds_graceful_server_shutdown_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_invoke_large_request_test"
+    "name": "chttp2_fullstack_uds_invoke_large_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_max_concurrent_streams_test"
+    "name": "chttp2_fullstack_uds_max_concurrent_streams_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_no_op_test"
+    "name": "chttp2_fullstack_uds_no_op_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_ping_pong_streaming_test"
+    "name": "chttp2_fullstack_uds_ping_pong_streaming_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_test"
+    "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_test"
+    "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_request_response_with_payload_test"
+    "name": "chttp2_fullstack_uds_request_response_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_request_with_large_metadata_test"
+    "name": "chttp2_fullstack_uds_request_with_large_metadata_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_request_with_payload_test"
+    "name": "chttp2_fullstack_uds_request_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_simple_delayed_request_test"
+    "name": "chttp2_fullstack_uds_simple_delayed_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_simple_request_test"
+    "name": "chttp2_fullstack_uds_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_thread_stress_test"
+    "name": "chttp2_fullstack_uds_thread_stress_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_test"
+    "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_cancel_after_accept_legacy_test"
+    "name": "chttp2_fullstack_uds_cancel_after_accept_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_legacy_test"
+    "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_cancel_after_invoke_legacy_test"
+    "name": "chttp2_fullstack_uds_cancel_after_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_cancel_before_invoke_legacy_test"
+    "name": "chttp2_fullstack_uds_cancel_before_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_legacy_test"
+    "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_census_simple_request_legacy_test"
+    "name": "chttp2_fullstack_uds_census_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_disappearing_server_legacy_test"
+    "name": "chttp2_fullstack_uds_disappearing_server_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_legacy_test"
+    "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_legacy_test"
+    "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_graceful_server_shutdown_legacy_test"
+    "name": "chttp2_fullstack_uds_graceful_server_shutdown_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_invoke_large_request_legacy_test"
+    "name": "chttp2_fullstack_uds_invoke_large_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_max_concurrent_streams_legacy_test"
+    "name": "chttp2_fullstack_uds_max_concurrent_streams_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_no_op_legacy_test"
+    "name": "chttp2_fullstack_uds_no_op_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_ping_pong_streaming_legacy_test"
+    "name": "chttp2_fullstack_uds_ping_pong_streaming_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_legacy_test"
+    "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_legacy_test"
+    "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_request_response_with_payload_legacy_test"
+    "name": "chttp2_fullstack_uds_request_response_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_request_response_with_trailing_metadata_and_payload_legacy_test"
+    "name": "chttp2_fullstack_uds_request_response_with_trailing_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_request_with_large_metadata_legacy_test"
+    "name": "chttp2_fullstack_uds_request_with_large_metadata_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_request_with_payload_legacy_test"
+    "name": "chttp2_fullstack_uds_request_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_simple_delayed_request_legacy_test"
+    "name": "chttp2_fullstack_uds_simple_delayed_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_simple_request_legacy_test"
+    "name": "chttp2_fullstack_uds_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_thread_stress_legacy_test"
+    "name": "chttp2_fullstack_uds_thread_stress_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_legacy_test"
+    "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_bad_hostname_test"
+    "name": "chttp2_simple_ssl_fullstack_bad_hostname_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_test"
+    "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test"
+    "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_test"
+    "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_test"
+    "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test"
+    "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_census_simple_request_test"
+    "name": "chttp2_simple_ssl_fullstack_census_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_disappearing_server_test"
+    "name": "chttp2_simple_ssl_fullstack_disappearing_server_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test"
+    "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test"
+    "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_empty_batch_test"
+    "name": "chttp2_simple_ssl_fullstack_empty_batch_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_test"
+    "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_invoke_large_request_test"
+    "name": "chttp2_simple_ssl_fullstack_invoke_large_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_test"
+    "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_no_op_test"
+    "name": "chttp2_simple_ssl_fullstack_no_op_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_test"
+    "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test"
+    "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test"
+    "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_test"
+    "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_test"
+    "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_request_with_payload_test"
+    "name": "chttp2_simple_ssl_fullstack_request_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_test"
+    "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_simple_request_test"
+    "name": "chttp2_simple_ssl_fullstack_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_thread_stress_test"
+    "name": "chttp2_simple_ssl_fullstack_thread_stress_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_test"
+    "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_census_simple_request_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_census_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_disappearing_server_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_disappearing_server_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_invoke_large_request_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_invoke_large_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_no_op_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_no_op_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_request_with_payload_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_request_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_simple_request_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_thread_stress_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_thread_stress_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_legacy_test"
+    "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_legacy_test"
+    "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_bad_hostname_test"
+    "name": "chttp2_socket_pair_bad_hostname_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_cancel_after_accept_test"
+    "name": "chttp2_socket_pair_cancel_after_accept_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_test"
+    "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_cancel_after_invoke_test"
+    "name": "chttp2_socket_pair_cancel_after_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_cancel_before_invoke_test"
+    "name": "chttp2_socket_pair_cancel_before_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_cancel_in_a_vacuum_test"
+    "name": "chttp2_socket_pair_cancel_in_a_vacuum_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_census_simple_request_test"
+    "name": "chttp2_socket_pair_census_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_disappearing_server_test"
+    "name": "chttp2_socket_pair_disappearing_server_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test"
+    "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_test"
+    "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_empty_batch_test"
+    "name": "chttp2_socket_pair_empty_batch_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_graceful_server_shutdown_test"
+    "name": "chttp2_socket_pair_graceful_server_shutdown_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_invoke_large_request_test"
+    "name": "chttp2_socket_pair_invoke_large_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_max_concurrent_streams_test"
+    "name": "chttp2_socket_pair_max_concurrent_streams_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_no_op_test"
+    "name": "chttp2_socket_pair_no_op_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_ping_pong_streaming_test"
+    "name": "chttp2_socket_pair_ping_pong_streaming_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test"
+    "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_test"
+    "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_request_response_with_payload_test"
+    "name": "chttp2_socket_pair_request_response_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_request_with_large_metadata_test"
+    "name": "chttp2_socket_pair_request_with_large_metadata_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_request_with_payload_test"
+    "name": "chttp2_socket_pair_request_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_simple_delayed_request_test"
+    "name": "chttp2_socket_pair_simple_delayed_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_simple_request_test"
+    "name": "chttp2_socket_pair_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_thread_stress_test"
+    "name": "chttp2_socket_pair_thread_stress_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_test"
+    "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_cancel_after_accept_legacy_test"
+    "name": "chttp2_socket_pair_cancel_after_accept_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_legacy_test"
+    "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_cancel_after_invoke_legacy_test"
+    "name": "chttp2_socket_pair_cancel_after_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_cancel_before_invoke_legacy_test"
+    "name": "chttp2_socket_pair_cancel_before_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_cancel_in_a_vacuum_legacy_test"
+    "name": "chttp2_socket_pair_cancel_in_a_vacuum_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_census_simple_request_legacy_test"
+    "name": "chttp2_socket_pair_census_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_disappearing_server_legacy_test"
+    "name": "chttp2_socket_pair_disappearing_server_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_legacy_test"
+    "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_legacy_test"
+    "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_graceful_server_shutdown_legacy_test"
+    "name": "chttp2_socket_pair_graceful_server_shutdown_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_invoke_large_request_legacy_test"
+    "name": "chttp2_socket_pair_invoke_large_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_max_concurrent_streams_legacy_test"
+    "name": "chttp2_socket_pair_max_concurrent_streams_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_no_op_legacy_test"
+    "name": "chttp2_socket_pair_no_op_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_ping_pong_streaming_legacy_test"
+    "name": "chttp2_socket_pair_ping_pong_streaming_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_legacy_test"
+    "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_legacy_test"
+    "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_request_response_with_payload_legacy_test"
+    "name": "chttp2_socket_pair_request_response_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_legacy_test"
+    "name": "chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_request_with_large_metadata_legacy_test"
+    "name": "chttp2_socket_pair_request_with_large_metadata_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_request_with_payload_legacy_test"
+    "name": "chttp2_socket_pair_request_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_simple_delayed_request_legacy_test"
+    "name": "chttp2_socket_pair_simple_delayed_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_simple_request_legacy_test"
+    "name": "chttp2_socket_pair_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_thread_stress_legacy_test"
+    "name": "chttp2_socket_pair_thread_stress_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_legacy_test"
+    "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_empty_batch_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_empty_batch_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }, 
   {
     "flaky": false, 
     "language": "c", 
-    "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_legacy_test"
+    "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_legacy_test", 
+    "platforms": [
+      "windows", 
+      "posix"
+    ]
   }
 ]
 
diff --git a/vsprojects/vs2010/grpc.vcxproj b/vsprojects/vs2010/grpc.vcxproj
index 203ca34..02d1f26 100644
--- a/vsprojects/vs2010/grpc.vcxproj
+++ b/vsprojects/vs2010/grpc.vcxproj
@@ -270,6 +270,8 @@
     </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c">
     </ClCompile>
+    <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c">
+    </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\fd_posix.c">
     </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\iocp_windows.c">
diff --git a/vsprojects/vs2010/grpc.vcxproj.filters b/vsprojects/vs2010/grpc.vcxproj.filters
index 20dbe8c..a010639 100644
--- a/vsprojects/vs2010/grpc.vcxproj.filters
+++ b/vsprojects/vs2010/grpc.vcxproj.filters
@@ -124,6 +124,9 @@
     <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c">
       <Filter>src\core\iomgr</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c">
+      <Filter>src\core\iomgr</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\fd_posix.c">
       <Filter>src\core\iomgr</Filter>
     </ClCompile>
diff --git a/vsprojects/vs2010/grpc_test_util.vcxproj b/vsprojects/vs2010/grpc_test_util.vcxproj
index 967543f..d3559d4 100644
--- a/vsprojects/vs2010/grpc_test_util.vcxproj
+++ b/vsprojects/vs2010/grpc_test_util.vcxproj
@@ -96,6 +96,8 @@
     </ClCompile>
     <ClCompile Include="..\..\test\core\util\port_posix.c">
     </ClCompile>
+    <ClCompile Include="..\..\test\core\util\port_windows.c">
+    </ClCompile>
     <ClCompile Include="..\..\test\core\util\slice_splitter.c">
     </ClCompile>
   </ItemGroup>
diff --git a/vsprojects/vs2010/grpc_unsecure.vcxproj b/vsprojects/vs2010/grpc_unsecure.vcxproj
index 1558d72..651f38a 100644
--- a/vsprojects/vs2010/grpc_unsecure.vcxproj
+++ b/vsprojects/vs2010/grpc_unsecure.vcxproj
@@ -214,6 +214,8 @@
     </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c">
     </ClCompile>
+    <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c">
+    </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\fd_posix.c">
     </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\iocp_windows.c">
diff --git a/vsprojects/vs2010/grpc_unsecure.vcxproj.filters b/vsprojects/vs2010/grpc_unsecure.vcxproj.filters
index 4b758d6..7757a44 100644
--- a/vsprojects/vs2010/grpc_unsecure.vcxproj.filters
+++ b/vsprojects/vs2010/grpc_unsecure.vcxproj.filters
@@ -64,6 +64,9 @@
     <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c">
       <Filter>src\core\iomgr</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c">
+      <Filter>src\core\iomgr</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\fd_posix.c">
       <Filter>src\core\iomgr</Filter>
     </ClCompile>
diff --git a/vsprojects/vs2013/Grpc.mak b/vsprojects/vs2013/Grpc.mak
index 727aa37..c2c25ce 100644
--- a/vsprojects/vs2013/Grpc.mak
+++ b/vsprojects/vs2013/Grpc.mak
@@ -53,16 +53,15 @@
 $(OUT_DIR):
 	mkdir $(OUT_DIR)
 
-buildtests: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stats_store_test.exe census_stub_test.exe census_trace_store_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe chttp2_transport_end2end_test.exe dualstack_socket_test.exe echo_test.exe fd_posix_test.exe fling_stream_test.exe fling_test.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe transport_metadata_test.exe transport_security_test.exe 
+buildtests: buildtests_c buildtests_cxx
+
+buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stub_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe chttp2_transport_end2end_test.exe echo_client.exe echo_server.exe echo_test.exe fd_posix_test.exe fling_client.exe fling_server.exe fling_stream_test.exe fling_test.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe transport_metadata_test.exe transport_security_test.exe 
 	echo All tests built.
 
-test: alarm_heap_test alarm_list_test alarm_test alpn_test bin_encoder_test census_hash_table_test census_statistics_multiple_writers_circular_buffer_test census_statistics_multiple_writers_test census_statistics_performance_test census_statistics_quick_test census_statistics_small_log_test census_stats_store_test census_stub_test census_trace_store_test census_window_stats_test chttp2_status_conversion_test chttp2_stream_encoder_test chttp2_stream_map_test chttp2_transport_end2end_test dualstack_socket_test echo_test fd_posix_test fling_stream_test fling_test gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test grpc_base64_test grpc_byte_buffer_reader_test grpc_channel_stack_test grpc_completion_queue_test grpc_credentials_test grpc_json_token_test grpc_stream_op_test hpack_parser_test hpack_table_test httpcli_format_request_test httpcli_parser_test httpcli_test json_rewrite_test json_test lame_client_test message_compress_test metadata_buffer_test multi_init_test murmur_hash_test no_server_test poll_kick_posix_test resolve_address_test secure_endpoint_test sockaddr_utils_test tcp_client_posix_test tcp_posix_test tcp_server_posix_test time_averaged_stats_test time_test timeout_encoding_test transport_metadata_test transport_security_test 
-	echo All tests ran.
+buildtests_cxx: 
+	echo All tests built.
 
-test_gpr: gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test 
-	echo All tests ran.
-
-alarm_heap_test.exe: grpc_test_util
+alarm_heap_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building alarm_heap_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\alarm_heap_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alarm_heap_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alarm_heap_test.obj 
@@ -70,7 +69,7 @@
 	echo Running alarm_heap_test
 	$(OUT_DIR)\alarm_heap_test.exe
 
-alarm_list_test.exe: grpc_test_util
+alarm_list_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building alarm_list_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\alarm_list_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alarm_list_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alarm_list_test.obj 
@@ -78,7 +77,7 @@
 	echo Running alarm_list_test
 	$(OUT_DIR)\alarm_list_test.exe
 
-alarm_test.exe: grpc_test_util
+alarm_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building alarm_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\alarm_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alarm_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alarm_test.obj 
@@ -86,7 +85,7 @@
 	echo Running alarm_test
 	$(OUT_DIR)\alarm_test.exe
 
-alpn_test.exe: grpc_test_util
+alpn_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building alpn_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\alpn_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alpn_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alpn_test.obj 
@@ -94,7 +93,7 @@
 	echo Running alpn_test
 	$(OUT_DIR)\alpn_test.exe
 
-bin_encoder_test.exe: grpc_test_util
+bin_encoder_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building bin_encoder_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\bin_encoder_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\bin_encoder_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\bin_encoder_test.obj 
@@ -102,7 +101,7 @@
 	echo Running bin_encoder_test
 	$(OUT_DIR)\bin_encoder_test.exe
 
-census_hash_table_test.exe: grpc_test_util
+census_hash_table_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building census_hash_table_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\hash_table_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_hash_table_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\hash_table_test.obj 
@@ -110,7 +109,7 @@
 	echo Running census_hash_table_test
 	$(OUT_DIR)\census_hash_table_test.exe
 
-census_statistics_multiple_writers_circular_buffer_test.exe: grpc_test_util
+census_statistics_multiple_writers_circular_buffer_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building census_statistics_multiple_writers_circular_buffer_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\multiple_writers_circular_buffer_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_multiple_writers_circular_buffer_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\multiple_writers_circular_buffer_test.obj 
@@ -118,7 +117,7 @@
 	echo Running census_statistics_multiple_writers_circular_buffer_test
 	$(OUT_DIR)\census_statistics_multiple_writers_circular_buffer_test.exe
 
-census_statistics_multiple_writers_test.exe: grpc_test_util
+census_statistics_multiple_writers_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building census_statistics_multiple_writers_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\multiple_writers_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_multiple_writers_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\multiple_writers_test.obj 
@@ -126,7 +125,7 @@
 	echo Running census_statistics_multiple_writers_test
 	$(OUT_DIR)\census_statistics_multiple_writers_test.exe
 
-census_statistics_performance_test.exe: grpc_test_util
+census_statistics_performance_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building census_statistics_performance_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\performance_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_performance_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\performance_test.obj 
@@ -134,7 +133,7 @@
 	echo Running census_statistics_performance_test
 	$(OUT_DIR)\census_statistics_performance_test.exe
 
-census_statistics_quick_test.exe: grpc_test_util
+census_statistics_quick_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building census_statistics_quick_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\quick_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_quick_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\quick_test.obj 
@@ -142,7 +141,7 @@
 	echo Running census_statistics_quick_test
 	$(OUT_DIR)\census_statistics_quick_test.exe
 
-census_statistics_small_log_test.exe: grpc_test_util
+census_statistics_small_log_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building census_statistics_small_log_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\small_log_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_small_log_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\small_log_test.obj 
@@ -150,7 +149,7 @@
 	echo Running census_statistics_small_log_test
 	$(OUT_DIR)\census_statistics_small_log_test.exe
 
-census_stats_store_test.exe: grpc_test_util
+census_stats_store_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building census_stats_store_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\rpc_stats_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_stats_store_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\rpc_stats_test.obj 
@@ -158,7 +157,7 @@
 	echo Running census_stats_store_test
 	$(OUT_DIR)\census_stats_store_test.exe
 
-census_stub_test.exe: grpc_test_util
+census_stub_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building census_stub_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\census_stub_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_stub_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\census_stub_test.obj 
@@ -166,7 +165,7 @@
 	echo Running census_stub_test
 	$(OUT_DIR)\census_stub_test.exe
 
-census_trace_store_test.exe: grpc_test_util
+census_trace_store_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building census_trace_store_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\trace_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_trace_store_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\trace_test.obj 
@@ -174,7 +173,7 @@
 	echo Running census_trace_store_test
 	$(OUT_DIR)\census_trace_store_test.exe
 
-census_window_stats_test.exe: grpc_test_util
+census_window_stats_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building census_window_stats_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\window_stats_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_window_stats_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\window_stats_test.obj 
@@ -182,7 +181,7 @@
 	echo Running census_window_stats_test
 	$(OUT_DIR)\census_window_stats_test.exe
 
-chttp2_status_conversion_test.exe: grpc_test_util
+chttp2_status_conversion_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building chttp2_status_conversion_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\status_conversion_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_status_conversion_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\status_conversion_test.obj 
@@ -190,7 +189,7 @@
 	echo Running chttp2_status_conversion_test
 	$(OUT_DIR)\chttp2_status_conversion_test.exe
 
-chttp2_stream_encoder_test.exe: grpc_test_util
+chttp2_stream_encoder_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building chttp2_stream_encoder_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\stream_encoder_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_stream_encoder_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\stream_encoder_test.obj 
@@ -198,7 +197,7 @@
 	echo Running chttp2_stream_encoder_test
 	$(OUT_DIR)\chttp2_stream_encoder_test.exe
 
-chttp2_stream_map_test.exe: grpc_test_util
+chttp2_stream_map_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building chttp2_stream_map_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\stream_map_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_stream_map_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\stream_map_test.obj 
@@ -206,7 +205,7 @@
 	echo Running chttp2_stream_map_test
 	$(OUT_DIR)\chttp2_stream_map_test.exe
 
-chttp2_transport_end2end_test.exe: grpc_test_util
+chttp2_transport_end2end_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building chttp2_transport_end2end_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2_transport_end2end_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_transport_end2end_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\chttp2_transport_end2end_test.obj 
@@ -214,15 +213,7 @@
 	echo Running chttp2_transport_end2end_test
 	$(OUT_DIR)\chttp2_transport_end2end_test.exe
 
-dualstack_socket_test.exe: grpc_test_util
-	echo Building dualstack_socket_test
-	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\end2end\dualstack_socket_test.c 
-	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\dualstack_socket_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dualstack_socket_test.obj 
-dualstack_socket_test: dualstack_socket_test.exe
-	echo Running dualstack_socket_test
-	$(OUT_DIR)\dualstack_socket_test.exe
-
-echo_client.exe: grpc_test_util
+echo_client.exe: grpc_test_util $(OUT_DIR)
 	echo Building echo_client
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\echo\client.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\echo_client.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\client.obj 
@@ -230,7 +221,7 @@
 	echo Running echo_client
 	$(OUT_DIR)\echo_client.exe
 
-echo_server.exe: grpc_test_util
+echo_server.exe: grpc_test_util $(OUT_DIR)
 	echo Building echo_server
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\echo\server.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\echo_server.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\server.obj 
@@ -238,7 +229,7 @@
 	echo Running echo_server
 	$(OUT_DIR)\echo_server.exe
 
-echo_test.exe: grpc_test_util
+echo_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building echo_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\echo\echo_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\echo_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\echo_test.obj 
@@ -246,7 +237,7 @@
 	echo Running echo_test
 	$(OUT_DIR)\echo_test.exe
 
-fd_posix_test.exe: grpc_test_util
+fd_posix_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building fd_posix_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\fd_posix_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fd_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fd_posix_test.obj 
@@ -254,7 +245,7 @@
 	echo Running fd_posix_test
 	$(OUT_DIR)\fd_posix_test.exe
 
-fling_client.exe: grpc_test_util
+fling_client.exe: grpc_test_util $(OUT_DIR)
 	echo Building fling_client
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\client.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_client.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\client.obj 
@@ -262,7 +253,7 @@
 	echo Running fling_client
 	$(OUT_DIR)\fling_client.exe
 
-fling_server.exe: grpc_test_util
+fling_server.exe: grpc_test_util $(OUT_DIR)
 	echo Building fling_server
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\server.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_server.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\server.obj 
@@ -270,7 +261,7 @@
 	echo Running fling_server
 	$(OUT_DIR)\fling_server.exe
 
-fling_stream_test.exe: grpc_test_util
+fling_stream_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building fling_stream_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\fling_stream_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_stream_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fling_stream_test.obj 
@@ -278,7 +269,7 @@
 	echo Running fling_stream_test
 	$(OUT_DIR)\fling_stream_test.exe
 
-fling_test.exe: grpc_test_util
+fling_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building fling_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\fling_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fling_test.obj 
@@ -286,7 +277,7 @@
 	echo Running fling_test
 	$(OUT_DIR)\fling_test.exe
 
-gen_hpack_tables.exe: grpc_test_util
+gen_hpack_tables.exe: grpc_test_util $(OUT_DIR)
 	echo Building gen_hpack_tables
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\src\core\transport\chttp2\gen_hpack_tables.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gen_hpack_tables.exe" Debug\grpc_test_util.lib Debug\gpr.lib Debug\grpc.lib $(LIBS) $(OUT_DIR)\gen_hpack_tables.obj 
@@ -294,7 +285,7 @@
 	echo Running gen_hpack_tables
 	$(OUT_DIR)\gen_hpack_tables.exe
 
-gpr_cancellable_test.exe: grpc_test_util
+gpr_cancellable_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_cancellable_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\cancellable_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_cancellable_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\cancellable_test.obj 
@@ -302,7 +293,7 @@
 	echo Running gpr_cancellable_test
 	$(OUT_DIR)\gpr_cancellable_test.exe
 
-gpr_cmdline_test.exe: grpc_test_util
+gpr_cmdline_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_cmdline_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\cmdline_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_cmdline_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\cmdline_test.obj 
@@ -310,7 +301,7 @@
 	echo Running gpr_cmdline_test
 	$(OUT_DIR)\gpr_cmdline_test.exe
 
-gpr_env_test.exe: grpc_test_util
+gpr_env_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_env_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\env_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_env_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\env_test.obj 
@@ -318,7 +309,7 @@
 	echo Running gpr_env_test
 	$(OUT_DIR)\gpr_env_test.exe
 
-gpr_file_test.exe: grpc_test_util
+gpr_file_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_file_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\file_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_file_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\file_test.obj 
@@ -326,7 +317,7 @@
 	echo Running gpr_file_test
 	$(OUT_DIR)\gpr_file_test.exe
 
-gpr_histogram_test.exe: grpc_test_util
+gpr_histogram_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_histogram_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\histogram_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_histogram_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\histogram_test.obj 
@@ -334,7 +325,7 @@
 	echo Running gpr_histogram_test
 	$(OUT_DIR)\gpr_histogram_test.exe
 
-gpr_host_port_test.exe: grpc_test_util
+gpr_host_port_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_host_port_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\host_port_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_host_port_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\host_port_test.obj 
@@ -342,7 +333,7 @@
 	echo Running gpr_host_port_test
 	$(OUT_DIR)\gpr_host_port_test.exe
 
-gpr_log_test.exe: grpc_test_util
+gpr_log_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_log_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\log_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_log_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\log_test.obj 
@@ -350,7 +341,7 @@
 	echo Running gpr_log_test
 	$(OUT_DIR)\gpr_log_test.exe
 
-gpr_slice_buffer_test.exe: grpc_test_util
+gpr_slice_buffer_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_slice_buffer_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\slice_buffer_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_slice_buffer_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\slice_buffer_test.obj 
@@ -358,7 +349,7 @@
 	echo Running gpr_slice_buffer_test
 	$(OUT_DIR)\gpr_slice_buffer_test.exe
 
-gpr_slice_test.exe: grpc_test_util
+gpr_slice_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_slice_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\slice_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_slice_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\slice_test.obj 
@@ -366,7 +357,7 @@
 	echo Running gpr_slice_test
 	$(OUT_DIR)\gpr_slice_test.exe
 
-gpr_string_test.exe: grpc_test_util
+gpr_string_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_string_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\string_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_string_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\string_test.obj 
@@ -374,7 +365,7 @@
 	echo Running gpr_string_test
 	$(OUT_DIR)\gpr_string_test.exe
 
-gpr_sync_test.exe: grpc_test_util
+gpr_sync_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_sync_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\sync_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_sync_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\sync_test.obj 
@@ -382,7 +373,7 @@
 	echo Running gpr_sync_test
 	$(OUT_DIR)\gpr_sync_test.exe
 
-gpr_thd_test.exe: grpc_test_util
+gpr_thd_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_thd_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\thd_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_thd_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\thd_test.obj 
@@ -390,7 +381,7 @@
 	echo Running gpr_thd_test
 	$(OUT_DIR)\gpr_thd_test.exe
 
-gpr_time_test.exe: grpc_test_util
+gpr_time_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_time_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\time_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_time_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\time_test.obj 
@@ -398,7 +389,7 @@
 	echo Running gpr_time_test
 	$(OUT_DIR)\gpr_time_test.exe
 
-gpr_tls_test.exe: grpc_test_util
+gpr_tls_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_tls_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\tls_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_tls_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tls_test.obj 
@@ -406,7 +397,7 @@
 	echo Running gpr_tls_test
 	$(OUT_DIR)\gpr_tls_test.exe
 
-gpr_useful_test.exe: grpc_test_util
+gpr_useful_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building gpr_useful_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\useful_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_useful_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\useful_test.obj 
@@ -414,7 +405,7 @@
 	echo Running gpr_useful_test
 	$(OUT_DIR)\gpr_useful_test.exe
 
-grpc_base64_test.exe: grpc_test_util
+grpc_base64_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building grpc_base64_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\base64_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_base64_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\base64_test.obj 
@@ -422,7 +413,7 @@
 	echo Running grpc_base64_test
 	$(OUT_DIR)\grpc_base64_test.exe
 
-grpc_byte_buffer_reader_test.exe: grpc_test_util
+grpc_byte_buffer_reader_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building grpc_byte_buffer_reader_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\byte_buffer_reader_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_byte_buffer_reader_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\byte_buffer_reader_test.obj 
@@ -430,7 +421,7 @@
 	echo Running grpc_byte_buffer_reader_test
 	$(OUT_DIR)\grpc_byte_buffer_reader_test.exe
 
-grpc_channel_stack_test.exe: grpc_test_util
+grpc_channel_stack_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building grpc_channel_stack_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\channel\channel_stack_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_channel_stack_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\channel_stack_test.obj 
@@ -438,7 +429,7 @@
 	echo Running grpc_channel_stack_test
 	$(OUT_DIR)\grpc_channel_stack_test.exe
 
-grpc_completion_queue_benchmark.exe: grpc_test_util
+grpc_completion_queue_benchmark.exe: grpc_test_util $(OUT_DIR)
 	echo Building grpc_completion_queue_benchmark
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\completion_queue_benchmark.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_completion_queue_benchmark.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\completion_queue_benchmark.obj 
@@ -446,7 +437,7 @@
 	echo Running grpc_completion_queue_benchmark
 	$(OUT_DIR)\grpc_completion_queue_benchmark.exe
 
-grpc_completion_queue_test.exe: grpc_test_util
+grpc_completion_queue_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building grpc_completion_queue_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\completion_queue_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_completion_queue_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\completion_queue_test.obj 
@@ -454,7 +445,7 @@
 	echo Running grpc_completion_queue_test
 	$(OUT_DIR)\grpc_completion_queue_test.exe
 
-grpc_create_jwt.exe: grpc_test_util
+grpc_create_jwt.exe: grpc_test_util $(OUT_DIR)
 	echo Building grpc_create_jwt
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\create_jwt.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_create_jwt.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\create_jwt.obj 
@@ -462,7 +453,7 @@
 	echo Running grpc_create_jwt
 	$(OUT_DIR)\grpc_create_jwt.exe
 
-grpc_credentials_test.exe: grpc_test_util
+grpc_credentials_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building grpc_credentials_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\credentials_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_credentials_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\credentials_test.obj 
@@ -470,7 +461,7 @@
 	echo Running grpc_credentials_test
 	$(OUT_DIR)\grpc_credentials_test.exe
 
-grpc_fetch_oauth2.exe: grpc_test_util
+grpc_fetch_oauth2.exe: grpc_test_util $(OUT_DIR)
 	echo Building grpc_fetch_oauth2
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\fetch_oauth2.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_fetch_oauth2.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fetch_oauth2.obj 
@@ -478,7 +469,7 @@
 	echo Running grpc_fetch_oauth2
 	$(OUT_DIR)\grpc_fetch_oauth2.exe
 
-grpc_json_token_test.exe: grpc_test_util
+grpc_json_token_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building grpc_json_token_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\json_token_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_json_token_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_token_test.obj 
@@ -486,7 +477,7 @@
 	echo Running grpc_json_token_test
 	$(OUT_DIR)\grpc_json_token_test.exe
 
-grpc_print_google_default_creds_token.exe: grpc_test_util
+grpc_print_google_default_creds_token.exe: grpc_test_util $(OUT_DIR)
 	echo Building grpc_print_google_default_creds_token
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\print_google_default_creds_token.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_print_google_default_creds_token.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\print_google_default_creds_token.obj 
@@ -494,7 +485,7 @@
 	echo Running grpc_print_google_default_creds_token
 	$(OUT_DIR)\grpc_print_google_default_creds_token.exe
 
-grpc_stream_op_test.exe: grpc_test_util
+grpc_stream_op_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building grpc_stream_op_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\stream_op_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_stream_op_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\stream_op_test.obj 
@@ -502,7 +493,7 @@
 	echo Running grpc_stream_op_test
 	$(OUT_DIR)\grpc_stream_op_test.exe
 
-hpack_parser_test.exe: grpc_test_util
+hpack_parser_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building hpack_parser_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\hpack_parser_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\hpack_parser_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\hpack_parser_test.obj 
@@ -510,7 +501,7 @@
 	echo Running hpack_parser_test
 	$(OUT_DIR)\hpack_parser_test.exe
 
-hpack_table_test.exe: grpc_test_util
+hpack_table_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building hpack_table_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\hpack_table_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\hpack_table_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\hpack_table_test.obj 
@@ -518,7 +509,7 @@
 	echo Running hpack_table_test
 	$(OUT_DIR)\hpack_table_test.exe
 
-httpcli_format_request_test.exe: grpc_test_util
+httpcli_format_request_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building httpcli_format_request_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\httpcli\format_request_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\httpcli_format_request_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\format_request_test.obj 
@@ -526,7 +517,7 @@
 	echo Running httpcli_format_request_test
 	$(OUT_DIR)\httpcli_format_request_test.exe
 
-httpcli_parser_test.exe: grpc_test_util
+httpcli_parser_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building httpcli_parser_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\httpcli\parser_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\httpcli_parser_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\parser_test.obj 
@@ -534,7 +525,7 @@
 	echo Running httpcli_parser_test
 	$(OUT_DIR)\httpcli_parser_test.exe
 
-httpcli_test.exe: grpc_test_util
+httpcli_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building httpcli_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\httpcli\httpcli_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\httpcli_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\httpcli_test.obj 
@@ -542,7 +533,7 @@
 	echo Running httpcli_test
 	$(OUT_DIR)\httpcli_test.exe
 
-json_rewrite.exe: grpc_test_util
+json_rewrite.exe: grpc_test_util $(OUT_DIR)
 	echo Building json_rewrite
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\json\json_rewrite.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\json_rewrite.exe" Debug\grpc.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_rewrite.obj 
@@ -550,7 +541,7 @@
 	echo Running json_rewrite
 	$(OUT_DIR)\json_rewrite.exe
 
-json_rewrite_test.exe: grpc_test_util
+json_rewrite_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building json_rewrite_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\json\json_rewrite_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\json_rewrite_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_rewrite_test.obj 
@@ -558,7 +549,7 @@
 	echo Running json_rewrite_test
 	$(OUT_DIR)\json_rewrite_test.exe
 
-json_test.exe: grpc_test_util
+json_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building json_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\json\json_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\json_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_test.obj 
@@ -566,7 +557,7 @@
 	echo Running json_test
 	$(OUT_DIR)\json_test.exe
 
-lame_client_test.exe: grpc_test_util
+lame_client_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building lame_client_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\lame_client_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\lame_client_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\lame_client_test.obj 
@@ -574,7 +565,7 @@
 	echo Running lame_client_test
 	$(OUT_DIR)\lame_client_test.exe
 
-low_level_ping_pong_benchmark.exe: grpc_test_util
+low_level_ping_pong_benchmark.exe: grpc_test_util $(OUT_DIR)
 	echo Building low_level_ping_pong_benchmark
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\network_benchmarks\low_level_ping_pong.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\low_level_ping_pong_benchmark.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\low_level_ping_pong.obj 
@@ -582,7 +573,7 @@
 	echo Running low_level_ping_pong_benchmark
 	$(OUT_DIR)\low_level_ping_pong_benchmark.exe
 
-message_compress_test.exe: grpc_test_util
+message_compress_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building message_compress_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\compression\message_compress_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\message_compress_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\message_compress_test.obj 
@@ -590,7 +581,7 @@
 	echo Running message_compress_test
 	$(OUT_DIR)\message_compress_test.exe
 
-metadata_buffer_test.exe: grpc_test_util
+metadata_buffer_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building metadata_buffer_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\channel\metadata_buffer_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\metadata_buffer_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\metadata_buffer_test.obj 
@@ -598,7 +589,7 @@
 	echo Running metadata_buffer_test
 	$(OUT_DIR)\metadata_buffer_test.exe
 
-multi_init_test.exe: grpc_test_util
+multi_init_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building multi_init_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\multi_init_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\multi_init_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\multi_init_test.obj 
@@ -606,7 +597,7 @@
 	echo Running multi_init_test
 	$(OUT_DIR)\multi_init_test.exe
 
-murmur_hash_test.exe: grpc_test_util
+murmur_hash_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building murmur_hash_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\murmur_hash_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\murmur_hash_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\murmur_hash_test.obj 
@@ -614,7 +605,7 @@
 	echo Running murmur_hash_test
 	$(OUT_DIR)\murmur_hash_test.exe
 
-no_server_test.exe: grpc_test_util
+no_server_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building no_server_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\end2end\no_server_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\no_server_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\no_server_test.obj 
@@ -622,7 +613,7 @@
 	echo Running no_server_test
 	$(OUT_DIR)\no_server_test.exe
 
-poll_kick_posix_test.exe: grpc_test_util
+poll_kick_posix_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building poll_kick_posix_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\poll_kick_posix_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\poll_kick_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\poll_kick_posix_test.obj 
@@ -630,7 +621,7 @@
 	echo Running poll_kick_posix_test
 	$(OUT_DIR)\poll_kick_posix_test.exe
 
-resolve_address_test.exe: grpc_test_util
+resolve_address_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building resolve_address_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\resolve_address_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\resolve_address_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\resolve_address_test.obj 
@@ -638,7 +629,7 @@
 	echo Running resolve_address_test
 	$(OUT_DIR)\resolve_address_test.exe
 
-secure_endpoint_test.exe: grpc_test_util
+secure_endpoint_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building secure_endpoint_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\secure_endpoint_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\secure_endpoint_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\secure_endpoint_test.obj 
@@ -646,7 +637,7 @@
 	echo Running secure_endpoint_test
 	$(OUT_DIR)\secure_endpoint_test.exe
 
-sockaddr_utils_test.exe: grpc_test_util
+sockaddr_utils_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building sockaddr_utils_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\sockaddr_utils_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\sockaddr_utils_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\sockaddr_utils_test.obj 
@@ -654,7 +645,7 @@
 	echo Running sockaddr_utils_test
 	$(OUT_DIR)\sockaddr_utils_test.exe
 
-tcp_client_posix_test.exe: grpc_test_util
+tcp_client_posix_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building tcp_client_posix_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\tcp_client_posix_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\tcp_client_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tcp_client_posix_test.obj 
@@ -662,7 +653,7 @@
 	echo Running tcp_client_posix_test
 	$(OUT_DIR)\tcp_client_posix_test.exe
 
-tcp_posix_test.exe: grpc_test_util
+tcp_posix_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building tcp_posix_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\tcp_posix_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\tcp_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tcp_posix_test.obj 
@@ -670,7 +661,7 @@
 	echo Running tcp_posix_test
 	$(OUT_DIR)\tcp_posix_test.exe
 
-tcp_server_posix_test.exe: grpc_test_util
+tcp_server_posix_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building tcp_server_posix_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\tcp_server_posix_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\tcp_server_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tcp_server_posix_test.obj 
@@ -678,7 +669,7 @@
 	echo Running tcp_server_posix_test
 	$(OUT_DIR)\tcp_server_posix_test.exe
 
-time_averaged_stats_test.exe: grpc_test_util
+time_averaged_stats_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building time_averaged_stats_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\time_averaged_stats_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\time_averaged_stats_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\time_averaged_stats_test.obj 
@@ -686,7 +677,7 @@
 	echo Running time_averaged_stats_test
 	$(OUT_DIR)\time_averaged_stats_test.exe
 
-time_test.exe: grpc_test_util
+time_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building time_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\time_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\time_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\time_test.obj 
@@ -694,7 +685,7 @@
 	echo Running time_test
 	$(OUT_DIR)\time_test.exe
 
-timeout_encoding_test.exe: grpc_test_util
+timeout_encoding_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building timeout_encoding_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\timeout_encoding_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\timeout_encoding_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\timeout_encoding_test.obj 
@@ -702,7 +693,7 @@
 	echo Running timeout_encoding_test
 	$(OUT_DIR)\timeout_encoding_test.exe
 
-transport_metadata_test.exe: grpc_test_util
+transport_metadata_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building transport_metadata_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\metadata_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\transport_metadata_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\metadata_test.obj 
@@ -710,7 +701,7 @@
 	echo Running transport_metadata_test
 	$(OUT_DIR)\transport_metadata_test.exe
 
-transport_security_test.exe: grpc_test_util
+transport_security_test.exe: grpc_test_util $(OUT_DIR)
 	echo Building transport_security_test
 	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\tsi\transport_security_test.c 
 	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\transport_security_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\transport_security_test.obj 
diff --git a/vsprojects/vs2013/grpc.vcxproj b/vsprojects/vs2013/grpc.vcxproj
index a88eb34..cb87334 100644
--- a/vsprojects/vs2013/grpc.vcxproj
+++ b/vsprojects/vs2013/grpc.vcxproj
@@ -272,6 +272,8 @@
     </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c">
     </ClCompile>
+    <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c">
+    </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\fd_posix.c">
     </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\iocp_windows.c">
diff --git a/vsprojects/vs2013/grpc.vcxproj.filters b/vsprojects/vs2013/grpc.vcxproj.filters
index 20dbe8c..a010639 100644
--- a/vsprojects/vs2013/grpc.vcxproj.filters
+++ b/vsprojects/vs2013/grpc.vcxproj.filters
@@ -124,6 +124,9 @@
     <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c">
       <Filter>src\core\iomgr</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c">
+      <Filter>src\core\iomgr</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\fd_posix.c">
       <Filter>src\core\iomgr</Filter>
     </ClCompile>
diff --git a/vsprojects/vs2013/grpc_test_util.vcxproj b/vsprojects/vs2013/grpc_test_util.vcxproj
index 4756f53..d25fd7c 100644
--- a/vsprojects/vs2013/grpc_test_util.vcxproj
+++ b/vsprojects/vs2013/grpc_test_util.vcxproj
@@ -98,6 +98,8 @@
     </ClCompile>
     <ClCompile Include="..\..\test\core\util\port_posix.c">
     </ClCompile>
+    <ClCompile Include="..\..\test\core\util\port_windows.c">
+    </ClCompile>
     <ClCompile Include="..\..\test\core\util\slice_splitter.c">
     </ClCompile>
   </ItemGroup>
diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj b/vsprojects/vs2013/grpc_unsecure.vcxproj
index 98c14c2..098ce34 100644
--- a/vsprojects/vs2013/grpc_unsecure.vcxproj
+++ b/vsprojects/vs2013/grpc_unsecure.vcxproj
@@ -216,6 +216,8 @@
     </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c">
     </ClCompile>
+    <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c">
+    </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\fd_posix.c">
     </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\iocp_windows.c">
diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters
index 4b758d6..7757a44 100644
--- a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters
+++ b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters
@@ -64,6 +64,9 @@
     <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c">
       <Filter>src\core\iomgr</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c">
+      <Filter>src\core\iomgr</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\src\core\iomgr\fd_posix.c">
       <Filter>src\core\iomgr</Filter>
     </ClCompile>