diff --git a/build.json b/build.json
new file mode 100644
index 0000000000000000000000000000000000000000..c68569e9f1a288693b591795ea96e86d47ef8ae3
--- /dev/null
+++ b/build.json
@@ -0,0 +1,2729 @@
+{
+  "#1": "This file describes the list of targets and dependencies.",
+  "#2": "It is used among other things to generate all of our project files.",
+  "#3": "Please refer to the templates directory for more information.",
+  "settings": {
+    "#": "The public version number of the library.",
+    "version": {
+      "major": 0,
+      "minor": 10,
+      "micro": 1,
+      "build": 0
+    }
+  },
+  "filegroups": [
+    {
+      "name": "census",
+      "public_headers": [
+        "include/grpc/census.h"
+      ],
+      "headers": [
+        "src/core/census/context.h",
+        "src/core/census/rpc_stat_id.h"
+      ],
+      "src": [
+        "src/core/census/context.c",
+        "src/core/census/initialize.c",
+        "src/core/census/record_stat.c"
+      ]
+    },
+    {
+      "name": "grpc++_base",
+      "public_headers": [
+        "include/grpc++/channel.h",
+        "include/grpc++/client_context.h",
+        "include/grpc++/completion_queue.h",
+        "include/grpc++/create_channel.h",
+        "include/grpc++/credentials.h",
+        "include/grpc++/generic/async_generic_service.h",
+        "include/grpc++/generic/generic_stub.h",
+        "include/grpc++/impl/call.h",
+        "include/grpc++/impl/client_unary_call.h",
+        "include/grpc++/impl/grpc_library.h",
+        "include/grpc++/impl/proto_utils.h",
+        "include/grpc++/impl/rpc_method.h",
+        "include/grpc++/impl/rpc_service_method.h",
+        "include/grpc++/impl/serialization_traits.h",
+        "include/grpc++/impl/service_type.h",
+        "include/grpc++/impl/sync.h",
+        "include/grpc++/impl/sync_cxx11.h",
+        "include/grpc++/impl/sync_no_cxx11.h",
+        "include/grpc++/impl/thd.h",
+        "include/grpc++/impl/thd_cxx11.h",
+        "include/grpc++/impl/thd_no_cxx11.h",
+        "include/grpc++/server.h",
+        "include/grpc++/server_builder.h",
+        "include/grpc++/server_context.h",
+        "include/grpc++/server_credentials.h",
+        "include/grpc++/support/async_stream.h",
+        "include/grpc++/support/async_unary_call.h",
+        "include/grpc++/support/auth_context.h",
+        "include/grpc++/support/byte_buffer.h",
+        "include/grpc++/support/channel_arguments.h",
+        "include/grpc++/support/config.h",
+        "include/grpc++/support/config_protobuf.h",
+        "include/grpc++/support/slice.h",
+        "include/grpc++/support/status.h",
+        "include/grpc++/support/status_code_enum.h",
+        "include/grpc++/support/string_ref.h",
+        "include/grpc++/support/stub_options.h",
+        "include/grpc++/support/sync_stream.h",
+        "include/grpc++/support/time.h"
+      ],
+      "headers": [
+        "src/cpp/client/create_channel_internal.h",
+        "src/cpp/common/create_auth_context.h",
+        "src/cpp/server/dynamic_thread_pool.h",
+        "src/cpp/server/fixed_size_thread_pool.h",
+        "src/cpp/server/thread_pool_interface.h"
+      ],
+      "src": [
+        "src/cpp/client/channel.cc",
+        "src/cpp/client/channel_arguments.cc",
+        "src/cpp/client/client_context.cc",
+        "src/cpp/client/create_channel.cc",
+        "src/cpp/client/create_channel_internal.cc",
+        "src/cpp/client/credentials.cc",
+        "src/cpp/client/generic_stub.cc",
+        "src/cpp/client/insecure_credentials.cc",
+        "src/cpp/common/call.cc",
+        "src/cpp/common/completion_queue.cc",
+        "src/cpp/common/rpc_method.cc",
+        "src/cpp/proto/proto_utils.cc",
+        "src/cpp/server/async_generic_service.cc",
+        "src/cpp/server/create_default_thread_pool.cc",
+        "src/cpp/server/dynamic_thread_pool.cc",
+        "src/cpp/server/fixed_size_thread_pool.cc",
+        "src/cpp/server/insecure_server_credentials.cc",
+        "src/cpp/server/server.cc",
+        "src/cpp/server/server_builder.cc",
+        "src/cpp/server/server_context.cc",
+        "src/cpp/server/server_credentials.cc",
+        "src/cpp/util/byte_buffer.cc",
+        "src/cpp/util/slice.cc",
+        "src/cpp/util/status.cc",
+        "src/cpp/util/string_ref.cc",
+        "src/cpp/util/time.cc"
+      ]
+    },
+    {
+      "name": "grpc_base",
+      "public_headers": [
+        "include/grpc/byte_buffer.h",
+        "include/grpc/byte_buffer_reader.h",
+        "include/grpc/compression.h",
+        "include/grpc/grpc.h",
+        "include/grpc/status.h"
+      ],
+      "headers": [
+        "src/core/census/grpc_filter.h",
+        "src/core/channel/channel_args.h",
+        "src/core/channel/channel_stack.h",
+        "src/core/channel/client_channel.h",
+        "src/core/channel/compress_filter.h",
+        "src/core/channel/connected_channel.h",
+        "src/core/channel/context.h",
+        "src/core/channel/http_client_filter.h",
+        "src/core/channel/http_server_filter.h",
+        "src/core/channel/noop_filter.h",
+        "src/core/client_config/client_config.h",
+        "src/core/client_config/connector.h",
+        "src/core/client_config/lb_policies/pick_first.h",
+        "src/core/client_config/lb_policy.h",
+        "src/core/client_config/resolver.h",
+        "src/core/client_config/resolver_factory.h",
+        "src/core/client_config/resolver_registry.h",
+        "src/core/client_config/resolvers/dns_resolver.h",
+        "src/core/client_config/resolvers/sockaddr_resolver.h",
+        "src/core/client_config/subchannel.h",
+        "src/core/client_config/subchannel_factory.h",
+        "src/core/client_config/subchannel_factory_decorators/add_channel_arg.h",
+        "src/core/client_config/subchannel_factory_decorators/merge_channel_args.h",
+        "src/core/client_config/uri_parser.h",
+        "src/core/compression/message_compress.h",
+        "src/core/debug/trace.h",
+        "src/core/httpcli/format_request.h",
+        "src/core/httpcli/httpcli.h",
+        "src/core/httpcli/parser.h",
+        "src/core/iomgr/alarm.h",
+        "src/core/iomgr/alarm_heap.h",
+        "src/core/iomgr/alarm_internal.h",
+        "src/core/iomgr/endpoint.h",
+        "src/core/iomgr/endpoint_pair.h",
+        "src/core/iomgr/fd_posix.h",
+        "src/core/iomgr/iocp_windows.h",
+        "src/core/iomgr/iomgr.h",
+        "src/core/iomgr/iomgr_internal.h",
+        "src/core/iomgr/iomgr_posix.h",
+        "src/core/iomgr/pollset.h",
+        "src/core/iomgr/pollset_posix.h",
+        "src/core/iomgr/pollset_set.h",
+        "src/core/iomgr/pollset_set_posix.h",
+        "src/core/iomgr/pollset_set_windows.h",
+        "src/core/iomgr/pollset_windows.h",
+        "src/core/iomgr/resolve_address.h",
+        "src/core/iomgr/sockaddr.h",
+        "src/core/iomgr/sockaddr_posix.h",
+        "src/core/iomgr/sockaddr_utils.h",
+        "src/core/iomgr/sockaddr_win32.h",
+        "src/core/iomgr/socket_utils_posix.h",
+        "src/core/iomgr/socket_windows.h",
+        "src/core/iomgr/tcp_client.h",
+        "src/core/iomgr/tcp_posix.h",
+        "src/core/iomgr/tcp_server.h",
+        "src/core/iomgr/tcp_windows.h",
+        "src/core/iomgr/time_averaged_stats.h",
+        "src/core/iomgr/udp_server.h",
+        "src/core/iomgr/wakeup_fd_pipe.h",
+        "src/core/iomgr/wakeup_fd_posix.h",
+        "src/core/json/json.h",
+        "src/core/json/json_common.h",
+        "src/core/json/json_reader.h",
+        "src/core/json/json_writer.h",
+        "src/core/profiling/timers.h",
+        "src/core/profiling/timers_preciseclock.h",
+        "src/core/statistics/census_interface.h",
+        "src/core/statistics/census_rpc_stats.h",
+        "src/core/surface/byte_buffer_queue.h",
+        "src/core/surface/call.h",
+        "src/core/surface/channel.h",
+        "src/core/surface/completion_queue.h",
+        "src/core/surface/event_string.h",
+        "src/core/surface/init.h",
+        "src/core/surface/server.h",
+        "src/core/surface/surface_trace.h",
+        "src/core/transport/chttp2/alpn.h",
+        "src/core/transport/chttp2/bin_encoder.h",
+        "src/core/transport/chttp2/frame.h",
+        "src/core/transport/chttp2/frame_data.h",
+        "src/core/transport/chttp2/frame_goaway.h",
+        "src/core/transport/chttp2/frame_ping.h",
+        "src/core/transport/chttp2/frame_rst_stream.h",
+        "src/core/transport/chttp2/frame_settings.h",
+        "src/core/transport/chttp2/frame_window_update.h",
+        "src/core/transport/chttp2/hpack_parser.h",
+        "src/core/transport/chttp2/hpack_table.h",
+        "src/core/transport/chttp2/http2_errors.h",
+        "src/core/transport/chttp2/huffsyms.h",
+        "src/core/transport/chttp2/incoming_metadata.h",
+        "src/core/transport/chttp2/internal.h",
+        "src/core/transport/chttp2/status_conversion.h",
+        "src/core/transport/chttp2/stream_encoder.h",
+        "src/core/transport/chttp2/stream_map.h",
+        "src/core/transport/chttp2/timeout_encoding.h",
+        "src/core/transport/chttp2/varint.h",
+        "src/core/transport/chttp2_transport.h",
+        "src/core/transport/connectivity_state.h",
+        "src/core/transport/metadata.h",
+        "src/core/transport/stream_op.h",
+        "src/core/transport/transport.h",
+        "src/core/transport/transport_impl.h"
+      ],
+      "src": [
+        "src/core/census/grpc_context.c",
+        "src/core/census/grpc_filter.c",
+        "src/core/channel/channel_args.c",
+        "src/core/channel/channel_stack.c",
+        "src/core/channel/client_channel.c",
+        "src/core/channel/compress_filter.c",
+        "src/core/channel/connected_channel.c",
+        "src/core/channel/http_client_filter.c",
+        "src/core/channel/http_server_filter.c",
+        "src/core/channel/noop_filter.c",
+        "src/core/client_config/client_config.c",
+        "src/core/client_config/connector.c",
+        "src/core/client_config/lb_policies/pick_first.c",
+        "src/core/client_config/lb_policy.c",
+        "src/core/client_config/resolver.c",
+        "src/core/client_config/resolver_factory.c",
+        "src/core/client_config/resolver_registry.c",
+        "src/core/client_config/resolvers/dns_resolver.c",
+        "src/core/client_config/resolvers/sockaddr_resolver.c",
+        "src/core/client_config/subchannel.c",
+        "src/core/client_config/subchannel_factory.c",
+        "src/core/client_config/subchannel_factory_decorators/add_channel_arg.c",
+        "src/core/client_config/subchannel_factory_decorators/merge_channel_args.c",
+        "src/core/client_config/uri_parser.c",
+        "src/core/compression/algorithm.c",
+        "src/core/compression/message_compress.c",
+        "src/core/debug/trace.c",
+        "src/core/httpcli/format_request.c",
+        "src/core/httpcli/httpcli.c",
+        "src/core/httpcli/parser.c",
+        "src/core/iomgr/alarm.c",
+        "src/core/iomgr/alarm_heap.c",
+        "src/core/iomgr/endpoint.c",
+        "src/core/iomgr/endpoint_pair_posix.c",
+        "src/core/iomgr/endpoint_pair_windows.c",
+        "src/core/iomgr/fd_posix.c",
+        "src/core/iomgr/iocp_windows.c",
+        "src/core/iomgr/iomgr.c",
+        "src/core/iomgr/iomgr_posix.c",
+        "src/core/iomgr/iomgr_windows.c",
+        "src/core/iomgr/pollset_multipoller_with_epoll.c",
+        "src/core/iomgr/pollset_multipoller_with_poll_posix.c",
+        "src/core/iomgr/pollset_posix.c",
+        "src/core/iomgr/pollset_set_posix.c",
+        "src/core/iomgr/pollset_set_windows.c",
+        "src/core/iomgr/pollset_windows.c",
+        "src/core/iomgr/resolve_address_posix.c",
+        "src/core/iomgr/resolve_address_windows.c",
+        "src/core/iomgr/sockaddr_utils.c",
+        "src/core/iomgr/socket_utils_common_posix.c",
+        "src/core/iomgr/socket_utils_linux.c",
+        "src/core/iomgr/socket_utils_posix.c",
+        "src/core/iomgr/socket_windows.c",
+        "src/core/iomgr/tcp_client_posix.c",
+        "src/core/iomgr/tcp_client_windows.c",
+        "src/core/iomgr/tcp_posix.c",
+        "src/core/iomgr/tcp_server_posix.c",
+        "src/core/iomgr/tcp_server_windows.c",
+        "src/core/iomgr/tcp_windows.c",
+        "src/core/iomgr/time_averaged_stats.c",
+        "src/core/iomgr/udp_server.c",
+        "src/core/iomgr/wakeup_fd_eventfd.c",
+        "src/core/iomgr/wakeup_fd_nospecial.c",
+        "src/core/iomgr/wakeup_fd_pipe.c",
+        "src/core/iomgr/wakeup_fd_posix.c",
+        "src/core/json/json.c",
+        "src/core/json/json_reader.c",
+        "src/core/json/json_string.c",
+        "src/core/json/json_writer.c",
+        "src/core/profiling/basic_timers.c",
+        "src/core/profiling/stap_timers.c",
+        "src/core/surface/api_trace.c",
+        "src/core/surface/byte_buffer.c",
+        "src/core/surface/byte_buffer_queue.c",
+        "src/core/surface/byte_buffer_reader.c",
+        "src/core/surface/call.c",
+        "src/core/surface/call_details.c",
+        "src/core/surface/call_log_batch.c",
+        "src/core/surface/channel.c",
+        "src/core/surface/channel_connectivity.c",
+        "src/core/surface/channel_create.c",
+        "src/core/surface/completion_queue.c",
+        "src/core/surface/event_string.c",
+        "src/core/surface/init.c",
+        "src/core/surface/lame_client.c",
+        "src/core/surface/metadata_array.c",
+        "src/core/surface/server.c",
+        "src/core/surface/server_chttp2.c",
+        "src/core/surface/server_create.c",
+        "src/core/surface/surface_trace.c",
+        "src/core/surface/version.c",
+        "src/core/transport/chttp2/alpn.c",
+        "src/core/transport/chttp2/bin_encoder.c",
+        "src/core/transport/chttp2/frame_data.c",
+        "src/core/transport/chttp2/frame_goaway.c",
+        "src/core/transport/chttp2/frame_ping.c",
+        "src/core/transport/chttp2/frame_rst_stream.c",
+        "src/core/transport/chttp2/frame_settings.c",
+        "src/core/transport/chttp2/frame_window_update.c",
+        "src/core/transport/chttp2/hpack_parser.c",
+        "src/core/transport/chttp2/hpack_table.c",
+        "src/core/transport/chttp2/huffsyms.c",
+        "src/core/transport/chttp2/incoming_metadata.c",
+        "src/core/transport/chttp2/parsing.c",
+        "src/core/transport/chttp2/status_conversion.c",
+        "src/core/transport/chttp2/stream_encoder.c",
+        "src/core/transport/chttp2/stream_lists.c",
+        "src/core/transport/chttp2/stream_map.c",
+        "src/core/transport/chttp2/timeout_encoding.c",
+        "src/core/transport/chttp2/varint.c",
+        "src/core/transport/chttp2/writing.c",
+        "src/core/transport/chttp2_transport.c",
+        "src/core/transport/connectivity_state.c",
+        "src/core/transport/metadata.c",
+        "src/core/transport/stream_op.c",
+        "src/core/transport/transport.c",
+        "src/core/transport/transport_op_string.c"
+      ]
+    },
+    {
+      "name": "grpc_test_util_base",
+      "headers": [
+        "test/core/end2end/cq_verifier.h",
+        "test/core/end2end/fixtures/proxy.h",
+        "test/core/iomgr/endpoint_tests.h",
+        "test/core/security/oauth2_utils.h",
+        "test/core/util/grpc_profiler.h",
+        "test/core/util/parse_hexstring.h",
+        "test/core/util/port.h",
+        "test/core/util/slice_splitter.h"
+      ],
+      "src": [
+        "test/core/end2end/cq_verifier.c",
+        "test/core/end2end/fixtures/proxy.c",
+        "test/core/iomgr/endpoint_tests.c",
+        "test/core/security/oauth2_utils.c",
+        "test/core/util/grpc_profiler.c",
+        "test/core/util/parse_hexstring.c",
+        "test/core/util/port_posix.c",
+        "test/core/util/port_windows.c",
+        "test/core/util/slice_splitter.c"
+      ]
+    }
+  ],
+  "libs": [
+    {
+      "name": "gpr",
+      "build": "all",
+      "language": "c",
+      "public_headers": [
+        "include/grpc/support/alloc.h",
+        "include/grpc/support/atm.h",
+        "include/grpc/support/atm_gcc_atomic.h",
+        "include/grpc/support/atm_gcc_sync.h",
+        "include/grpc/support/atm_win32.h",
+        "include/grpc/support/cmdline.h",
+        "include/grpc/support/cpu.h",
+        "include/grpc/support/histogram.h",
+        "include/grpc/support/host_port.h",
+        "include/grpc/support/log.h",
+        "include/grpc/support/log_win32.h",
+        "include/grpc/support/port_platform.h",
+        "include/grpc/support/slice.h",
+        "include/grpc/support/slice_buffer.h",
+        "include/grpc/support/string_util.h",
+        "include/grpc/support/subprocess.h",
+        "include/grpc/support/sync.h",
+        "include/grpc/support/sync_generic.h",
+        "include/grpc/support/sync_posix.h",
+        "include/grpc/support/sync_win32.h",
+        "include/grpc/support/thd.h",
+        "include/grpc/support/time.h",
+        "include/grpc/support/tls.h",
+        "include/grpc/support/tls_gcc.h",
+        "include/grpc/support/tls_msvc.h",
+        "include/grpc/support/tls_pthread.h",
+        "include/grpc/support/useful.h"
+      ],
+      "headers": [
+        "src/core/support/env.h",
+        "src/core/support/file.h",
+        "src/core/support/murmur_hash.h",
+        "src/core/support/stack_lockfree.h",
+        "src/core/support/string.h",
+        "src/core/support/string_win32.h",
+        "src/core/support/thd_internal.h"
+      ],
+      "src": [
+        "src/core/support/alloc.c",
+        "src/core/support/cmdline.c",
+        "src/core/support/cpu_iphone.c",
+        "src/core/support/cpu_linux.c",
+        "src/core/support/cpu_posix.c",
+        "src/core/support/cpu_windows.c",
+        "src/core/support/env_linux.c",
+        "src/core/support/env_posix.c",
+        "src/core/support/env_win32.c",
+        "src/core/support/file.c",
+        "src/core/support/file_posix.c",
+        "src/core/support/file_win32.c",
+        "src/core/support/histogram.c",
+        "src/core/support/host_port.c",
+        "src/core/support/log.c",
+        "src/core/support/log_android.c",
+        "src/core/support/log_linux.c",
+        "src/core/support/log_posix.c",
+        "src/core/support/log_win32.c",
+        "src/core/support/murmur_hash.c",
+        "src/core/support/slice.c",
+        "src/core/support/slice_buffer.c",
+        "src/core/support/stack_lockfree.c",
+        "src/core/support/string.c",
+        "src/core/support/string_posix.c",
+        "src/core/support/string_win32.c",
+        "src/core/support/subprocess_posix.c",
+        "src/core/support/sync.c",
+        "src/core/support/sync_posix.c",
+        "src/core/support/sync_win32.c",
+        "src/core/support/thd.c",
+        "src/core/support/thd_posix.c",
+        "src/core/support/thd_win32.c",
+        "src/core/support/time.c",
+        "src/core/support/time_posix.c",
+        "src/core/support/time_win32.c",
+        "src/core/support/tls_pthread.c"
+      ],
+      "secure": "no",
+      "vs_project_guid": "{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}"
+    },
+    {
+      "name": "gpr_test_util",
+      "build": "private",
+      "language": "c",
+      "headers": [
+        "test/core/util/test_config.h"
+      ],
+      "src": [
+        "test/core/util/test_config.c"
+      ],
+      "deps": [
+        "gpr"
+      ],
+      "secure": "no",
+      "vs_project_guid": "{EAB0A629-17A9-44DB-B5FF-E91A721FE037}"
+    },
+    {
+      "name": "grpc",
+      "build": "all",
+      "language": "c",
+      "public_headers": [
+        "include/grpc/grpc_security.h"
+      ],
+      "headers": [
+        "src/core/security/auth_filters.h",
+        "src/core/security/base64.h",
+        "src/core/security/credentials.h",
+        "src/core/security/json_token.h",
+        "src/core/security/jwt_verifier.h",
+        "src/core/security/secure_endpoint.h",
+        "src/core/security/secure_transport_setup.h",
+        "src/core/security/security_connector.h",
+        "src/core/security/security_context.h",
+        "src/core/tsi/fake_transport_security.h",
+        "src/core/tsi/ssl_transport_security.h",
+        "src/core/tsi/transport_security.h",
+        "src/core/tsi/transport_security_interface.h"
+      ],
+      "src": [
+        "src/core/httpcli/httpcli_security_connector.c",
+        "src/core/security/base64.c",
+        "src/core/security/client_auth_filter.c",
+        "src/core/security/credentials.c",
+        "src/core/security/credentials_metadata.c",
+        "src/core/security/credentials_posix.c",
+        "src/core/security/credentials_win32.c",
+        "src/core/security/google_default_credentials.c",
+        "src/core/security/json_token.c",
+        "src/core/security/jwt_verifier.c",
+        "src/core/security/secure_endpoint.c",
+        "src/core/security/secure_transport_setup.c",
+        "src/core/security/security_connector.c",
+        "src/core/security/security_context.c",
+        "src/core/security/server_auth_filter.c",
+        "src/core/security/server_secure_chttp2.c",
+        "src/core/surface/init_secure.c",
+        "src/core/surface/secure_channel_create.c",
+        "src/core/tsi/fake_transport_security.c",
+        "src/core/tsi/ssl_transport_security.c",
+        "src/core/tsi/transport_security.c"
+      ],
+      "deps": [
+        "gpr"
+      ],
+      "baselib": true,
+      "dll": "yes",
+      "filegroups": [
+        "grpc_base",
+        "census"
+      ],
+      "secure": "yes",
+      "vs_project_guid": "{29D16885-7228-4C31-81ED-5F9187C7F2A9}"
+    },
+    {
+      "name": "grpc_test_util",
+      "build": "private",
+      "language": "c",
+      "headers": [
+        "test/core/end2end/data/ssl_test_data.h"
+      ],
+      "src": [
+        "test/core/end2end/data/server1_cert.c",
+        "test/core/end2end/data/server1_key.c",
+        "test/core/end2end/data/test_root_cert.c"
+      ],
+      "deps": [
+        "gpr",
+        "gpr_test_util",
+        "grpc"
+      ],
+      "filegroups": [
+        "grpc_test_util_base"
+      ],
+      "vs_project_guid": "{17BCAFC0-5FDC-4C94-AEB9-95F3E220614B}"
+    },
+    {
+      "name": "grpc_test_util_unsecure",
+      "build": "private",
+      "language": "c",
+      "deps": [
+        "gpr",
+        "gpr_test_util",
+        "grpc"
+      ],
+      "filegroups": [
+        "grpc_test_util_base"
+      ],
+      "secure": "no",
+      "vs_project_guid": "{0A7E7F92-FDEA-40F1-A9EC-3BA484F98BBF}"
+    },
+    {
+      "name": "grpc_unsecure",
+      "build": "all",
+      "language": "c",
+      "src": [
+        "src/core/surface/init_unsecure.c"
+      ],
+      "deps": [
+        "gpr"
+      ],
+      "baselib": true,
+      "dll": "yes",
+      "filegroups": [
+        "grpc_base",
+        "census"
+      ],
+      "secure": "no",
+      "vs_project_guid": "{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}"
+    },
+    {
+      "name": "grpc_zookeeper",
+      "build": "all",
+      "language": "c",
+      "public_headers": [
+        "include/grpc/grpc_zookeeper.h"
+      ],
+      "headers": [
+        "src/core/client_config/resolvers/zookeeper_resolver.h"
+      ],
+      "src": [
+        "src/core/client_config/resolvers/zookeeper_resolver.c"
+      ],
+      "deps": [
+        "gpr",
+        "grpc"
+      ],
+      "external_deps": [
+        "zookeeper"
+      ],
+      "secure": "no"
+    },
+    {
+      "name": "reconnect_server",
+      "build": "private",
+      "language": "c",
+      "headers": [
+        "test/core/util/reconnect_server.h"
+      ],
+      "src": [
+        "test/core/util/reconnect_server.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc++",
+      "build": "all",
+      "language": "c++",
+      "headers": [
+        "src/cpp/client/secure_credentials.h",
+        "src/cpp/common/secure_auth_context.h",
+        "src/cpp/server/secure_server_credentials.h"
+      ],
+      "src": [
+        "src/cpp/client/secure_channel_arguments.cc",
+        "src/cpp/client/secure_credentials.cc",
+        "src/cpp/common/auth_property_iterator.cc",
+        "src/cpp/common/secure_auth_context.cc",
+        "src/cpp/common/secure_create_auth_context.cc",
+        "src/cpp/server/secure_server_credentials.cc"
+      ],
+      "deps": [
+        "gpr",
+        "grpc"
+      ],
+      "baselib": true,
+      "dll": "yes",
+      "filegroups": [
+        "grpc++_base"
+      ],
+      "secure": "check",
+      "vs_project_guid": "{C187A093-A0FE-489D-A40A-6E33DE0F9FEB}"
+    },
+    {
+      "name": "grpc++_test_config",
+      "build": "private",
+      "language": "c++",
+      "headers": [
+        "test/cpp/util/test_config.h"
+      ],
+      "src": [
+        "test/cpp/util/test_config.cc"
+      ]
+    },
+    {
+      "name": "grpc++_test_util",
+      "build": "private",
+      "language": "c++",
+      "headers": [
+        "test/cpp/util/cli_call.h",
+        "test/cpp/util/create_test_channel.h",
+        "test/cpp/util/subprocess.h"
+      ],
+      "src": [
+        "test/cpp/util/messages.proto",
+        "test/cpp/util/echo.proto",
+        "test/cpp/util/echo_duplicate.proto",
+        "test/cpp/util/cli_call.cc",
+        "test/cpp/util/create_test_channel.cc",
+        "test/cpp/util/subprocess.cc"
+      ],
+      "deps": [
+        "grpc++",
+        "grpc_test_util"
+      ]
+    },
+    {
+      "name": "grpc++_unsecure",
+      "build": "all",
+      "language": "c++",
+      "src": [
+        "src/cpp/common/insecure_create_auth_context.cc"
+      ],
+      "deps": [
+        "gpr",
+        "grpc_unsecure"
+      ],
+      "baselib": true,
+      "dll": "yes",
+      "filegroups": [
+        "grpc++_base"
+      ],
+      "secure": "no",
+      "vs_project_guid": "{6EE56155-DF7C-4F6E-BFC4-F6F776BEB211}"
+    },
+    {
+      "name": "grpc_plugin_support",
+      "build": "protoc",
+      "language": "c++",
+      "headers": [
+        "include/grpc++/support/config.h",
+        "include/grpc++/support/config_protobuf.h",
+        "src/compiler/config.h",
+        "src/compiler/cpp_generator.h",
+        "src/compiler/cpp_generator_helpers.h",
+        "src/compiler/csharp_generator.h",
+        "src/compiler/csharp_generator_helpers.h",
+        "src/compiler/generator_helpers.h",
+        "src/compiler/objective_c_generator.h",
+        "src/compiler/objective_c_generator_helpers.h",
+        "src/compiler/python_generator.h",
+        "src/compiler/ruby_generator.h",
+        "src/compiler/ruby_generator_helpers-inl.h",
+        "src/compiler/ruby_generator_map-inl.h",
+        "src/compiler/ruby_generator_string-inl.h"
+      ],
+      "src": [
+        "src/compiler/cpp_generator.cc",
+        "src/compiler/csharp_generator.cc",
+        "src/compiler/objective_c_generator.cc",
+        "src/compiler/python_generator.cc",
+        "src/compiler/ruby_generator.cc"
+      ],
+      "deps": [],
+      "secure": "no",
+      "vs_project_guid": "{B6E81D84-2ACB-41B8-8781-493A944C7817}"
+    },
+    {
+      "name": "interop_client_helper",
+      "build": "private",
+      "language": "c++",
+      "headers": [
+        "test/cpp/interop/client_helper.h"
+      ],
+      "src": [
+        "test/proto/messages.proto",
+        "test/cpp/interop/client_helper.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr"
+      ]
+    },
+    {
+      "name": "interop_client_main",
+      "build": "private",
+      "language": "c++",
+      "headers": [
+        "test/cpp/interop/interop_client.h"
+      ],
+      "src": [
+        "test/proto/empty.proto",
+        "test/proto/messages.proto",
+        "test/proto/test.proto",
+        "test/cpp/interop/client.cc",
+        "test/cpp/interop/interop_client.cc"
+      ],
+      "deps": [
+        "interop_client_helper",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ]
+    },
+    {
+      "name": "interop_server_helper",
+      "build": "private",
+      "language": "c++",
+      "headers": [
+        "test/cpp/interop/server_helper.h"
+      ],
+      "src": [
+        "test/cpp/interop/server_helper.cc"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr"
+      ]
+    },
+    {
+      "name": "interop_server_main",
+      "build": "private",
+      "language": "c++",
+      "src": [
+        "test/proto/empty.proto",
+        "test/proto/messages.proto",
+        "test/proto/test.proto",
+        "test/cpp/interop/server.cc"
+      ],
+      "deps": [
+        "interop_server_helper",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ]
+    },
+    {
+      "name": "pubsub_client_lib",
+      "build": "do_not_build",
+      "language": "c++",
+      "headers": [
+        "examples/pubsub/publisher.h",
+        "examples/pubsub/subscriber.h"
+      ],
+      "src": [
+        "examples/pubsub/label.proto",
+        "examples/pubsub/empty.proto",
+        "examples/pubsub/pubsub.proto",
+        "examples/pubsub/publisher.cc",
+        "examples/pubsub/subscriber.cc"
+      ],
+      "deps": [
+        "grpc++",
+        "grpc",
+        "gpr"
+      ]
+    },
+    {
+      "name": "qps",
+      "build": "private",
+      "language": "c++",
+      "headers": [
+        "test/cpp/qps/client.h",
+        "test/cpp/qps/driver.h",
+        "test/cpp/qps/histogram.h",
+        "test/cpp/qps/interarrival.h",
+        "test/cpp/qps/perf_db_client.h",
+        "test/cpp/qps/qps_worker.h",
+        "test/cpp/qps/report.h",
+        "test/cpp/qps/server.h",
+        "test/cpp/qps/stats.h",
+        "test/cpp/qps/timer.h",
+        "test/cpp/util/benchmark_config.h"
+      ],
+      "src": [
+        "test/cpp/qps/qpstest.proto",
+        "test/cpp/qps/perf_db.proto",
+        "test/cpp/qps/client_async.cc",
+        "test/cpp/qps/client_sync.cc",
+        "test/cpp/qps/driver.cc",
+        "test/cpp/qps/perf_db_client.cc",
+        "test/cpp/qps/qps_worker.cc",
+        "test/cpp/qps/report.cc",
+        "test/cpp/qps/server_async.cc",
+        "test/cpp/qps/server_sync.cc",
+        "test/cpp/qps/timer.cc",
+        "test/cpp/util/benchmark_config.cc"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc++_test_util",
+        "grpc++"
+      ]
+    },
+    {
+      "name": "grpc_csharp_ext",
+      "build": "all",
+      "language": "csharp",
+      "src": [
+        "src/csharp/ext/grpc_csharp_ext.c"
+      ],
+      "deps": [
+        "gpr",
+        "grpc"
+      ],
+      "dll": "only",
+      "vs_project_guid": "{D64C6D63-4458-4A88-AB38-35678384A7E4}"
+    }
+  ],
+  "targets": [
+    {
+      "name": "alarm_heap_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/alarm_heap_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "alarm_list_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/alarm_list_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "alarm_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/alarm_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "alpn_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/transport/chttp2/alpn_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "bin_encoder_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/transport/chttp2/bin_encoder_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "chttp2_status_conversion_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/transport/chttp2/status_conversion_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "chttp2_stream_encoder_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/transport/chttp2/stream_encoder_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "chttp2_stream_map_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/transport/chttp2/stream_map_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "compression_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/compression/compression_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "dualstack_socket_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/end2end/dualstack_socket_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "fd_conservation_posix_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/fd_conservation_posix_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "fd_posix_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/fd_posix_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "fling_client",
+      "build": "test",
+      "run": false,
+      "language": "c",
+      "src": [
+        "test/core/fling/client.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "fling_server",
+      "build": "test",
+      "run": false,
+      "language": "c",
+      "src": [
+        "test/core/fling/server.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "fling_stream_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/fling/fling_stream_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "fling_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/fling/fling_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "gen_hpack_tables",
+      "build": "tool",
+      "language": "c",
+      "src": [
+        "tools/codegen/core/gen_hpack_tables.c"
+      ],
+      "deps": [
+        "gpr",
+        "grpc"
+      ]
+    },
+    {
+      "name": "gpr_cmdline_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/cmdline_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_env_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/env_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_file_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/file_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_histogram_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/histogram_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_host_port_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/host_port_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_log_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/log_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_slice_buffer_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/slice_buffer_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_slice_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/slice_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_stack_lockfree_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/stack_lockfree_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_string_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/string_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_sync_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/sync_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_thd_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/thd_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_time_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/time_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_tls_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/tls_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "gpr_useful_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/useful_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_auth_context_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/security/auth_context_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_base64_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/security/base64_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_byte_buffer_reader_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/surface/byte_buffer_reader_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_channel_args_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/channel/channel_args_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_channel_stack_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/channel/channel_stack_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_completion_queue_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/surface/completion_queue_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_create_jwt",
+      "build": "tool",
+      "language": "c",
+      "src": [
+        "test/core/security/create_jwt.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_credentials_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/security/credentials_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_fetch_oauth2",
+      "build": "tool",
+      "language": "c",
+      "src": [
+        "test/core/security/fetch_oauth2.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_json_token_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/security/json_token_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_jwt_verifier_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/security/jwt_verifier_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_print_google_default_creds_token",
+      "build": "tool",
+      "language": "c",
+      "src": [
+        "test/core/security/print_google_default_creds_token.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_security_connector_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/security/security_connector_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_stream_op_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/transport/stream_op_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_verify_jwt",
+      "build": "tool",
+      "language": "c",
+      "src": [
+        "test/core/security/verify_jwt.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "hpack_parser_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/transport/chttp2/hpack_parser_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "hpack_table_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/transport/chttp2/hpack_table_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "httpcli_format_request_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/httpcli/format_request_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "httpcli_parser_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/httpcli/parser_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "httpcli_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/httpcli/httpcli_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "json_rewrite",
+      "build": "test",
+      "run": false,
+      "language": "c",
+      "src": [
+        "test/core/json/json_rewrite.c"
+      ],
+      "deps": [
+        "grpc",
+        "gpr"
+      ]
+    },
+    {
+      "name": "json_rewrite_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/json/json_rewrite_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "json_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/json/json_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "lame_client_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/surface/lame_client_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "low_level_ping_pong_benchmark",
+      "build": "benchmark",
+      "language": "c",
+      "src": [
+        "test/core/network_benchmarks/low_level_ping_pong.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "message_compress_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/compression/message_compress_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "multi_init_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/surface/multi_init_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "multiple_server_queues_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/end2end/multiple_server_queues_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "murmur_hash_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/support/murmur_hash_test.c"
+      ],
+      "deps": [
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "no_server_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/end2end/no_server_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "resolve_address_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/resolve_address_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "secure_endpoint_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/security/secure_endpoint_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "sockaddr_utils_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/sockaddr_utils_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "tcp_client_posix_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/tcp_client_posix_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "tcp_posix_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/tcp_posix_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "tcp_server_posix_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/tcp_server_posix_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "time_averaged_stats_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/time_averaged_stats_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "timeout_encoding_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/transport/chttp2/timeout_encoding_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "timers_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/profiling/timers_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "transport_metadata_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/transport/metadata_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "transport_security_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/tsi/transport_security_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "udp_server_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/iomgr/udp_server_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "posix"
+      ]
+    },
+    {
+      "name": "uri_parser_test",
+      "build": "test",
+      "language": "c",
+      "src": [
+        "test/core/client_config/uri_parser_test.c"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "async_end2end_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/end2end/async_end2end_test.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "async_streaming_ping_pong_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/qps/async_streaming_ping_pong_test.cc"
+      ],
+      "deps": [
+        "qps",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "async_unary_ping_pong_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/qps/async_unary_ping_pong_test.cc"
+      ],
+      "deps": [
+        "qps",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "auth_property_iterator_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/common/auth_property_iterator_test.cc"
+      ],
+      "deps": [
+        "grpc++",
+        "grpc",
+        "gpr"
+      ]
+    },
+    {
+      "name": "channel_arguments_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/client/channel_arguments_test.cc"
+      ],
+      "deps": [
+        "grpc++",
+        "grpc",
+        "gpr"
+      ]
+    },
+    {
+      "name": "cli_call_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/util/cli_call_test.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "client_crash_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/end2end/client_crash_test.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "client_crash_test_server",
+      "build": "test",
+      "run": false,
+      "language": "c++",
+      "src": [
+        "test/cpp/end2end/client_crash_test_server.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "credentials_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/client/credentials_test.cc"
+      ],
+      "deps": [
+        "grpc++",
+        "grpc",
+        "gpr"
+      ]
+    },
+    {
+      "name": "cxx_byte_buffer_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/util/byte_buffer_test.cc"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "cxx_slice_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/util/slice_test.cc"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "cxx_string_ref_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/util/string_ref_test.cc"
+      ],
+      "deps": [
+        "grpc++"
+      ]
+    },
+    {
+      "name": "cxx_time_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/util/time_test.cc"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "end2end_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/end2end/end2end_test.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "generic_end2end_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/end2end/generic_end2end_test.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "grpc_cli",
+      "build": "test",
+      "run": false,
+      "language": "c++",
+      "src": [
+        "test/cpp/util/grpc_cli.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ]
+    },
+    {
+      "name": "grpc_cpp_plugin",
+      "build": "protoc",
+      "language": "c++",
+      "src": [
+        "src/compiler/cpp_plugin.cc"
+      ],
+      "deps": [
+        "grpc_plugin_support"
+      ],
+      "secure": "no",
+      "vs_project_guid": "{7E51A25F-AC59-488F-906C-C60FAAE706AA}"
+    },
+    {
+      "name": "grpc_csharp_plugin",
+      "build": "protoc",
+      "language": "c++",
+      "src": [
+        "src/compiler/csharp_plugin.cc"
+      ],
+      "deps": [
+        "grpc_plugin_support"
+      ],
+      "secure": "no",
+      "vs_project_guid": "{3C813052-A49A-4662-B90A-1ADBEC7EE453}"
+    },
+    {
+      "name": "grpc_objective_c_plugin",
+      "build": "protoc",
+      "language": "c++",
+      "src": [
+        "src/compiler/objective_c_plugin.cc"
+      ],
+      "deps": [
+        "grpc_plugin_support"
+      ],
+      "secure": "no",
+      "vs_project_guid": "{19564640-CEE6-4921-ABA5-676ED79A36F6}"
+    },
+    {
+      "name": "grpc_python_plugin",
+      "build": "protoc",
+      "language": "c++",
+      "src": [
+        "src/compiler/python_plugin.cc"
+      ],
+      "deps": [
+        "grpc_plugin_support"
+      ],
+      "secure": "no",
+      "vs_project_guid": "{DF52D501-A6CF-4E6F-BA38-6EBE2E8DAFB2}"
+    },
+    {
+      "name": "grpc_ruby_plugin",
+      "build": "protoc",
+      "language": "c++",
+      "src": [
+        "src/compiler/ruby_plugin.cc"
+      ],
+      "deps": [
+        "grpc_plugin_support"
+      ],
+      "secure": "no",
+      "vs_project_guid": "{069E9D05-B78B-4751-9252-D21EBAE7DE8E}"
+    },
+    {
+      "name": "interop_client",
+      "build": "test",
+      "run": false,
+      "language": "c++",
+      "src": [],
+      "deps": [
+        "interop_client_main",
+        "interop_client_helper",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "interop_server",
+      "build": "test",
+      "run": false,
+      "language": "c++",
+      "src": [],
+      "deps": [
+        "interop_server_main",
+        "interop_server_helper",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "interop_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/interop/interop_test.cc"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "mock_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/end2end/mock_test.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "pubsub_client",
+      "build": "do_not_build",
+      "run": false,
+      "language": "c++",
+      "src": [
+        "examples/pubsub/main.cc"
+      ],
+      "deps": [
+        "pubsub_client_lib",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ]
+    },
+    {
+      "name": "pubsub_publisher_test",
+      "build": "do_not_build",
+      "language": "c++",
+      "src": [
+        "examples/pubsub/publisher_test.cc"
+      ],
+      "deps": [
+        "pubsub_client_lib",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "pubsub_subscriber_test",
+      "build": "do_not_build",
+      "language": "c++",
+      "src": [
+        "examples/pubsub/subscriber_test.cc"
+      ],
+      "deps": [
+        "pubsub_client_lib",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "qps_driver",
+      "build": "benchmark",
+      "language": "c++",
+      "src": [
+        "test/cpp/qps/qps_driver.cc"
+      ],
+      "deps": [
+        "qps",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ]
+    },
+    {
+      "name": "qps_interarrival_test",
+      "build": "test",
+      "run": false,
+      "language": "c++",
+      "src": [
+        "test/cpp/qps/qps_interarrival_test.cc"
+      ],
+      "deps": [
+        "qps",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "qps_openloop_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/qps/qps_openloop_test.cc"
+      ],
+      "deps": [
+        "qps",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "qps_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/qps/qps_test.cc"
+      ],
+      "deps": [
+        "qps",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ],
+      "exclude_configs": [
+        "tsan"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "qps_worker",
+      "build": "benchmark",
+      "language": "c++",
+      "headers": [
+        "test/cpp/qps/client.h",
+        "test/cpp/qps/server.h"
+      ],
+      "src": [
+        "test/cpp/qps/worker.cc"
+      ],
+      "deps": [
+        "qps",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ]
+    },
+    {
+      "name": "reconnect_interop_client",
+      "build": "test",
+      "run": false,
+      "language": "c++",
+      "src": [
+        "test/proto/empty.proto",
+        "test/proto/messages.proto",
+        "test/proto/test.proto",
+        "test/cpp/interop/reconnect_interop_client.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ]
+    },
+    {
+      "name": "reconnect_interop_server",
+      "build": "test",
+      "run": false,
+      "language": "c++",
+      "src": [
+        "test/proto/empty.proto",
+        "test/proto/messages.proto",
+        "test/proto/test.proto",
+        "test/cpp/interop/reconnect_interop_server.cc"
+      ],
+      "deps": [
+        "reconnect_server",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr",
+        "grpc++_test_config"
+      ]
+    },
+    {
+      "name": "secure_auth_context_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/common/secure_auth_context_test.cc"
+      ],
+      "deps": [
+        "grpc++",
+        "grpc",
+        "gpr"
+      ]
+    },
+    {
+      "name": "server_crash_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/end2end/server_crash_test.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "server_crash_test_client",
+      "build": "test",
+      "run": false,
+      "language": "c++",
+      "src": [
+        "test/cpp/end2end/server_crash_test_client.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "shutdown_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/end2end/shutdown_test.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "status_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/util/status_test.cc"
+      ],
+      "deps": [
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "sync_streaming_ping_pong_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/qps/sync_streaming_ping_pong_test.cc"
+      ],
+      "deps": [
+        "qps",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "sync_unary_ping_pong_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/qps/sync_unary_ping_pong_test.cc"
+      ],
+      "deps": [
+        "qps",
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "platforms": [
+        "mac",
+        "linux",
+        "posix"
+      ]
+    },
+    {
+      "name": "thread_stress_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/end2end/thread_stress_test.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ]
+    },
+    {
+      "name": "zookeeper_test",
+      "build": "test",
+      "language": "c++",
+      "src": [
+        "test/cpp/end2end/zookeeper_test.cc"
+      ],
+      "deps": [
+        "grpc++_test_util",
+        "grpc_test_util",
+        "grpc++",
+        "grpc_zookeeper",
+        "grpc",
+        "gpr_test_util",
+        "gpr"
+      ],
+      "external_deps": [
+        "zookeeper"
+      ]
+    }
+  ]
+}
diff --git a/src/core/census/grpc_context.c b/src/core/census/grpc_context.c
index 429f3ec9db05008e3294cdd3f6d4c301ee67bcc0..4b61382a2c2fd0abbda851379fa9c5ceff12b96d 100644
--- a/src/core/census/grpc_context.c
+++ b/src/core/census/grpc_context.c
@@ -33,9 +33,12 @@
 
 #include <grpc/census.h>
 #include <grpc/grpc.h>
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/call.h"
 
 void grpc_census_call_set_context(grpc_call *call, census_context *context) {
+  GRPC_API_TRACE("grpc_census_call_set_context(call=%p, census_context=%p)", 2,
+                 (call, context));
   if (census_enabled() == CENSUS_FEATURE_NONE) {
     return;
   }
@@ -45,5 +48,6 @@ void grpc_census_call_set_context(grpc_call *call, census_context *context) {
 }
 
 census_context *grpc_census_call_get_context(grpc_call *call) {
+  GRPC_API_TRACE("grpc_census_call_get_context(call=%p)", 1, (call));
   return (census_context *)grpc_call_context_get(call, GRPC_CONTEXT_TRACING);
 }
diff --git a/src/core/client_config/resolvers/zookeeper_resolver.c b/src/core/client_config/resolvers/zookeeper_resolver.c
index f640a0084adcf6495e91d031475f40056ba906ee..136197d4c64b46053be8e6c3326cf8b103f2f275 100644
--- a/src/core/client_config/resolvers/zookeeper_resolver.c
+++ b/src/core/client_config/resolvers/zookeeper_resolver.c
@@ -45,6 +45,7 @@
 #include "src/core/client_config/resolver_registry.h"
 #include "src/core/iomgr/resolve_address.h"
 #include "src/core/support/string.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/json/json.h"
 
 /** Zookeeper session expiration time in milliseconds */
@@ -487,6 +488,7 @@ static void zookeeper_plugin_init() {
 }
 
 void grpc_zookeeper_register() {
+  GRPC_API_TRACE("grpc_zookeeper_register(void)", 0, ());
   grpc_register_plugin(zookeeper_plugin_init, NULL);
 }
 
diff --git a/src/core/compression/algorithm.c b/src/core/compression/algorithm.c
index 8adde13b1ec30255a648fe9f6107fe7729e79b95..ad7bb8c8133552364b8f29e31a3353ad7293332d 100644
--- a/src/core/compression/algorithm.c
+++ b/src/core/compression/algorithm.c
@@ -37,12 +37,19 @@
 #include <grpc/compression.h>
 #include <grpc/support/useful.h>
 
+#include "src/core/surface/api_trace.h"
+
 int grpc_compression_algorithm_parse(const char *name, size_t name_length,
                                      grpc_compression_algorithm *algorithm) {
   /* we use strncmp not only because it's safer (even though in this case it
    * doesn't matter, given that we are comparing against string literals, but
    * because this way we needn't have "name" nil-terminated (useful for slice
    * data, for example) */
+  GRPC_API_TRACE(
+      "grpc_compression_algorithm_parse("
+        "name=%*.*s, name_length=%lu, algorithm=%p)", 5,
+        ((int)name_length, (int)name_length, name,
+         (unsigned long)name_length, algorithm));
   if (name_length == 0) {
     return 0;
   }
@@ -60,6 +67,8 @@ int grpc_compression_algorithm_parse(const char *name, size_t name_length,
 
 int grpc_compression_algorithm_name(grpc_compression_algorithm algorithm,
                                     char **name) {
+  GRPC_API_TRACE("grpc_compression_algorithm_parse(algorithm=%d, name=%p)", 2,
+                 ((int)algorithm, name));
   switch (algorithm) {
     case GRPC_COMPRESS_NONE:
       *name = "identity";
@@ -80,6 +89,8 @@ int grpc_compression_algorithm_name(grpc_compression_algorithm algorithm,
  * compression algorithms */
 grpc_compression_algorithm grpc_compression_algorithm_for_level(
     grpc_compression_level level) {
+  GRPC_API_TRACE("grpc_compression_algorithm_for_level(level=%d)", 1,
+                 ((int)level));
   switch (level) {
     case GRPC_COMPRESS_LEVEL_NONE:
       return GRPC_COMPRESS_NONE;
@@ -96,6 +107,8 @@ grpc_compression_algorithm grpc_compression_algorithm_for_level(
 grpc_compression_level grpc_compression_level_for_algorithm(
     grpc_compression_algorithm algorithm) {
   grpc_compression_level clevel;
+  GRPC_API_TRACE("grpc_compression_level_for_algorithm(algorithm=%d)", 1,
+                 ((int)algorithm));
   for (clevel = GRPC_COMPRESS_LEVEL_NONE; clevel < GRPC_COMPRESS_LEVEL_COUNT;
        ++clevel) {
     if (grpc_compression_algorithm_for_level(clevel) == algorithm) {
diff --git a/src/core/security/credentials.c b/src/core/security/credentials.c
index bdd9ab8e9caafe248e731aef9f6559d36b2ee3e6..ff67b5d30a8cd0f9d27ffec6072b0755795080b4 100644
--- a/src/core/security/credentials.c
+++ b/src/core/security/credentials.c
@@ -41,6 +41,7 @@
 #include "src/core/json/json.h"
 #include "src/core/httpcli/httpcli.h"
 #include "src/core/iomgr/iomgr.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/support/string.h"
 
 #include <grpc/support/alloc.h>
@@ -91,6 +92,7 @@ void grpc_credentials_unref(grpc_credentials *creds) {
 }
 
 void grpc_credentials_release(grpc_credentials *creds) {
+  GRPC_API_TRACE("grpc_credentials_release(creds=%p)", 1, (creds));
   grpc_credentials_unref(creds);
 }
 
@@ -152,6 +154,7 @@ void grpc_server_credentials_unref(grpc_server_credentials *creds) {
 }
 
 void grpc_server_credentials_release(grpc_server_credentials *creds) {
+  GRPC_API_TRACE("grpc_server_credentials_release(creds=%p)", 1, (creds));
   grpc_server_credentials_unref(creds);
 }
 
@@ -166,6 +169,11 @@ grpc_security_status grpc_server_credentials_create_security_connector(
 
 void grpc_server_credentials_set_auth_metadata_processor(
     grpc_server_credentials *creds, grpc_auth_metadata_processor processor) {
+  GRPC_API_TRACE(
+      "grpc_server_credentials_set_auth_metadata_processor("
+        "creds=%p, "
+        "processor=grpc_auth_metadata_processor { process: %lx, state: %p })",
+      3, (creds, (unsigned long)processor.process, processor.state));
   if (creds == NULL) return;
   if (creds->processor.destroy != NULL && creds->processor.state != NULL) {
     creds->processor.destroy(creds->processor.state);
@@ -317,6 +325,10 @@ grpc_credentials *grpc_ssl_credentials_create(
     const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pair,
     void *reserved) {
   grpc_ssl_credentials *c = gpr_malloc(sizeof(grpc_ssl_credentials));
+  GRPC_API_TRACE("grpc_ssl_credentials_create(pem_root_certs=%s, "
+                                             "pem_key_cert_pair=%p, "
+                                             "reserved=%p)",
+                 3, (pem_root_certs, pem_key_cert_pair, reserved));
   GPR_ASSERT(reserved == NULL);
   memset(c, 0, sizeof(grpc_ssl_credentials));
   c->base.type = GRPC_CREDENTIALS_TYPE_SSL;
@@ -331,6 +343,12 @@ grpc_server_credentials *grpc_ssl_server_credentials_create(
     size_t num_key_cert_pairs, int force_client_auth, void *reserved) {
   grpc_ssl_server_credentials *c =
       gpr_malloc(sizeof(grpc_ssl_server_credentials));
+  GRPC_API_TRACE(
+      "grpc_ssl_server_credentials_create("
+        "pem_root_certs=%s, pem_key_cert_pairs=%p, num_key_cert_pairs=%lu, "
+        "force_client_auth=%d, reserved=%p)", 5,
+      (pem_root_certs, pem_key_cert_pairs, (unsigned long)num_key_cert_pairs,
+       force_client_auth, reserved));
   GPR_ASSERT(reserved == NULL);
   memset(c, 0, sizeof(grpc_ssl_server_credentials));
   c->base.type = GRPC_CREDENTIALS_TYPE_SSL;
@@ -449,6 +467,14 @@ grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
 
 grpc_credentials *grpc_service_account_jwt_access_credentials_create(
     const char *json_key, gpr_timespec token_lifetime, void *reserved) {
+  GRPC_API_TRACE(
+      "grpc_service_account_jwt_access_credentials_create("
+        "json_key=%s, "
+        "token_lifetime="
+          "gpr_timespec { tv_sec: %ld, tv_nsec: %d, clock_type: %d }, "
+          "reserved=%p)",
+      5, (json_key, (long)token_lifetime.tv_sec,
+          token_lifetime.tv_nsec, (int)token_lifetime.clock_type, reserved));
   GPR_ASSERT(reserved == NULL);
   return grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
       grpc_auth_json_key_create_from_string(json_key), token_lifetime);
@@ -659,6 +685,8 @@ grpc_credentials *grpc_google_compute_engine_credentials_create(
     void *reserved) {
   grpc_oauth2_token_fetcher_credentials *c =
       gpr_malloc(sizeof(grpc_oauth2_token_fetcher_credentials));
+  GRPC_API_TRACE("grpc_compute_engine_credentials_create(reserved=%p)", 1,
+                 (reserved));
   GPR_ASSERT(reserved == NULL);
   init_oauth2_token_fetcher(c, compute_engine_fetch_oauth2);
   c->base.vtable = &compute_engine_vtable;
@@ -720,6 +748,9 @@ grpc_credentials *grpc_refresh_token_credentials_create_from_auth_refresh_token(
 
 grpc_credentials *grpc_google_refresh_token_credentials_create(
     const char *json_refresh_token, void *reserved) {
+  GRPC_API_TRACE("grpc_refresh_token_credentials_create(json_refresh_token=%s, "
+                 "reserved=%p)",
+                 2, (json_refresh_token, reserved));
   GPR_ASSERT(reserved == NULL);
   return grpc_refresh_token_credentials_create_from_auth_refresh_token(
       grpc_auth_refresh_token_create_from_string(json_refresh_token));
@@ -820,6 +851,9 @@ grpc_credentials *grpc_access_token_credentials_create(const char *access_token,
   grpc_access_token_credentials *c =
       gpr_malloc(sizeof(grpc_access_token_credentials));
   char *token_md_value;
+  GRPC_API_TRACE("grpc_access_token_credentials_create(access_token=%s, "
+                                                       "reserved=%p)", 2,
+                 (access_token, reserved));
   GPR_ASSERT(reserved == NULL);
   memset(c, 0, sizeof(grpc_access_token_credentials));
   c->base.type = GRPC_CREDENTIALS_TYPE_OAUTH2;
@@ -1056,6 +1090,9 @@ grpc_credentials *grpc_composite_credentials_create(grpc_credentials *creds1,
   grpc_credentials_array creds1_array;
   grpc_credentials_array creds2_array;
   grpc_composite_credentials *c;
+  GRPC_API_TRACE("grpc_composite_credentials_create(creds1=%p, creds2=%p, "
+                                                   "reserved=%p)", 3,
+                 (creds1, creds2, reserved));
   GPR_ASSERT(reserved == NULL);
   GPR_ASSERT(creds1 != NULL);
   GPR_ASSERT(creds2 != NULL);
@@ -1158,6 +1195,9 @@ static grpc_credentials_vtable iam_vtable = {
 grpc_credentials *grpc_google_iam_credentials_create(
     const char *token, const char *authority_selector, void *reserved) {
   grpc_google_iam_credentials *c;
+  GRPC_API_TRACE("grpc_iam_credentials_create(token=%s, authority_selector=%s, "
+                                             "reserved=%p)",
+                 3, (token, authority_selector, reserved));
   GPR_ASSERT(reserved == NULL);
   GPR_ASSERT(token != NULL);
   GPR_ASSERT(authority_selector != NULL);
diff --git a/src/core/security/google_default_credentials.c b/src/core/security/google_default_credentials.c
index 7b858428083bf296eec31c674d1309e4e1a29d80..45135305b2883395bd5eef481408878252992ee4 100644
--- a/src/core/security/google_default_credentials.c
+++ b/src/core/security/google_default_credentials.c
@@ -42,6 +42,7 @@
 #include "src/core/httpcli/httpcli.h"
 #include "src/core/support/env.h"
 #include "src/core/support/file.h"
+#include "src/core/surface/api_trace.h"
 
 /* -- Constants. -- */
 
@@ -178,6 +179,9 @@ end:
 grpc_credentials *grpc_google_default_credentials_create(void) {
   grpc_credentials *result = NULL;
   int serving_cached_credentials = 0;
+
+  GRPC_API_TRACE("grpc_google_default_credentials_create(void)", 0, ());
+
   gpr_once_init(&g_once, init_default_credentials);
 
   gpr_mu_lock(&g_mu);
diff --git a/src/core/security/security_context.c b/src/core/security/security_context.c
index 95d80ba122ff276fcf2e33335892baa12e895500..b3cf5204c0db49615264f394ae8bbf6767f8786f 100644
--- a/src/core/security/security_context.c
+++ b/src/core/security/security_context.c
@@ -34,6 +34,7 @@
 #include <string.h>
 
 #include "src/core/security/security_context.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/call.h"
 #include "src/core/support/string.h"
 
@@ -47,6 +48,8 @@
 grpc_call_error grpc_call_set_credentials(grpc_call *call,
                                           grpc_credentials *creds) {
   grpc_client_security_context *ctx = NULL;
+  GRPC_API_TRACE("grpc_call_set_credentials(call=%p, creds=%p)", 2,
+                 (call, creds));
   if (!grpc_call_is_client(call)) {
     gpr_log(GPR_ERROR, "Method is client-side only.");
     return GRPC_CALL_ERROR_NOT_ON_SERVER;
@@ -71,6 +74,7 @@ grpc_call_error grpc_call_set_credentials(grpc_call *call,
 
 grpc_auth_context *grpc_call_auth_context(grpc_call *call) {
   void *sec_ctx = grpc_call_context_get(call, GRPC_CONTEXT_SECURITY);
+  GRPC_API_TRACE("grpc_call_auth_context(call=%p)", 1, (call));
   if (sec_ctx == NULL) return NULL;
   return grpc_call_is_client(call)
              ? GRPC_AUTH_CONTEXT_REF(
@@ -82,6 +86,7 @@ grpc_auth_context *grpc_call_auth_context(grpc_call *call) {
 }
 
 void grpc_auth_context_release(grpc_auth_context *context) {
+  GRPC_API_TRACE("grpc_auth_context_release(context=%p)", 1, (context));
   GRPC_AUTH_CONTEXT_UNREF(context, "grpc_auth_context_unref");
 }
 
@@ -174,6 +179,8 @@ void grpc_auth_context_unref(grpc_auth_context *ctx) {
 
 const char *grpc_auth_context_peer_identity_property_name(
     const grpc_auth_context *ctx) {
+  GRPC_API_TRACE("grpc_auth_context_peer_identity_property_name(ctx=%p)", 1,
+                 (ctx));
   return ctx->peer_identity_property_name;
 }
 
@@ -182,6 +189,9 @@ int grpc_auth_context_set_peer_identity_property_name(grpc_auth_context *ctx,
   grpc_auth_property_iterator it =
       grpc_auth_context_find_properties_by_name(ctx, name);
   const grpc_auth_property *prop = grpc_auth_property_iterator_next(&it);
+  GRPC_API_TRACE(
+      "grpc_auth_context_set_peer_identity_property_name(ctx=%p, name=%s)", 2,
+      (ctx, name));
   if (prop == NULL) {
     gpr_log(GPR_ERROR, "Property name %s not found in auth context.",
             name != NULL ? name : "NULL");
@@ -192,12 +202,14 @@ int grpc_auth_context_set_peer_identity_property_name(grpc_auth_context *ctx,
 }
 
 int grpc_auth_context_peer_is_authenticated(const grpc_auth_context *ctx) {
+  GRPC_API_TRACE("grpc_auth_context_peer_is_authenticated(ctx=%p)", 1, (ctx));
   return ctx->peer_identity_property_name == NULL ? 0 : 1;
 }
 
 grpc_auth_property_iterator grpc_auth_context_property_iterator(
     const grpc_auth_context *ctx) {
   grpc_auth_property_iterator it = empty_iterator;
+  GRPC_API_TRACE("grpc_auth_context_property_iterator(ctx=%p)", 1, (ctx));
   if (ctx == NULL) return it;
   it.ctx = ctx;
   return it;
@@ -205,6 +217,7 @@ grpc_auth_property_iterator grpc_auth_context_property_iterator(
 
 const grpc_auth_property *grpc_auth_property_iterator_next(
     grpc_auth_property_iterator *it) {
+  GRPC_API_TRACE("grpc_auth_property_iterator_next(it=%p)", 1, (it));
   if (it == NULL || it->ctx == NULL) return NULL;
   while (it->index == it->ctx->properties.count) {
     if (it->ctx->chained == NULL) return NULL;
@@ -229,6 +242,8 @@ const grpc_auth_property *grpc_auth_property_iterator_next(
 grpc_auth_property_iterator grpc_auth_context_find_properties_by_name(
     const grpc_auth_context *ctx, const char *name) {
   grpc_auth_property_iterator it = empty_iterator;
+  GRPC_API_TRACE("grpc_auth_context_find_properties_by_name(ctx=%p, name=%s)",
+                 2, (ctx, name));
   if (ctx == NULL || name == NULL) return empty_iterator;
   it.ctx = ctx;
   it.name = name;
@@ -237,6 +252,7 @@ grpc_auth_property_iterator grpc_auth_context_find_properties_by_name(
 
 grpc_auth_property_iterator grpc_auth_context_peer_identity(
     const grpc_auth_context *ctx) {
+  GRPC_API_TRACE("grpc_auth_context_peer_identity(ctx=%p)", 1, (ctx));
   if (ctx == NULL) return empty_iterator;
   return grpc_auth_context_find_properties_by_name(
       ctx, ctx->peer_identity_property_name);
@@ -255,6 +271,11 @@ static void ensure_auth_context_capacity(grpc_auth_context *ctx) {
 void grpc_auth_context_add_property(grpc_auth_context *ctx, const char *name,
                                     const char *value, size_t value_length) {
   grpc_auth_property *prop;
+  GRPC_API_TRACE(
+      "grpc_auth_context_add_property(ctx=%p, name=%s, value=%*.*s, "
+                                     "value_length=%lu)",
+      6, (ctx, name, (int)value_length, (int)value_length, value,
+          (unsigned long)value_length));
   ensure_auth_context_capacity(ctx);
   prop = &ctx->properties.array[ctx->properties.count++];
   prop->name = gpr_strdup(name);
@@ -268,6 +289,9 @@ void grpc_auth_context_add_cstring_property(grpc_auth_context *ctx,
                                             const char *name,
                                             const char *value) {
   grpc_auth_property *prop;
+  GRPC_API_TRACE(
+      "grpc_auth_context_add_cstring_property(ctx=%p, name=%s, value=%s)", 3,
+      (ctx, name, value));
   ensure_auth_context_capacity(ctx);
   prop = &ctx->properties.array[ctx->properties.count++];
   prop->name = gpr_strdup(name);
diff --git a/src/core/security/server_secure_chttp2.c b/src/core/security/server_secure_chttp2.c
index a6c515dc34e84c80a41843db3ea976bef8161bc4..3738ed6eb13c512822455b3a039b2226504d4153 100644
--- a/src/core/security/server_secure_chttp2.c
+++ b/src/core/security/server_secure_chttp2.c
@@ -44,6 +44,7 @@
 #include "src/core/security/credentials.h"
 #include "src/core/security/security_connector.h"
 #include "src/core/security/security_context.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/server.h"
 #include "src/core/transport/chttp2_transport.h"
 #include <grpc/support/alloc.h>
@@ -222,6 +223,10 @@ int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr,
   grpc_security_connector *sc = NULL;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GRPC_API_TRACE("grpc_server_add_secure_http2_port("
+                    "server=%p, addr=%s, creds=%p)",
+                 3, (server, addr, creds));
+
   /* create security context */
   if (creds == NULL) goto error;
   status = grpc_server_credentials_create_security_connector(creds, &sc);
diff --git a/src/core/surface/api_trace.c b/src/core/surface/api_trace.c
new file mode 100644
index 0000000000000000000000000000000000000000..9f0b900d4671dd6103fdca6980d7f6a70f4f402c
--- /dev/null
+++ b/src/core/surface/api_trace.c
@@ -0,0 +1,36 @@
+/*
+ *
+ * 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 "src/core/surface/api_trace.h"
+
+int grpc_api_trace = 0;
diff --git a/src/core/surface/api_trace.h b/src/core/surface/api_trace.h
new file mode 100644
index 0000000000000000000000000000000000000000..7769b191efa095b85fdaddf434bfb467f1cde8a6
--- /dev/null
+++ b/src/core/surface/api_trace.h
@@ -0,0 +1,65 @@
+/*
+ *
+ * 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 GRPC_INTERNAL_CORE_SURFACE_API_TRACE_H
+#define GRPC_INTERNAL_CORE_SURFACE_API_TRACE_H
+
+#include "src/core/debug/trace.h"
+#include <grpc/support/log.h>
+
+extern int grpc_api_trace;
+
+/* Provide unwrapping macros because we're in C89 and variadic macros weren't
+   introduced until C99... */
+#define GRPC_API_TRACE_UNWRAP0()
+#define GRPC_API_TRACE_UNWRAP1(a) , a
+#define GRPC_API_TRACE_UNWRAP2(a, b) , a, b
+#define GRPC_API_TRACE_UNWRAP3(a, b, c) , a, b, c
+#define GRPC_API_TRACE_UNWRAP4(a, b, c, d) , a, b, c, d
+#define GRPC_API_TRACE_UNWRAP5(a, b, c, d, e) , a, b, c, d, e
+#define GRPC_API_TRACE_UNWRAP6(a, b, c, d, e, f) , a, b, c, d, e, f
+#define GRPC_API_TRACE_UNWRAP7(a, b, c, d, e, f, g) , a, b, c, d, e, f, g
+#define GRPC_API_TRACE_UNWRAP8(a, b, c, d, e, f, g, h) , a, b, c, d, e, f, g, h
+#define GRPC_API_TRACE_UNWRAP9(a, b, c, d, e, f, g, h, i) \
+    , a, b, c, d, e, f, g, h, i
+#define GRPC_API_TRACE_UNWRAP10(a, b, c, d, e, f, g, h, i, j) \
+    , a, b, c, d, e, f, g, h, i, j
+
+/* Due to the limitations of C89's preprocessor, the arity of the var-arg list
+   'nargs' must be specified. */
+#define GRPC_API_TRACE(fmt, nargs, args)                          \
+    if (grpc_api_trace) {                                         \
+      gpr_log(GPR_INFO, fmt GRPC_API_TRACE_UNWRAP##nargs args ); \
+    }
+
+#endif /* GRPC_INTERNAL_CORE_SURFACE_API_TRACE_H */
diff --git a/src/core/surface/call.c b/src/core/surface/call.c
index 0b917f156119b125e016d2b8d218511902d42101..85c27746dcabe2511977999f9333741c3aadeabb 100644
--- a/src/core/surface/call.c
+++ b/src/core/surface/call.c
@@ -45,6 +45,7 @@
 #include "src/core/iomgr/alarm.h"
 #include "src/core/profiling/timers.h"
 #include "src/core/support/string.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/byte_buffer_queue.h"
 #include "src/core/surface/call.h"
 #include "src/core/surface/channel.h"
@@ -1280,6 +1281,8 @@ void grpc_call_destroy(grpc_call *c) {
   grpc_call *parent = c->parent;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GRPC_API_TRACE("grpc_call_destroy(c=%p)", 1, (c));
+
   if (parent) {
     gpr_mu_lock(&parent->mu);
     if (c == parent->first_child) {
@@ -1308,6 +1311,7 @@ void grpc_call_destroy(grpc_call *c) {
 }
 
 grpc_call_error grpc_call_cancel(grpc_call *call, void *reserved) {
+  GRPC_API_TRACE("grpc_call_cancel(call=%p, reserved=%p)", 2, (call, reserved));
   GPR_ASSERT(!reserved);
   return grpc_call_cancel_with_status(call, GRPC_STATUS_CANCELLED, "Cancelled",
                                       NULL);
@@ -1319,6 +1323,10 @@ grpc_call_error grpc_call_cancel_with_status(grpc_call *c,
                                              void *reserved) {
   grpc_call_error r;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+  GRPC_API_TRACE(
+      "grpc_call_cancel_with_status("
+        "c=%p, status=%d, description=%s, reserved=%p)",
+      4, (c, (int)status, description, reserved));
   GPR_ASSERT(reserved == NULL);
   lock(c);
   r = cancel_with_status(c, status, description);
@@ -1386,6 +1394,7 @@ char *grpc_call_get_peer(grpc_call *call) {
   grpc_call_element *elem = CALL_ELEM_FROM_CALL(call, 0);
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   char *result = elem->filter->get_peer(&exec_ctx, elem);
+  GRPC_API_TRACE("grpc_call_get_peer(%p)", 1, (call));
   grpc_exec_ctx_finish(&exec_ctx);
   return result;
 }
@@ -1580,6 +1589,10 @@ grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops,
   grpc_call_error error;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GRPC_API_TRACE(
+      "grpc_call_start_batch(call=%p, ops=%p, nops=%lu, tag=%p, reserved=%p)",
+      5, (call, ops, (unsigned long)nops, tag, reserved));
+
   if (reserved != NULL) {
     error = GRPC_CALL_ERROR;
     goto done;
diff --git a/src/core/surface/call_details.c b/src/core/surface/call_details.c
index 65d2d1da5b230c703a2c2ffd9e9328b056163fdb..60f0029819c02c88699d6ab7088246e9ec03d64d 100644
--- a/src/core/surface/call_details.c
+++ b/src/core/surface/call_details.c
@@ -36,11 +36,15 @@
 
 #include <string.h>
 
+#include "src/core/surface/api_trace.h"
+
 void grpc_call_details_init(grpc_call_details* cd) {
+  GRPC_API_TRACE("grpc_call_details_init(cd=%p)", 1, (cd));
   memset(cd, 0, sizeof(*cd));
 }
 
 void grpc_call_details_destroy(grpc_call_details* cd) {
+  GRPC_API_TRACE("grpc_call_details_destroy(cd=%p)", 1, (cd));
   gpr_free(cd->method);
   gpr_free(cd->host);
 }
diff --git a/src/core/surface/channel.c b/src/core/surface/channel.c
index aed7a79e4ef28c8a35cf1c32207fdf91a61d7297..3ff11eb0344d82d121a95f91710372bf9bb45e91 100644
--- a/src/core/surface/channel.c
+++ b/src/core/surface/channel.c
@@ -43,6 +43,7 @@
 #include "src/core/client_config/resolver_registry.h"
 #include "src/core/iomgr/iomgr.h"
 #include "src/core/support/string.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/call.h"
 #include "src/core/surface/init.h"
 
@@ -184,6 +185,7 @@ grpc_channel *grpc_channel_create_from_filters(
 }
 
 char *grpc_channel_get_target(grpc_channel *channel) {
+  GRPC_API_TRACE("grpc_channel_get_target(channel=%p)", 1, (channel));
   return gpr_strdup(channel->target);
 }
 
@@ -213,6 +215,15 @@ grpc_call *grpc_channel_create_call(grpc_channel *channel,
                                     grpc_completion_queue *cq,
                                     const char *method, const char *host,
                                     gpr_timespec deadline, void *reserved) {
+  GRPC_API_TRACE(
+      "grpc_channel_create_call("
+        "channel=%p, parent_call=%p, propagation_mask=%x, cq=%p, method=%s, "
+        "host=%s, "
+        "deadline=gpr_timespec { tv_sec: %ld, tv_nsec: %d, clock_type: %d }, "
+        "reserved=%p)",
+      10, (channel, parent_call, (unsigned)propagation_mask, cq, method,
+           host, (long)deadline.tv_sec, deadline.tv_nsec,
+           (int)deadline.clock_type, reserved));
   GPR_ASSERT(!reserved);
   return grpc_channel_create_call_internal(
       channel, parent_call, propagation_mask, cq,
@@ -230,6 +241,9 @@ grpc_call *grpc_channel_create_call(grpc_channel *channel,
 void *grpc_channel_register_call(grpc_channel *channel, const char *method,
                                  const char *host, void *reserved) {
   registered_call *rc = gpr_malloc(sizeof(registered_call));
+  GRPC_API_TRACE(
+      "grpc_channel_register_call(channel=%p, method=%s, host=%s, reserved=%p)",
+      4, (channel, method, host, reserved));
   GPR_ASSERT(!reserved);
   rc->path = grpc_mdelem_from_metadata_strings(
       channel->metadata_context, GRPC_MDSTR_REF(channel->path_string),
@@ -252,6 +266,15 @@ grpc_call *grpc_channel_create_registered_call(
     grpc_completion_queue *completion_queue, void *registered_call_handle,
     gpr_timespec deadline, void *reserved) {
   registered_call *rc = registered_call_handle;
+  GRPC_API_TRACE(
+      "grpc_channel_create_registered_call("
+        "channel=%p, parent_call=%p, propagation_mask=%x, completion_queue=%p, "
+        "registered_call_handle=%p, "
+        "deadline=gpr_timespec { tv_sec: %ld, tv_nsec: %d, clock_type: %d }, "
+        "reserved=%p)",
+      9, (channel, parent_call, (unsigned)propagation_mask, completion_queue,
+          registered_call_handle, (long)deadline.tv_sec, deadline.tv_nsec,
+          (int)deadline.clock_type, reserved));
   GPR_ASSERT(!reserved);
   return grpc_channel_create_call_internal(
       channel, parent_call, propagation_mask, completion_queue,
@@ -317,6 +340,7 @@ void grpc_channel_destroy(grpc_channel *channel) {
   grpc_transport_op op;
   grpc_channel_element *elem;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+  GRPC_API_TRACE("grpc_channel_destroy(channel=%p)", 1, (channel));
   memset(&op, 0, sizeof(op));
   op.disconnect = 1;
   elem = grpc_channel_stack_element(CHANNEL_STACK_FROM_CHANNEL(channel), 0);
diff --git a/src/core/surface/channel_connectivity.c b/src/core/surface/channel_connectivity.c
index 47cbab154f8a3b3db038703edb015aa25af7bc08..bef3d387fc9ec6301bc4f81bb55950cf217bdba7 100644
--- a/src/core/surface/channel_connectivity.c
+++ b/src/core/surface/channel_connectivity.c
@@ -38,6 +38,7 @@
 
 #include "src/core/channel/client_channel.h"
 #include "src/core/iomgr/alarm.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/completion_queue.h"
 
 grpc_connectivity_state grpc_channel_check_connectivity_state(
@@ -47,6 +48,9 @@ grpc_connectivity_state grpc_channel_check_connectivity_state(
       grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_connectivity_state state;
+  GRPC_API_TRACE(
+      "grpc_channel_check_connectivity_state(channel=%p, try_to_connect=%d)",
+      2, (channel, try_to_connect));
   if (client_channel_elem->filter != &grpc_client_channel_filter) {
     gpr_log(GPR_ERROR,
             "grpc_channel_check_connectivity_state called on something that is "
@@ -175,6 +179,14 @@ void grpc_channel_watch_connectivity_state(
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   state_watcher *w = gpr_malloc(sizeof(*w));
 
+  GRPC_API_TRACE(
+      "grpc_channel_watch_connectivity_state("
+        "channel=%p, last_observed_state=%d, "
+        "deadline=gpr_timespec { tv_sec: %ld, tv_nsec: %d, clock_type: %d }, "
+        "cq=%p, tag=%p)",
+      7, (channel, (int)last_observed_state, (long)deadline.tv_sec,
+          deadline.tv_nsec, (int)deadline.clock_type, cq, tag));
+
   grpc_cq_begin_op(cq);
 
   gpr_mu_init(&w->mu);
diff --git a/src/core/surface/channel_create.c b/src/core/surface/channel_create.c
index 05591ce27f94549680548c6323415cc2a3590732..51d9130b63d5711989a12281a20a6077b3958f69 100644
--- a/src/core/surface/channel_create.c
+++ b/src/core/surface/channel_create.c
@@ -45,6 +45,7 @@
 #include "src/core/channel/http_client_filter.h"
 #include "src/core/client_config/resolver_registry.h"
 #include "src/core/iomgr/tcp_client.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/channel.h"
 #include "src/core/transport/chttp2_transport.h"
 
@@ -184,6 +185,9 @@ grpc_channel *grpc_insecure_channel_create(const char *target,
   grpc_mdctx *mdctx = grpc_mdctx_create();
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   size_t n = 0;
+  GRPC_API_TRACE(
+      "grpc_insecure_channel_create(target=%p, args=%p, reserved=%p)", 3,
+      (target, args, reserved));
   GPR_ASSERT(!reserved);
   if (grpc_channel_args_is_census_enabled(args)) {
     filters[n++] = &grpc_client_census_filter;
diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c
index 5dac8ebcf8b264be9306d4c5f8b6ae875ce403bb..a6b32d27aa123d179b2b899f2dea18c51981df39 100644
--- a/src/core/surface/completion_queue.c
+++ b/src/core/surface/completion_queue.c
@@ -38,6 +38,7 @@
 
 #include "src/core/iomgr/pollset.h"
 #include "src/core/support/string.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/call.h"
 #include "src/core/surface/event_string.h"
 #include "src/core/surface/surface_trace.h"
@@ -75,6 +76,7 @@ static void on_pollset_destroy_done(grpc_exec_ctx *exec_ctx, void *cc,
 
 grpc_completion_queue *grpc_completion_queue_create(void *reserved) {
   grpc_completion_queue *cc = gpr_malloc(sizeof(grpc_completion_queue));
+  GRPC_API_TRACE("grpc_completion_queue_create(reserved=%p)", 1, (reserved));
   GPR_ASSERT(!reserved);
   memset(cc, 0, sizeof(*cc));
   /* Initial ref is dropped by grpc_completion_queue_shutdown */
@@ -182,6 +184,13 @@ grpc_event grpc_completion_queue_next(grpc_completion_queue *cc,
   gpr_timespec now;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GRPC_API_TRACE(
+      "grpc_completion_queue_next("
+        "cc=%p, "
+        "deadline=gpr_timespec { tv_sec: %ld, tv_nsec: %d, clock_type: %d }, "
+        "reserved=%p)",
+      5, (cc, (long)deadline.tv_sec, deadline.tv_nsec,
+          (int)deadline.clock_type, reserved));
   GPR_ASSERT(!reserved);
 
   deadline = gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC);
@@ -259,6 +268,13 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag,
   int first_loop = 1;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GRPC_API_TRACE(
+      "grpc_completion_queue_pluck("
+        "cc=%p, tag=%p, "
+        "deadline=gpr_timespec { tv_sec: %ld, tv_nsec: %d, clock_type: %d }, "
+        "reserved=%p)",
+      6, (cc, tag, (long)deadline.tv_sec, deadline.tv_nsec,
+          (int)deadline.clock_type, reserved));
   GPR_ASSERT(!reserved);
 
   deadline = gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC);
@@ -324,6 +340,7 @@ done:
    to zero here, then enter shutdown mode and wake up any waiters */
 void grpc_completion_queue_shutdown(grpc_completion_queue *cc) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+  GRPC_API_TRACE("grpc_completion_queue_shutdown(cc=%p)", 1, (cc));
   gpr_mu_lock(GRPC_POLLSET_MU(&cc->pollset));
   if (cc->shutdown_called) {
     gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset));
@@ -343,6 +360,7 @@ void grpc_completion_queue_shutdown(grpc_completion_queue *cc) {
 }
 
 void grpc_completion_queue_destroy(grpc_completion_queue *cc) {
+  GRPC_API_TRACE("grpc_completion_queue_destroy(cc=%p)", 1, (cc));
   grpc_completion_queue_shutdown(cc);
   GRPC_CQ_INTERNAL_UNREF(cc, "destroy");
 }
diff --git a/src/core/surface/init.c b/src/core/surface/init.c
index 7d7e72440ea8ecec4df6f050c8eccc160f70a031..96ab5ecb60bfae461317bf1cf9bffa6c9df12d43 100644
--- a/src/core/surface/init.c
+++ b/src/core/surface/init.c
@@ -49,6 +49,7 @@
 #include "src/core/debug/trace.h"
 #include "src/core/iomgr/iomgr.h"
 #include "src/core/profiling/timers.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/call.h"
 #include "src/core/surface/init.h"
 #include "src/core/surface/surface_trace.h"
@@ -75,6 +76,8 @@ static grpc_plugin g_all_of_the_plugins[MAX_PLUGINS];
 static int g_number_of_plugins = 0;
 
 void grpc_register_plugin(void (*init)(void), void (*destroy)(void)) {
+  GRPC_API_TRACE("grpc_register_plugin(init=%lx, destroy=%lx)", 2,
+                 ((unsigned long)init, (unsigned long)destroy));
   GPR_ASSERT(g_number_of_plugins != MAX_PLUGINS);
   g_all_of_the_plugins[g_number_of_plugins].init = init;
   g_all_of_the_plugins[g_number_of_plugins].destroy = destroy;
@@ -98,6 +101,7 @@ void grpc_init(void) {
 #ifdef GPR_POSIX_SOCKET
     grpc_register_resolver_type(grpc_unix_resolver_factory_create());
 #endif
+    grpc_register_tracer("api", &grpc_api_trace);
     grpc_register_tracer("channel", &grpc_trace_channel);
     grpc_register_tracer("surface", &grpc_surface_trace);
     grpc_register_tracer("http", &grpc_http_trace);
@@ -120,10 +124,12 @@ void grpc_init(void) {
     }
   }
   gpr_mu_unlock(&g_init_mu);
+  GRPC_API_TRACE("grpc_init(void)", 0, ());
 }
 
 void grpc_shutdown(void) {
   int i;
+  GRPC_API_TRACE("grpc_shutdown(void)", 0, ());
   gpr_mu_lock(&g_init_mu);
   if (--g_initializations == 0) {
     grpc_iomgr_shutdown();
diff --git a/src/core/surface/lame_client.c b/src/core/surface/lame_client.c
index 9e14ce2191a51a9fb557f7e907cf198e22eda30a..d2462d8c9992ef3e89751704258f1617284f5329 100644
--- a/src/core/surface/lame_client.c
+++ b/src/core/surface/lame_client.c
@@ -37,6 +37,7 @@
 
 #include "src/core/channel/channel_stack.h"
 #include "src/core/support/string.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/channel.h"
 #include "src/core/surface/call.h"
 #include <grpc/support/alloc.h>
@@ -151,6 +152,10 @@ grpc_channel *grpc_lame_client_channel_create(const char *target,
   channel = grpc_channel_create_from_filters(&exec_ctx, target, filters, 1,
                                              NULL, grpc_mdctx_create(), 1);
   elem = grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
+  GRPC_API_TRACE(
+      "grpc_lame_client_channel_create(target=%s, error_code=%d, "
+                                      "error_message=%s)",
+      3, (target, (int)error_code, error_message));
   GPR_ASSERT(elem->filter == &lame_filter);
   chand = (channel_data *)elem->channel_data;
   chand->error_code = error_code;
diff --git a/src/core/surface/metadata_array.c b/src/core/surface/metadata_array.c
index 648c57926670b162ddcebd6eb705b3e0d3c159dc..4c7bf17835aadabecd9a88cb3499c25770616490 100644
--- a/src/core/surface/metadata_array.c
+++ b/src/core/surface/metadata_array.c
@@ -36,10 +36,14 @@
 
 #include <string.h>
 
+#include "src/core/surface/api_trace.h"
+
 void grpc_metadata_array_init(grpc_metadata_array* array) {
+  GRPC_API_TRACE("grpc_metadata_array_init(array=%p)", 1, (array));
   memset(array, 0, sizeof(*array));
 }
 
 void grpc_metadata_array_destroy(grpc_metadata_array* array) {
+  GRPC_API_TRACE("grpc_metadata_array_destroy(array=%p)", 1, (array));
   gpr_free(array->metadata);
 }
diff --git a/src/core/surface/secure_channel_create.c b/src/core/surface/secure_channel_create.c
index d6070a54a89a6396680ca0afdd1d1549240097fb..7fe43b0eaa5de5da2c82889f6cc8be6d4e4a5d79 100644
--- a/src/core/surface/secure_channel_create.c
+++ b/src/core/surface/secure_channel_create.c
@@ -47,6 +47,7 @@
 #include "src/core/iomgr/tcp_client.h"
 #include "src/core/security/auth_filters.h"
 #include "src/core/security/credentials.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/channel.h"
 #include "src/core/transport/chttp2_transport.h"
 #include "src/core/tsi/transport_security_interface.h"
@@ -246,7 +247,11 @@ grpc_channel *grpc_secure_channel_create(grpc_credentials *creds,
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   size_t n = 0;
 
+  GRPC_API_TRACE("grpc_secure_channel_create(creds=%p, target=%s, args=%p, "
+                                            "reserved=%p)", 4,
+                 (creds, target, args, reserved));
   GPR_ASSERT(reserved == NULL);
+
   if (grpc_find_security_connector_in_args(args) != NULL) {
     gpr_log(GPR_ERROR, "Cannot set security context in channel args.");
     grpc_exec_ctx_finish(&exec_ctx);
diff --git a/src/core/surface/server.c b/src/core/surface/server.c
index e3ce88b3e602646906050e5f5253a087af61767c..ebd2ef9af35ae26de544653abc6679855d55f204 100644
--- a/src/core/surface/server.c
+++ b/src/core/surface/server.c
@@ -48,6 +48,7 @@
 #include "src/core/iomgr/iomgr.h"
 #include "src/core/support/stack_lockfree.h"
 #include "src/core/support/string.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/call.h"
 #include "src/core/surface/channel.h"
 #include "src/core/surface/completion_queue.h"
@@ -776,6 +777,9 @@ void grpc_server_register_completion_queue(grpc_server *server,
                                            grpc_completion_queue *cq,
                                            void *reserved) {
   size_t i, n;
+  GRPC_API_TRACE(
+      "grpc_server_register_completion_queue(server=%p, cq=%p, reserved=%p)", 3,
+      (server, cq, reserved));
   GPR_ASSERT(!reserved);
   for (i = 0; i < server->cq_count; i++) {
     if (server->cqs[i] == cq) return;
@@ -854,6 +858,8 @@ static int streq(const char *a, const char *b) {
 void *grpc_server_register_method(grpc_server *server, const char *method,
                                   const char *host) {
   registered_method *m;
+  GRPC_API_TRACE("grpc_server_register_method(server=%p, method=%s, host=%s)",
+                 3, (server, method, host));
   if (!method) {
     gpr_log(GPR_ERROR,
             "grpc_server_register_method method string cannot be NULL");
@@ -881,6 +887,8 @@ void grpc_server_start(grpc_server *server) {
   size_t i;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GRPC_API_TRACE("grpc_server_start(server=%p)", 1, (server));
+
   server->pollsets = gpr_malloc(sizeof(grpc_pollset *) * server->cq_count);
   for (i = 0; i < server->cq_count; i++) {
     server->pollsets[i] = grpc_cq_pollset(server->cqs[i]);
@@ -1011,6 +1019,9 @@ void grpc_server_shutdown_and_notify(grpc_server *server,
   channel_broadcaster broadcaster;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GRPC_API_TRACE("grpc_server_shutdown_and_notify(server=%p, cq=%p, tag=%p)", 3,
+                 (server, cq, tag));
+
   GRPC_SERVER_LOG_SHUTDOWN(GPR_INFO, server, cq, tag);
 
   /* lock, and gather up some stuff to do */
@@ -1063,6 +1074,8 @@ void grpc_server_cancel_all_calls(grpc_server *server) {
   channel_broadcaster broadcaster;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GRPC_API_TRACE("grpc_server_cancel_all_calls(server=%p)", 1, (server));
+
   gpr_mu_lock(&server->mu_global);
   channel_broadcaster_init(server, &broadcaster);
   gpr_mu_unlock(&server->mu_global);
@@ -1075,6 +1088,8 @@ void grpc_server_destroy(grpc_server *server) {
   listener *l;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GRPC_API_TRACE("grpc_server_destroy(server=%p)", 1, (server));
+
   gpr_mu_lock(&server->mu_global);
   GPR_ASSERT(gpr_atm_acq_load(&server->shutdown_flag) || !server->listeners);
   GPR_ASSERT(server->listeners_destroyed == num_listeners(server));
@@ -1169,6 +1184,12 @@ grpc_call_error grpc_server_request_call(
   grpc_call_error error;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   requested_call *rc = gpr_malloc(sizeof(*rc));
+  GRPC_API_TRACE(
+      "grpc_server_request_call("
+        "server=%p, call=%p, details=%p, initial_metadata=%p, "
+        "cq_bound_to_call=%p, cq_for_notification=%p, tag%p)",
+      7, (server, call, details, initial_metadata, cq_bound_to_call,
+          cq_for_notification, tag));
   GRPC_SERVER_LOG_REQUEST_CALL(GPR_INFO, server, call, details,
                                initial_metadata, cq_bound_to_call,
                                cq_for_notification, tag);
@@ -1202,6 +1223,13 @@ grpc_call_error grpc_server_request_registered_call(
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   requested_call *rc = gpr_malloc(sizeof(*rc));
   registered_method *rm = rmp;
+  GRPC_API_TRACE(
+      "grpc_server_request_registered_call("
+        "server=%p, rmp=%p, call=%p, deadline=%p, initial_metadata=%p, "
+        "optional_payload=%p, cq_bound_to_call=%p, cq_for_notification=%p, "
+        "tag=%p)",
+      9, (server, rmp, call, deadline, initial_metadata, optional_payload,
+          cq_bound_to_call, cq_for_notification, tag));
   if (!grpc_cq_is_server_cq(cq_for_notification)) {
     gpr_free(rc);
     error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
diff --git a/src/core/surface/server_chttp2.c b/src/core/surface/server_chttp2.c
index 3904ce969dd1b3f1252bcef29edf1654a15071f3..580b91573c208c0ab8f36d8b1178fac3dda80b4b 100644
--- a/src/core/surface/server_chttp2.c
+++ b/src/core/surface/server_chttp2.c
@@ -36,6 +36,7 @@
 #include "src/core/channel/http_server_filter.h"
 #include "src/core/iomgr/resolve_address.h"
 #include "src/core/iomgr/tcp_server.h"
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/server.h"
 #include "src/core/transport/chttp2_transport.h"
 #include <grpc/support/alloc.h>
@@ -92,6 +93,9 @@ int grpc_server_add_insecure_http2_port(grpc_server *server, const char *addr) {
   int port_temp;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GRPC_API_TRACE("grpc_server_add_insecure_http2_port(server=%p, addr=%s)", 2,
+                 (server, addr));
+
   resolved = grpc_blocking_resolve_address(addr, "http");
   if (!resolved) {
     goto error;
diff --git a/src/core/surface/server_create.c b/src/core/surface/server_create.c
index fc7ae820f53187ecb0f8ae8638e0a0696fb25519..c7811a6d8812e6be1a70175cfa8c620012667ea6 100644
--- a/src/core/surface/server_create.c
+++ b/src/core/surface/server_create.c
@@ -32,13 +32,14 @@
  */
 
 #include <grpc/grpc.h>
+#include "src/core/surface/api_trace.h"
 #include "src/core/surface/completion_queue.h"
 #include "src/core/surface/server.h"
 #include "src/core/channel/compress_filter.h"
 
 grpc_server *grpc_server_create(const grpc_channel_args *args, void *reserved) {
   const grpc_channel_filter *filters[] = {&grpc_compress_filter};
-  (void)reserved;
+  GRPC_API_TRACE("grpc_server_create(%p, %p)", 2, (args, reserved));
   return grpc_server_create_from_filters(filters, GPR_ARRAY_SIZE(filters),
                                          args);
 }
diff --git a/src/core/surface/version.c b/src/core/surface/version.c
index e559d51448a4f91440e21e249392c79d91b02e60..8eb3ceea70ff439046adeaefb991640cac723609 100644
--- a/src/core/surface/version.c
+++ b/src/core/surface/version.c
@@ -36,4 +36,10 @@
 
 #include <grpc/grpc.h>
 
-const char *grpc_version_string(void) { return "0.11.0.0"; }
+#include "src/core/surface/api_trace.h"
+
+const char *grpc_version_string(void) {
+  GRPC_API_TRACE("grpc_version_string(void)", 0, ());
+  return "0.11.0.0";
+}
+