diff --git a/.travis.yml b/.travis.yml
index 7d8634506c344d23c8c64a6a3e0e7f4dcc64477d..f1839ac174ae552179a3bf3cc20f992de56c1c1f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,13 +2,19 @@ language: cpp
 before_install:
   - sudo add-apt-repository ppa:yjwong/gflags -y
   - sudo add-apt-repository ppa:h-rayflood/llvm -y
+  - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
+  - echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
+  - echo "deb http://download.mono-project.com/repo/debian wheezy-libtiff-compat main" | sudo tee -a /etc/apt/sources.list.d/mono-xamarin.list
   - sudo apt-get update -qq
   - sudo apt-get install -qq libgtest-dev libgflags-dev python-virtualenv clang-3.5
   - sudo pip install cpp-coveralls mako simplejson
+  - sudo apt-get install -qq mono-devel nunit
+  - wget www.nuget.org/NuGet.exe -O nuget.exe
 env:
   global:
     - RUBY_VERSION=2.1
     - COVERALLS_PARALLEL=true
+    - NUGET="mono nuget.exe"
   matrix:
     - CONFIG=opt TEST=sanity
     - CONFIG=dbg TEST=c
@@ -18,6 +24,7 @@ env:
     - CONFIG=opt TEST=node
     - CONFIG=opt TEST=ruby
     - CONFIG=opt TEST=python
+    - CONFIG=opt TEST=csharp
     - CONFIG=gcov TEST=c
     - CONFIG=gcov TEST=c++
     - USE_GCC=4.4 CONFIG=opt TEST=build
diff --git a/BUILD b/BUILD
index 79070f1c1ef8bc161f8c1ca37112bb80a30d25d5..e862898eaa95c61f31e234c675f2a9ede09979f6 100644
--- a/BUILD
+++ b/BUILD
@@ -579,7 +579,6 @@ cc_library(
     "src/cpp/client/channel.h",
     "src/cpp/proto/proto_utils.h",
     "src/cpp/server/thread_pool.h",
-    "src/cpp/util/time.h",
     "src/cpp/client/secure_credentials.cc",
     "src/cpp/server/secure_server_credentials.cc",
     "src/cpp/client/channel.cc",
@@ -641,6 +640,7 @@ cc_library(
     "include/grpc++/status_code_enum.h",
     "include/grpc++/stream.h",
     "include/grpc++/thread_pool_interface.h",
+    "include/grpc++/time.h",
   ],
   includes = [
     "include",
@@ -660,7 +660,6 @@ cc_library(
     "src/cpp/client/channel.h",
     "src/cpp/proto/proto_utils.h",
     "src/cpp/server/thread_pool.h",
-    "src/cpp/util/time.h",
     "src/cpp/client/channel.cc",
     "src/cpp/client/channel_arguments.cc",
     "src/cpp/client/client_context.cc",
@@ -720,6 +719,7 @@ cc_library(
     "include/grpc++/status_code_enum.h",
     "include/grpc++/stream.h",
     "include/grpc++/thread_pool_interface.h",
+    "include/grpc++/time.h",
   ],
   includes = [
     "include",
diff --git a/Makefile b/Makefile
index 4d18c4ad18350943153c8376f6f62f40908a7197..2def6e2413be6194259904ab671b1602aed5bada 100644
--- a/Makefile
+++ b/Makefile
@@ -3101,42 +3101,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBGPR_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/src/core/support/alloc.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/cancellable.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/cmdline.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/cpu_iphone.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/cpu_linux.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/cpu_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/cpu_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/env_linux.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/env_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/env_win32.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/file.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/file_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/file_win32.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/histogram.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/host_port.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/log.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/log_android.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/log_linux.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/log_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/log_win32.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/murmur_hash.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/slice.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/slice_buffer.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/string.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/string_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/string_win32.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/sync.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/sync_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/sync_win32.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/thd.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/thd_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/thd_win32.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/time.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/time_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/support/time_win32.o: 
-
 
 LIBGPR_TEST_UTIL_SRC = \
     test/core/util/test_config.c \
@@ -3160,8 +3124,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBGPR_TEST_UTIL_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/util/test_config.o: 
-
 
 LIBGRPC_SRC = \
     src/core/httpcli/format_request.c \
@@ -3351,124 +3313,6 @@ ifneq ($(NO_DEPS),true)
 endif
 endif
 
-$(OBJDIR)/$(CONFIG)/src/core/httpcli/format_request.o: 
-$(OBJDIR)/$(CONFIG)/src/core/httpcli/httpcli.o: 
-$(OBJDIR)/$(CONFIG)/src/core/httpcli/httpcli_security_connector.o: 
-$(OBJDIR)/$(CONFIG)/src/core/httpcli/parser.o: 
-$(OBJDIR)/$(CONFIG)/src/core/security/auth.o: 
-$(OBJDIR)/$(CONFIG)/src/core/security/base64.o: 
-$(OBJDIR)/$(CONFIG)/src/core/security/credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/core/security/credentials_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/security/credentials_win32.o: 
-$(OBJDIR)/$(CONFIG)/src/core/security/google_default_credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/core/security/json_token.o: 
-$(OBJDIR)/$(CONFIG)/src/core/security/secure_endpoint.o: 
-$(OBJDIR)/$(CONFIG)/src/core/security/secure_transport_setup.o: 
-$(OBJDIR)/$(CONFIG)/src/core/security/security_connector.o: 
-$(OBJDIR)/$(CONFIG)/src/core/security/server_secure_chttp2.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/init_secure.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/secure_channel_create.o: 
-$(OBJDIR)/$(CONFIG)/src/core/tsi/fake_transport_security.o: 
-$(OBJDIR)/$(CONFIG)/src/core/tsi/ssl_transport_security.o: 
-$(OBJDIR)/$(CONFIG)/src/core/tsi/transport_security.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/call_op_string.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/census_filter.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/channel_args.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/channel_stack.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/child_channel.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/client_channel.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/client_setup.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/connected_channel.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/http_client_filter.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/http_filter.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/http_server_filter.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/noop_filter.o: 
-$(OBJDIR)/$(CONFIG)/src/core/compression/algorithm.o: 
-$(OBJDIR)/$(CONFIG)/src/core/compression/message_compress.o: 
-$(OBJDIR)/$(CONFIG)/src/core/debug/trace.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm_heap.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/fd_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/iocp_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_kick.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_epoll.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_poll_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/sockaddr_utils.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_common_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_linux.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_client_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_client_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_server_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_server_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/time_averaged_stats.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/wakeup_fd_eventfd.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/wakeup_fd_nospecial.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/wakeup_fd_pipe.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/wakeup_fd_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/json/json.o: 
-$(OBJDIR)/$(CONFIG)/src/core/json/json_reader.o: 
-$(OBJDIR)/$(CONFIG)/src/core/json/json_string.o: 
-$(OBJDIR)/$(CONFIG)/src/core/json/json_writer.o: 
-$(OBJDIR)/$(CONFIG)/src/core/profiling/timers.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/census_init.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/census_log.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/census_rpc_stats.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/census_tracing.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/hash_table.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/window_stats.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer_queue.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer_reader.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/call.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/call_details.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/call_log_batch.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/channel.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/channel_create.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/client.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/completion_queue.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/event_string.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/init.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/lame_client.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/metadata_array.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/server.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/server_chttp2.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/server_create.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/surface_trace.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/alpn.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/bin_encoder.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_data.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_goaway.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_ping.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_rst_stream.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_settings.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_window_update.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/hpack_parser.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/hpack_table.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/huffsyms.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/status_conversion.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/stream_encoder.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/stream_map.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/timeout_encoding.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/varint.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2_transport.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/metadata.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/stream_op.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/transport.o: 
-
 
 LIBGRPC_TEST_UTIL_SRC = \
     test/core/end2end/data/server1_cert.c \
@@ -3517,18 +3361,6 @@ ifneq ($(NO_DEPS),true)
 endif
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: 
-$(OBJDIR)/$(CONFIG)/test/core/iomgr/endpoint_tests.o: 
-$(OBJDIR)/$(CONFIG)/test/core/statistics/census_log_tests.o: 
-$(OBJDIR)/$(CONFIG)/test/core/util/grpc_profiler.o: 
-$(OBJDIR)/$(CONFIG)/test/core/util/parse_hexstring.o: 
-$(OBJDIR)/$(CONFIG)/test/core/util/port_posix.o: 
-$(OBJDIR)/$(CONFIG)/test/core/util/port_windows.o: 
-$(OBJDIR)/$(CONFIG)/test/core/util/slice_splitter.o: 
-
 
 LIBGRPC_TEST_UTIL_UNSECURE_SRC = \
     test/core/end2end/cq_verifier.c \
@@ -3560,15 +3392,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBGRPC_TEST_UTIL_UNSECURE_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: 
-$(OBJDIR)/$(CONFIG)/test/core/iomgr/endpoint_tests.o: 
-$(OBJDIR)/$(CONFIG)/test/core/statistics/census_log_tests.o: 
-$(OBJDIR)/$(CONFIG)/test/core/util/grpc_profiler.o: 
-$(OBJDIR)/$(CONFIG)/test/core/util/parse_hexstring.o: 
-$(OBJDIR)/$(CONFIG)/test/core/util/port_posix.o: 
-$(OBJDIR)/$(CONFIG)/test/core/util/port_windows.o: 
-$(OBJDIR)/$(CONFIG)/test/core/util/slice_splitter.o: 
-
 
 LIBGRPC_UNSECURE_SRC = \
     src/core/surface/init_unsecure.c \
@@ -3712,105 +3535,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBGRPC_UNSECURE_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/src/core/surface/init_unsecure.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/call_op_string.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/census_filter.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/channel_args.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/channel_stack.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/child_channel.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/client_channel.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/client_setup.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/connected_channel.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/http_client_filter.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/http_filter.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/http_server_filter.o: 
-$(OBJDIR)/$(CONFIG)/src/core/channel/noop_filter.o: 
-$(OBJDIR)/$(CONFIG)/src/core/compression/algorithm.o: 
-$(OBJDIR)/$(CONFIG)/src/core/compression/message_compress.o: 
-$(OBJDIR)/$(CONFIG)/src/core/debug/trace.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm_heap.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/fd_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/iocp_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_kick.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_epoll.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_multipoller_with_poll_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/pollset_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/resolve_address_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/sockaddr_utils.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_common_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_linux.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_utils_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/socket_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_client_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_client_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_server_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_server_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/tcp_windows.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/time_averaged_stats.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/wakeup_fd_eventfd.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/wakeup_fd_nospecial.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/wakeup_fd_pipe.o: 
-$(OBJDIR)/$(CONFIG)/src/core/iomgr/wakeup_fd_posix.o: 
-$(OBJDIR)/$(CONFIG)/src/core/json/json.o: 
-$(OBJDIR)/$(CONFIG)/src/core/json/json_reader.o: 
-$(OBJDIR)/$(CONFIG)/src/core/json/json_string.o: 
-$(OBJDIR)/$(CONFIG)/src/core/json/json_writer.o: 
-$(OBJDIR)/$(CONFIG)/src/core/profiling/timers.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/census_init.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/census_log.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/census_rpc_stats.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/census_tracing.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/hash_table.o: 
-$(OBJDIR)/$(CONFIG)/src/core/statistics/window_stats.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer_queue.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/byte_buffer_reader.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/call.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/call_details.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/call_log_batch.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/channel.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/channel_create.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/client.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/completion_queue.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/event_string.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/init.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/lame_client.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/metadata_array.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/server.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/server_chttp2.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/server_create.o: 
-$(OBJDIR)/$(CONFIG)/src/core/surface/surface_trace.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/alpn.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/bin_encoder.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_data.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_goaway.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_ping.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_rst_stream.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_settings.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/frame_window_update.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/hpack_parser.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/hpack_table.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/huffsyms.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/status_conversion.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/stream_encoder.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/stream_map.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/timeout_encoding.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/varint.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2_transport.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/metadata.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/stream_op.o: 
-$(OBJDIR)/$(CONFIG)/src/core/transport/transport.o: 
-
 
 LIBGRPC++_SRC = \
     src/cpp/client/secure_credentials.cc \
@@ -3874,6 +3598,7 @@ PUBLIC_HEADERS_CXX += \
     include/grpc++/status_code_enum.h \
     include/grpc++/stream.h \
     include/grpc++/thread_pool_interface.h \
+    include/grpc++/time.h \
 
 LIBGRPC++_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_SRC))))
 
@@ -3944,33 +3669,6 @@ ifneq ($(NO_DEPS),true)
 endif
 endif
 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/secure_credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/secure_server_credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/channel.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/channel_arguments.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/client_context.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/client_unary_call.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/create_channel.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/generic_stub.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/insecure_credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/internal_stub.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/common/call.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/common/completion_queue.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/common/rpc_method.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/proto/proto_utils.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/async_generic_service.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/insecure_server_credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/server.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/server_builder.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/server_context.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/server_credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/thread_pool.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/util/byte_buffer.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/util/slice.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/util/status.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/util/time.o: 
-
 
 LIBGRPC++_TEST_CONFIG_SRC = \
     test/cpp/util/test_config.cc \
@@ -4018,8 +3716,6 @@ ifneq ($(NO_DEPS),true)
 endif
 endif
 
-$(OBJDIR)/$(CONFIG)/test/cpp/util/test_config.o: 
-
 
 LIBGRPC++_TEST_UTIL_SRC = \
     $(GENDIR)/test/cpp/util/messages.pb.cc $(GENDIR)/test/cpp/util/messages.grpc.pb.cc \
@@ -4070,12 +3766,8 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBGRPC++_TEST_UTIL_OBJS:.o=.dep)
 endif
 endif
-
-
-
-
-$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_call.o:     $(GENDIR)/test/cpp/util/messages.pb.cc $(GENDIR)/test/cpp/util/messages.grpc.pb.cc    $(GENDIR)/test/cpp/util/echo.pb.cc $(GENDIR)/test/cpp/util/echo.grpc.pb.cc    $(GENDIR)/test/cpp/util/echo_duplicate.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.grpc.pb.cc
-$(OBJDIR)/$(CONFIG)/test/cpp/util/create_test_channel.o:     $(GENDIR)/test/cpp/util/messages.pb.cc $(GENDIR)/test/cpp/util/messages.grpc.pb.cc    $(GENDIR)/test/cpp/util/echo.pb.cc $(GENDIR)/test/cpp/util/echo.grpc.pb.cc    $(GENDIR)/test/cpp/util/echo_duplicate.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_call.o: $(GENDIR)/test/cpp/util/messages.pb.cc $(GENDIR)/test/cpp/util/messages.grpc.pb.cc $(GENDIR)/test/cpp/util/echo.pb.cc $(GENDIR)/test/cpp/util/echo.grpc.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/util/create_test_channel.o: $(GENDIR)/test/cpp/util/messages.pb.cc $(GENDIR)/test/cpp/util/messages.grpc.pb.cc $(GENDIR)/test/cpp/util/echo.pb.cc $(GENDIR)/test/cpp/util/echo.grpc.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.pb.cc $(GENDIR)/test/cpp/util/echo_duplicate.grpc.pb.cc
 
 
 LIBGRPC++_UNSECURE_SRC = \
@@ -4138,6 +3830,7 @@ PUBLIC_HEADERS_CXX += \
     include/grpc++/status_code_enum.h \
     include/grpc++/stream.h \
     include/grpc++/thread_pool_interface.h \
+    include/grpc++/time.h \
 
 LIBGRPC++_UNSECURE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_UNSECURE_SRC))))
 
@@ -4190,31 +3883,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBGRPC++_UNSECURE_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/channel.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/channel_arguments.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/client_context.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/client_unary_call.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/create_channel.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/generic_stub.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/insecure_credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/client/internal_stub.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/common/call.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/common/completion_queue.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/common/rpc_method.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/proto/proto_utils.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/async_generic_service.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/insecure_server_credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/server.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/server_builder.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/server_context.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/server_credentials.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/server/thread_pool.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/util/byte_buffer.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/util/slice.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/util/status.o: 
-$(OBJDIR)/$(CONFIG)/src/cpp/util/time.o: 
-
 
 LIBGRPC_PLUGIN_SUPPORT_SRC = \
     src/compiler/cpp_generator.cc \
@@ -4252,11 +3920,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBGRPC_PLUGIN_SUPPORT_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/src/compiler/cpp_generator.o: 
-$(OBJDIR)/$(CONFIG)/src/compiler/objective_c_generator.o: 
-$(OBJDIR)/$(CONFIG)/src/compiler/python_generator.o: 
-$(OBJDIR)/$(CONFIG)/src/compiler/ruby_generator.o: 
-
 
 LIBINTEROP_CLIENT_HELPER_SRC = \
     test/cpp/interop/client_helper.cc \
@@ -4304,8 +3967,6 @@ ifneq ($(NO_DEPS),true)
 endif
 endif
 
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/client_helper.o: 
-
 
 LIBINTEROP_CLIENT_MAIN_SRC = \
     $(GENDIR)/test/proto/empty.pb.cc $(GENDIR)/test/proto/empty.grpc.pb.cc \
@@ -4356,12 +4017,8 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBINTEROP_CLIENT_MAIN_OBJS:.o=.dep)
 endif
 endif
-
-
-
-
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/client.o:     $(GENDIR)/test/proto/empty.pb.cc $(GENDIR)/test/proto/empty.grpc.pb.cc    $(GENDIR)/test/proto/messages.pb.cc $(GENDIR)/test/proto/messages.grpc.pb.cc    $(GENDIR)/test/proto/test.pb.cc $(GENDIR)/test/proto/test.grpc.pb.cc
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_client.o:     $(GENDIR)/test/proto/empty.pb.cc $(GENDIR)/test/proto/empty.grpc.pb.cc    $(GENDIR)/test/proto/messages.pb.cc $(GENDIR)/test/proto/messages.grpc.pb.cc    $(GENDIR)/test/proto/test.pb.cc $(GENDIR)/test/proto/test.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/interop/client.o: $(GENDIR)/test/proto/empty.pb.cc $(GENDIR)/test/proto/empty.grpc.pb.cc $(GENDIR)/test/proto/messages.pb.cc $(GENDIR)/test/proto/messages.grpc.pb.cc $(GENDIR)/test/proto/test.pb.cc $(GENDIR)/test/proto/test.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_client.o: $(GENDIR)/test/proto/empty.pb.cc $(GENDIR)/test/proto/empty.grpc.pb.cc $(GENDIR)/test/proto/messages.pb.cc $(GENDIR)/test/proto/messages.grpc.pb.cc $(GENDIR)/test/proto/test.pb.cc $(GENDIR)/test/proto/test.grpc.pb.cc
 
 
 LIBINTEROP_SERVER_HELPER_SRC = \
@@ -4410,8 +4067,6 @@ ifneq ($(NO_DEPS),true)
 endif
 endif
 
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/server_helper.o: 
-
 
 LIBINTEROP_SERVER_MAIN_SRC = \
     $(GENDIR)/test/proto/empty.pb.cc $(GENDIR)/test/proto/empty.grpc.pb.cc \
@@ -4461,11 +4116,7 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBINTEROP_SERVER_MAIN_OBJS:.o=.dep)
 endif
 endif
-
-
-
-
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/server.o:     $(GENDIR)/test/proto/empty.pb.cc $(GENDIR)/test/proto/empty.grpc.pb.cc    $(GENDIR)/test/proto/messages.pb.cc $(GENDIR)/test/proto/messages.grpc.pb.cc    $(GENDIR)/test/proto/test.pb.cc $(GENDIR)/test/proto/test.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/interop/server.o: $(GENDIR)/test/proto/empty.pb.cc $(GENDIR)/test/proto/empty.grpc.pb.cc $(GENDIR)/test/proto/messages.pb.cc $(GENDIR)/test/proto/messages.grpc.pb.cc $(GENDIR)/test/proto/test.pb.cc $(GENDIR)/test/proto/test.grpc.pb.cc
 
 
 LIBPUBSUB_CLIENT_LIB_SRC = \
@@ -4517,12 +4168,8 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBPUBSUB_CLIENT_LIB_OBJS:.o=.dep)
 endif
 endif
-
-
-
-
-$(OBJDIR)/$(CONFIG)/examples/pubsub/publisher.o:     $(GENDIR)/examples/pubsub/label.pb.cc $(GENDIR)/examples/pubsub/label.grpc.pb.cc    $(GENDIR)/examples/pubsub/empty.pb.cc $(GENDIR)/examples/pubsub/empty.grpc.pb.cc    $(GENDIR)/examples/pubsub/pubsub.pb.cc $(GENDIR)/examples/pubsub/pubsub.grpc.pb.cc
-$(OBJDIR)/$(CONFIG)/examples/pubsub/subscriber.o:     $(GENDIR)/examples/pubsub/label.pb.cc $(GENDIR)/examples/pubsub/label.grpc.pb.cc    $(GENDIR)/examples/pubsub/empty.pb.cc $(GENDIR)/examples/pubsub/empty.grpc.pb.cc    $(GENDIR)/examples/pubsub/pubsub.pb.cc $(GENDIR)/examples/pubsub/pubsub.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/examples/pubsub/publisher.o: $(GENDIR)/examples/pubsub/label.pb.cc $(GENDIR)/examples/pubsub/label.grpc.pb.cc $(GENDIR)/examples/pubsub/empty.pb.cc $(GENDIR)/examples/pubsub/empty.grpc.pb.cc $(GENDIR)/examples/pubsub/pubsub.pb.cc $(GENDIR)/examples/pubsub/pubsub.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/examples/pubsub/subscriber.o: $(GENDIR)/examples/pubsub/label.pb.cc $(GENDIR)/examples/pubsub/label.grpc.pb.cc $(GENDIR)/examples/pubsub/empty.pb.cc $(GENDIR)/examples/pubsub/empty.grpc.pb.cc $(GENDIR)/examples/pubsub/pubsub.pb.cc $(GENDIR)/examples/pubsub/pubsub.grpc.pb.cc
 
 
 LIBQPS_SRC = \
@@ -4578,16 +4225,14 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBQPS_OBJS:.o=.dep)
 endif
 endif
-
-
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/driver.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_worker.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/report.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/timer.o:     $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/driver.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_worker.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/report.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/qps/timer.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc
 
 
 LIBGRPC_CSHARP_EXT_SRC = \
@@ -4648,8 +4293,6 @@ ifneq ($(NO_DEPS),true)
 endif
 endif
 
-$(OBJDIR)/$(CONFIG)/src/csharp/ext/grpc_csharp_ext.o: 
-
 
 LIBEND2END_FIXTURE_CHTTP2_FAKE_SECURITY_SRC = \
     test/core/end2end/fixtures/chttp2_fake_security.c \
@@ -4687,8 +4330,6 @@ ifneq ($(NO_DEPS),true)
 endif
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/fixtures/chttp2_fake_security.o: 
-
 
 LIBEND2END_FIXTURE_CHTTP2_FULLSTACK_SRC = \
     test/core/end2end/fixtures/chttp2_fullstack.c \
@@ -4712,8 +4353,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_FIXTURE_CHTTP2_FULLSTACK_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/fixtures/chttp2_fullstack.o: 
-
 
 LIBEND2END_FIXTURE_CHTTP2_FULLSTACK_UDS_SRC = \
     test/core/end2end/fixtures/chttp2_fullstack_uds.c \
@@ -4737,8 +4376,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_FIXTURE_CHTTP2_FULLSTACK_UDS_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/fixtures/chttp2_fullstack_uds.o: 
-
 
 LIBEND2END_FIXTURE_CHTTP2_SIMPLE_SSL_FULLSTACK_SRC = \
     test/core/end2end/fixtures/chttp2_simple_ssl_fullstack.c \
@@ -4776,8 +4413,6 @@ ifneq ($(NO_DEPS),true)
 endif
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack.o: 
-
 
 LIBEND2END_FIXTURE_CHTTP2_SIMPLE_SSL_WITH_OAUTH2_FULLSTACK_SRC = \
     test/core/end2end/fixtures/chttp2_simple_ssl_with_oauth2_fullstack.c \
@@ -4815,8 +4450,6 @@ ifneq ($(NO_DEPS),true)
 endif
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/fixtures/chttp2_simple_ssl_with_oauth2_fullstack.o: 
-
 
 LIBEND2END_FIXTURE_CHTTP2_SOCKET_PAIR_SRC = \
     test/core/end2end/fixtures/chttp2_socket_pair.c \
@@ -4840,8 +4473,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_FIXTURE_CHTTP2_SOCKET_PAIR_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/fixtures/chttp2_socket_pair.o: 
-
 
 LIBEND2END_FIXTURE_CHTTP2_SOCKET_PAIR_ONE_BYTE_AT_A_TIME_SRC = \
     test/core/end2end/fixtures/chttp2_socket_pair_one_byte_at_a_time.c \
@@ -4865,8 +4496,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_FIXTURE_CHTTP2_SOCKET_PAIR_ONE_BYTE_AT_A_TIME_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/fixtures/chttp2_socket_pair_one_byte_at_a_time.o: 
-
 
 LIBEND2END_TEST_BAD_HOSTNAME_SRC = \
     test/core/end2end/tests/bad_hostname.c \
@@ -4890,8 +4519,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_BAD_HOSTNAME_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/bad_hostname.o: 
-
 
 LIBEND2END_TEST_CANCEL_AFTER_ACCEPT_SRC = \
     test/core/end2end/tests/cancel_after_accept.c \
@@ -4915,8 +4542,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CANCEL_AFTER_ACCEPT_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/cancel_after_accept.o: 
-
 
 LIBEND2END_TEST_CANCEL_AFTER_ACCEPT_AND_WRITES_CLOSED_SRC = \
     test/core/end2end/tests/cancel_after_accept_and_writes_closed.c \
@@ -4940,8 +4565,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CANCEL_AFTER_ACCEPT_AND_WRITES_CLOSED_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/cancel_after_accept_and_writes_closed.o: 
-
 
 LIBEND2END_TEST_CANCEL_AFTER_ACCEPT_AND_WRITES_CLOSED_LEGACY_SRC = \
     test/core/end2end/tests/cancel_after_accept_and_writes_closed_legacy.c \
@@ -4965,8 +4588,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CANCEL_AFTER_ACCEPT_AND_WRITES_CLOSED_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/cancel_after_accept_and_writes_closed_legacy.o: 
-
 
 LIBEND2END_TEST_CANCEL_AFTER_ACCEPT_LEGACY_SRC = \
     test/core/end2end/tests/cancel_after_accept_legacy.c \
@@ -4990,8 +4611,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CANCEL_AFTER_ACCEPT_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/cancel_after_accept_legacy.o: 
-
 
 LIBEND2END_TEST_CANCEL_AFTER_INVOKE_SRC = \
     test/core/end2end/tests/cancel_after_invoke.c \
@@ -5015,8 +4634,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CANCEL_AFTER_INVOKE_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/cancel_after_invoke.o: 
-
 
 LIBEND2END_TEST_CANCEL_AFTER_INVOKE_LEGACY_SRC = \
     test/core/end2end/tests/cancel_after_invoke_legacy.c \
@@ -5040,8 +4657,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CANCEL_AFTER_INVOKE_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/cancel_after_invoke_legacy.o: 
-
 
 LIBEND2END_TEST_CANCEL_BEFORE_INVOKE_SRC = \
     test/core/end2end/tests/cancel_before_invoke.c \
@@ -5065,8 +4680,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CANCEL_BEFORE_INVOKE_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/cancel_before_invoke.o: 
-
 
 LIBEND2END_TEST_CANCEL_BEFORE_INVOKE_LEGACY_SRC = \
     test/core/end2end/tests/cancel_before_invoke_legacy.c \
@@ -5090,8 +4703,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CANCEL_BEFORE_INVOKE_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/cancel_before_invoke_legacy.o: 
-
 
 LIBEND2END_TEST_CANCEL_IN_A_VACUUM_SRC = \
     test/core/end2end/tests/cancel_in_a_vacuum.c \
@@ -5115,8 +4726,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CANCEL_IN_A_VACUUM_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/cancel_in_a_vacuum.o: 
-
 
 LIBEND2END_TEST_CANCEL_IN_A_VACUUM_LEGACY_SRC = \
     test/core/end2end/tests/cancel_in_a_vacuum_legacy.c \
@@ -5140,8 +4749,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CANCEL_IN_A_VACUUM_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/cancel_in_a_vacuum_legacy.o: 
-
 
 LIBEND2END_TEST_CENSUS_SIMPLE_REQUEST_SRC = \
     test/core/end2end/tests/census_simple_request.c \
@@ -5165,8 +4772,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CENSUS_SIMPLE_REQUEST_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/census_simple_request.o: 
-
 
 LIBEND2END_TEST_CENSUS_SIMPLE_REQUEST_LEGACY_SRC = \
     test/core/end2end/tests/census_simple_request_legacy.c \
@@ -5190,8 +4795,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_CENSUS_SIMPLE_REQUEST_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/census_simple_request_legacy.o: 
-
 
 LIBEND2END_TEST_DISAPPEARING_SERVER_SRC = \
     test/core/end2end/tests/disappearing_server.c \
@@ -5215,8 +4818,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_DISAPPEARING_SERVER_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/disappearing_server.o: 
-
 
 LIBEND2END_TEST_DISAPPEARING_SERVER_LEGACY_SRC = \
     test/core/end2end/tests/disappearing_server_legacy.c \
@@ -5240,8 +4841,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_DISAPPEARING_SERVER_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/disappearing_server_legacy.o: 
-
 
 LIBEND2END_TEST_EARLY_SERVER_SHUTDOWN_FINISHES_INFLIGHT_CALLS_SRC = \
     test/core/end2end/tests/early_server_shutdown_finishes_inflight_calls.c \
@@ -5265,8 +4864,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_EARLY_SERVER_SHUTDOWN_FINISHES_INFLIGHT_CALLS_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/early_server_shutdown_finishes_inflight_calls.o: 
-
 
 LIBEND2END_TEST_EARLY_SERVER_SHUTDOWN_FINISHES_INFLIGHT_CALLS_LEGACY_SRC = \
     test/core/end2end/tests/early_server_shutdown_finishes_inflight_calls_legacy.c \
@@ -5290,8 +4887,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_EARLY_SERVER_SHUTDOWN_FINISHES_INFLIGHT_CALLS_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/early_server_shutdown_finishes_inflight_calls_legacy.o: 
-
 
 LIBEND2END_TEST_EARLY_SERVER_SHUTDOWN_FINISHES_TAGS_SRC = \
     test/core/end2end/tests/early_server_shutdown_finishes_tags.c \
@@ -5315,8 +4910,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_EARLY_SERVER_SHUTDOWN_FINISHES_TAGS_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/early_server_shutdown_finishes_tags.o: 
-
 
 LIBEND2END_TEST_EARLY_SERVER_SHUTDOWN_FINISHES_TAGS_LEGACY_SRC = \
     test/core/end2end/tests/early_server_shutdown_finishes_tags_legacy.c \
@@ -5340,8 +4933,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_EARLY_SERVER_SHUTDOWN_FINISHES_TAGS_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/early_server_shutdown_finishes_tags_legacy.o: 
-
 
 LIBEND2END_TEST_EMPTY_BATCH_SRC = \
     test/core/end2end/tests/empty_batch.c \
@@ -5365,8 +4956,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_EMPTY_BATCH_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/empty_batch.o: 
-
 
 LIBEND2END_TEST_GRACEFUL_SERVER_SHUTDOWN_SRC = \
     test/core/end2end/tests/graceful_server_shutdown.c \
@@ -5390,8 +4979,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_GRACEFUL_SERVER_SHUTDOWN_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/graceful_server_shutdown.o: 
-
 
 LIBEND2END_TEST_GRACEFUL_SERVER_SHUTDOWN_LEGACY_SRC = \
     test/core/end2end/tests/graceful_server_shutdown_legacy.c \
@@ -5415,8 +5002,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_GRACEFUL_SERVER_SHUTDOWN_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/graceful_server_shutdown_legacy.o: 
-
 
 LIBEND2END_TEST_INVOKE_LARGE_REQUEST_SRC = \
     test/core/end2end/tests/invoke_large_request.c \
@@ -5440,8 +5025,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_INVOKE_LARGE_REQUEST_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/invoke_large_request.o: 
-
 
 LIBEND2END_TEST_INVOKE_LARGE_REQUEST_LEGACY_SRC = \
     test/core/end2end/tests/invoke_large_request_legacy.c \
@@ -5465,8 +5048,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_INVOKE_LARGE_REQUEST_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/invoke_large_request_legacy.o: 
-
 
 LIBEND2END_TEST_MAX_CONCURRENT_STREAMS_SRC = \
     test/core/end2end/tests/max_concurrent_streams.c \
@@ -5490,8 +5071,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_MAX_CONCURRENT_STREAMS_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/max_concurrent_streams.o: 
-
 
 LIBEND2END_TEST_MAX_CONCURRENT_STREAMS_LEGACY_SRC = \
     test/core/end2end/tests/max_concurrent_streams_legacy.c \
@@ -5515,8 +5094,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_MAX_CONCURRENT_STREAMS_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/max_concurrent_streams_legacy.o: 
-
 
 LIBEND2END_TEST_NO_OP_SRC = \
     test/core/end2end/tests/no_op.c \
@@ -5540,8 +5117,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_NO_OP_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/no_op.o: 
-
 
 LIBEND2END_TEST_NO_OP_LEGACY_SRC = \
     test/core/end2end/tests/no_op_legacy.c \
@@ -5565,8 +5140,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_NO_OP_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/no_op_legacy.o: 
-
 
 LIBEND2END_TEST_PING_PONG_STREAMING_SRC = \
     test/core/end2end/tests/ping_pong_streaming.c \
@@ -5590,8 +5163,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_PING_PONG_STREAMING_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/ping_pong_streaming.o: 
-
 
 LIBEND2END_TEST_PING_PONG_STREAMING_LEGACY_SRC = \
     test/core/end2end/tests/ping_pong_streaming_legacy.c \
@@ -5615,8 +5186,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_PING_PONG_STREAMING_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/ping_pong_streaming_legacy.o: 
-
 
 LIBEND2END_TEST_REGISTERED_CALL_SRC = \
     test/core/end2end/tests/registered_call.c \
@@ -5640,8 +5209,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REGISTERED_CALL_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/registered_call.o: 
-
 
 LIBEND2END_TEST_REQUEST_RESPONSE_WITH_BINARY_METADATA_AND_PAYLOAD_SRC = \
     test/core/end2end/tests/request_response_with_binary_metadata_and_payload.c \
@@ -5665,8 +5232,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REQUEST_RESPONSE_WITH_BINARY_METADATA_AND_PAYLOAD_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/request_response_with_binary_metadata_and_payload.o: 
-
 
 LIBEND2END_TEST_REQUEST_RESPONSE_WITH_BINARY_METADATA_AND_PAYLOAD_LEGACY_SRC = \
     test/core/end2end/tests/request_response_with_binary_metadata_and_payload_legacy.c \
@@ -5690,8 +5255,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REQUEST_RESPONSE_WITH_BINARY_METADATA_AND_PAYLOAD_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/request_response_with_binary_metadata_and_payload_legacy.o: 
-
 
 LIBEND2END_TEST_REQUEST_RESPONSE_WITH_METADATA_AND_PAYLOAD_SRC = \
     test/core/end2end/tests/request_response_with_metadata_and_payload.c \
@@ -5715,8 +5278,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REQUEST_RESPONSE_WITH_METADATA_AND_PAYLOAD_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/request_response_with_metadata_and_payload.o: 
-
 
 LIBEND2END_TEST_REQUEST_RESPONSE_WITH_METADATA_AND_PAYLOAD_LEGACY_SRC = \
     test/core/end2end/tests/request_response_with_metadata_and_payload_legacy.c \
@@ -5740,8 +5301,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REQUEST_RESPONSE_WITH_METADATA_AND_PAYLOAD_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/request_response_with_metadata_and_payload_legacy.o: 
-
 
 LIBEND2END_TEST_REQUEST_RESPONSE_WITH_PAYLOAD_SRC = \
     test/core/end2end/tests/request_response_with_payload.c \
@@ -5765,8 +5324,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REQUEST_RESPONSE_WITH_PAYLOAD_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/request_response_with_payload.o: 
-
 
 LIBEND2END_TEST_REQUEST_RESPONSE_WITH_PAYLOAD_LEGACY_SRC = \
     test/core/end2end/tests/request_response_with_payload_legacy.c \
@@ -5790,8 +5347,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REQUEST_RESPONSE_WITH_PAYLOAD_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/request_response_with_payload_legacy.o: 
-
 
 LIBEND2END_TEST_REQUEST_RESPONSE_WITH_TRAILING_METADATA_AND_PAYLOAD_LEGACY_SRC = \
     test/core/end2end/tests/request_response_with_trailing_metadata_and_payload_legacy.c \
@@ -5815,8 +5370,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REQUEST_RESPONSE_WITH_TRAILING_METADATA_AND_PAYLOAD_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/request_response_with_trailing_metadata_and_payload_legacy.o: 
-
 
 LIBEND2END_TEST_REQUEST_WITH_LARGE_METADATA_SRC = \
     test/core/end2end/tests/request_with_large_metadata.c \
@@ -5840,8 +5393,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REQUEST_WITH_LARGE_METADATA_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/request_with_large_metadata.o: 
-
 
 LIBEND2END_TEST_REQUEST_WITH_LARGE_METADATA_LEGACY_SRC = \
     test/core/end2end/tests/request_with_large_metadata_legacy.c \
@@ -5865,8 +5416,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REQUEST_WITH_LARGE_METADATA_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/request_with_large_metadata_legacy.o: 
-
 
 LIBEND2END_TEST_REQUEST_WITH_PAYLOAD_SRC = \
     test/core/end2end/tests/request_with_payload.c \
@@ -5890,8 +5439,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REQUEST_WITH_PAYLOAD_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/request_with_payload.o: 
-
 
 LIBEND2END_TEST_REQUEST_WITH_PAYLOAD_LEGACY_SRC = \
     test/core/end2end/tests/request_with_payload_legacy.c \
@@ -5915,8 +5462,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_REQUEST_WITH_PAYLOAD_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/request_with_payload_legacy.o: 
-
 
 LIBEND2END_TEST_SIMPLE_DELAYED_REQUEST_SRC = \
     test/core/end2end/tests/simple_delayed_request.c \
@@ -5940,8 +5485,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_SIMPLE_DELAYED_REQUEST_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/simple_delayed_request.o: 
-
 
 LIBEND2END_TEST_SIMPLE_DELAYED_REQUEST_LEGACY_SRC = \
     test/core/end2end/tests/simple_delayed_request_legacy.c \
@@ -5965,8 +5508,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_SIMPLE_DELAYED_REQUEST_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/simple_delayed_request_legacy.o: 
-
 
 LIBEND2END_TEST_SIMPLE_REQUEST_SRC = \
     test/core/end2end/tests/simple_request.c \
@@ -5990,8 +5531,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_SIMPLE_REQUEST_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/simple_request.o: 
-
 
 LIBEND2END_TEST_SIMPLE_REQUEST_LEGACY_SRC = \
     test/core/end2end/tests/simple_request_legacy.c \
@@ -6015,8 +5554,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_SIMPLE_REQUEST_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/simple_request_legacy.o: 
-
 
 LIBEND2END_TEST_THREAD_STRESS_SRC = \
     test/core/end2end/tests/thread_stress.c \
@@ -6040,8 +5577,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_THREAD_STRESS_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/thread_stress.o: 
-
 
 LIBEND2END_TEST_THREAD_STRESS_LEGACY_SRC = \
     test/core/end2end/tests/thread_stress_legacy.c \
@@ -6065,8 +5600,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_THREAD_STRESS_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/thread_stress_legacy.o: 
-
 
 LIBEND2END_TEST_WRITES_DONE_HANGS_WITH_PENDING_READ_SRC = \
     test/core/end2end/tests/writes_done_hangs_with_pending_read.c \
@@ -6090,8 +5623,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_WRITES_DONE_HANGS_WITH_PENDING_READ_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/writes_done_hangs_with_pending_read.o: 
-
 
 LIBEND2END_TEST_WRITES_DONE_HANGS_WITH_PENDING_READ_LEGACY_SRC = \
     test/core/end2end/tests/writes_done_hangs_with_pending_read_legacy.c \
@@ -6115,8 +5646,6 @@ ifneq ($(NO_DEPS),true)
 -include $(LIBEND2END_TEST_WRITES_DONE_HANGS_WITH_PENDING_READ_LEGACY_OBJS:.o=.dep)
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/tests/writes_done_hangs_with_pending_read_legacy.o: 
-
 
 LIBEND2END_CERTS_SRC = \
     test/core/end2end/data/test_root_cert.c \
@@ -6156,10 +5685,6 @@ ifneq ($(NO_DEPS),true)
 endif
 endif
 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: 
-$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: 
-
 
 
 # All of the test targets, and protoc plugins
diff --git a/build.json b/build.json
index 5144bb74b6222b76a95bd9ce99312c80d0302bc8..e072ed67c3c790c3a75c5809038d128003a663f8 100644
--- a/build.json
+++ b/build.json
@@ -47,13 +47,13 @@
         "include/grpc++/status.h",
         "include/grpc++/status_code_enum.h",
         "include/grpc++/stream.h",
-        "include/grpc++/thread_pool_interface.h"
+        "include/grpc++/thread_pool_interface.h",
+        "include/grpc++/time.h"
       ],
       "headers": [
         "src/cpp/client/channel.h",
         "src/cpp/proto/proto_utils.h",
-        "src/cpp/server/thread_pool.h",
-        "src/cpp/util/time.h"
+        "src/cpp/server/thread_pool.h"
       ],
       "src": [
         "src/cpp/client/channel.cc",
diff --git a/examples/pubsub/main.cc b/examples/pubsub/main.cc
index 3a403481fcd81facd0d1ef9ebffce2aa9733dda0..68620e64c5c280f63632fa68c6f5bdd56b439a49 100644
--- a/examples/pubsub/main.cc
+++ b/examples/pubsub/main.cc
@@ -31,7 +31,6 @@
  *
  */
 
-#include <chrono>
 #include <fstream>
 #include <memory>
 #include <sstream>
diff --git a/include/grpc++/client_context.h b/include/grpc++/client_context.h
index 4e7f5a7be0e5d34d1cc1004f2e2149c2727a8904..a58e9872e6097ad1886afc0adeda28e095d4a8f9 100644
--- a/include/grpc++/client_context.h
+++ b/include/grpc++/client_context.h
@@ -34,15 +34,14 @@
 #ifndef GRPCXX_CLIENT_CONTEXT_H
 #define GRPCXX_CLIENT_CONTEXT_H
 
-#include <chrono>
 #include <map>
+#include <memory>
 #include <string>
 
 #include <grpc/support/log.h>
 #include <grpc/support/time.h>
 #include <grpc++/config.h>
-
-using std::chrono::system_clock;
+#include <grpc++/time.h>
 
 struct grpc_call;
 struct grpc_completion_queue;
@@ -87,8 +86,19 @@ class ClientContext {
     return trailing_metadata_;
   }
 
-  void set_absolute_deadline(const system_clock::time_point& deadline);
-  system_clock::time_point absolute_deadline();
+  template <typename T>
+  void set_deadline(const T& deadline) {
+    TimePoint<T> deadline_tp(deadline);
+    deadline_ = deadline_tp.raw_time();
+  }
+
+#ifndef GRPC_CXX0X_NO_CHRONO
+  std::chrono::system_clock::time_point deadline() {
+    return Timespec2Timepoint(deadline_);
+  }
+#endif  // !GRPC_CXX0X_NO_CHRONO
+
+  gpr_timespec raw_deadline() { return deadline_; }
 
   void set_authority(const grpc::string& authority) { authority_ = authority; }
 
@@ -117,22 +127,22 @@ class ClientContext {
   friend class ::grpc::ClientAsyncResponseReader;
 
   grpc_call* call() { return call_; }
-  void set_call(grpc_call* call) {
+  void set_call(grpc_call* call, const std::shared_ptr<ChannelInterface>& channel) {
     GPR_ASSERT(call_ == nullptr);
     call_ = call;
+    channel_ = channel;
   }
 
   grpc_completion_queue* cq() { return cq_; }
   void set_cq(grpc_completion_queue* cq) { cq_ = cq; }
 
-  gpr_timespec RawDeadline() { return absolute_deadline_; }
-
   grpc::string authority() { return authority_; }
 
   bool initial_metadata_received_;
+  std::shared_ptr<ChannelInterface> channel_;
   grpc_call* call_;
   grpc_completion_queue* cq_;
-  gpr_timespec absolute_deadline_;
+  gpr_timespec deadline_;
   grpc::string authority_;
   std::multimap<grpc::string, grpc::string> send_initial_metadata_;
   std::multimap<grpc::string, grpc::string> recv_initial_metadata_;
diff --git a/include/grpc++/completion_queue.h b/include/grpc++/completion_queue.h
index 0a2a7687b75eb8e49fd33b13f3dfa2de20361613..5c2b1cce93d1557f9c139598be6d930834d268df 100644
--- a/include/grpc++/completion_queue.h
+++ b/include/grpc++/completion_queue.h
@@ -34,10 +34,10 @@
 #ifndef GRPCXX_COMPLETION_QUEUE_H
 #define GRPCXX_COMPLETION_QUEUE_H
 
-#include <chrono>
+#include <grpc/support/time.h>
 #include <grpc++/impl/client_unary_call.h>
 #include <grpc++/impl/grpc_library.h>
-#include <grpc/support/time.h>
+#include <grpc++/time.h>
 
 struct grpc_completion_queue;
 
@@ -83,10 +83,13 @@ class CompletionQueue : public GrpcLibrary {
 
   // Nonblocking (until deadline) read from queue.
   // Cannot rely on result of tag or ok if return is TIMEOUT
-  NextStatus AsyncNext(void** tag, bool* ok,
-                       std::chrono::system_clock::time_point deadline);
+  template<typename T>
+  NextStatus AsyncNext(void** tag, bool* ok, const T& deadline) {
+    TimePoint<T> deadline_tp(deadline);
+    return AsyncNextInternal(tag, ok, deadline_tp.raw_time());
+  }
 
-  // Blocking (until deadline) read from queue.
+  // Blocking read from queue.
   // Returns false if the queue is ready for destruction, true if event
 
   bool Next(void** tag, bool* ok) {
diff --git a/include/grpc++/credentials.h b/include/grpc++/credentials.h
index cbf94457508f7727f6cf06d383d8849683d2921b..61c40946910301cd35f205c58d17addfd69d1775 100644
--- a/include/grpc++/credentials.h
+++ b/include/grpc++/credentials.h
@@ -34,7 +34,6 @@
 #ifndef GRPCXX_CREDENTIALS_H
 #define GRPCXX_CREDENTIALS_H
 
-#include <chrono>
 #include <memory>
 
 #include <grpc++/config.h>
@@ -99,20 +98,20 @@ std::unique_ptr<Credentials> ComputeEngineCredentials();
 // Builds service account credentials.
 // json_key is the JSON key string containing the client's private key.
 // scope is a space-delimited list of the requested permissions.
-// token_lifetime is the lifetime of each token acquired through this service
-// account credentials. It should be positive and should not exceed
-// grpc_max_auth_token_lifetime or will be cropped to this value.
+// token_lifetime_seconds is the lifetime in seconds of each token acquired
+// through this service account credentials. It should be positive and should
+// not exceed grpc_max_auth_token_lifetime or will be cropped to this value.
 std::unique_ptr<Credentials> ServiceAccountCredentials(
     const grpc::string& json_key, const grpc::string& scope,
-    std::chrono::seconds token_lifetime);
+    long token_lifetime_seconds);
 
 // Builds JWT credentials.
 // json_key is the JSON key string containing the client's private key.
-// token_lifetime is the lifetime of each Json Web Token (JWT) created with
-// this credentials.  It should not exceed grpc_max_auth_token_lifetime or
-// will be cropped to this value.
+// token_lifetime_seconds is the lifetime in seconds of each Json Web Token
+// (JWT) created with this credentials. It should not exceed
+// grpc_max_auth_token_lifetime or will be cropped to this value.
 std::unique_ptr<Credentials> JWTCredentials(
-    const grpc::string& json_key, std::chrono::seconds token_lifetime);
+    const grpc::string& json_key, long token_lifetime_seconds);
 
 // Builds refresh token credentials.
 // json_refresh_token is the JSON string containing the refresh token along
diff --git a/include/grpc++/server_context.h b/include/grpc++/server_context.h
index 9e3b80c6411d4d810a84742ac4c60ab16b242aac..a62babd93163535b3382670c38e81dd13c685e6f 100644
--- a/include/grpc++/server_context.h
+++ b/include/grpc++/server_context.h
@@ -34,10 +34,11 @@
 #ifndef GRPCXX_SERVER_CONTEXT_H
 #define GRPCXX_SERVER_CONTEXT_H
 
-#include <chrono>
 #include <map>
 
+#include <grpc/support/time.h>
 #include <grpc++/config.h>
+#include <grpc++/time.h>
 
 struct gpr_timespec;
 struct grpc_metadata;
@@ -71,9 +72,13 @@ class ServerContext {
   ServerContext();  // for async calls
   ~ServerContext();
 
-  std::chrono::system_clock::time_point absolute_deadline() {
-    return deadline_;
+#ifndef GRPC_CXX0X_NO_CHRONO
+  std::chrono::system_clock::time_point deadline() {
+    return Timespec2Timepoint(deadline_);
   }
+#endif  // !GRPC_CXX0X_NO_CHRONO
+
+  gpr_timespec raw_deadline() { return deadline_; }
 
   void AddInitialMetadata(const grpc::string& key, const grpc::string& value);
   void AddTrailingMetadata(const grpc::string& key, const grpc::string& value);
@@ -110,7 +115,7 @@ class ServerContext {
 
   CompletionOp* completion_op_;
 
-  std::chrono::system_clock::time_point deadline_;
+  gpr_timespec deadline_;
   grpc_call* call_;
   CompletionQueue* cq_;
   bool sent_initial_metadata_;
diff --git a/src/cpp/util/time.h b/include/grpc++/time.h
similarity index 56%
rename from src/cpp/util/time.h
rename to include/grpc++/time.h
index 8b7fcf55f78ea564f77df3ccbf799498e27723f2..f9b2ce5cab1f4f90f77b78ca679312f8bc4bf0dd 100644
--- a/src/cpp/util/time.h
+++ b/include/grpc++/time.h
@@ -31,8 +31,50 @@
  *
  */
 
-#ifndef GRPC_INTERNAL_CPP_UTIL_TIME_H
-#define GRPC_INTERNAL_CPP_UTIL_TIME_H
+#ifndef GRPCXX_TIME_H
+#define GRPCXX_TIME_H
+
+#include <grpc++/config.h>
+
+namespace grpc {
+
+/* If you are trying to use CompletionQueue::AsyncNext with a time class that
+   isn't either gpr_timespec or std::chrono::system_clock::time_point, you
+   will most likely be looking at this comment as your compiler will have
+   fired an error below. In order to fix this issue, you have two potential
+   solutions:
+
+     1. Use gpr_timespec or std::chrono::system_clock::time_point instead
+     2. Specialize the TimePoint class with whichever time class that you
+        want to use here. See below for two examples of how to do this.
+ */
+
+template <typename T>
+class TimePoint {
+ public:
+  TimePoint(const T& time) {
+    you_need_a_specialization_of_TimePoint();
+  }
+  gpr_timespec raw_time() {
+    gpr_timespec t;
+    return t;
+  }
+ private:
+  void you_need_a_specialization_of_TimePoint();
+};
+
+template<>
+class TimePoint<gpr_timespec> {
+ public:
+  TimePoint(const gpr_timespec& time) : time_(time) { }
+  gpr_timespec raw_time() { return time_; }
+ private:
+  gpr_timespec time_;
+};
+
+}  // namespace grpc
+
+#ifndef GRPC_CXX0X_NO_CHRONO
 
 #include <chrono>
 
@@ -46,6 +88,19 @@ void Timepoint2Timespec(const std::chrono::system_clock::time_point& from,
 
 std::chrono::system_clock::time_point Timespec2Timepoint(gpr_timespec t);
 
+template <>
+class TimePoint<std::chrono::system_clock::time_point> {
+ public:
+  TimePoint(const std::chrono::system_clock::time_point& time) {
+	Timepoint2Timespec(time, &time_);
+  }
+  gpr_timespec raw_time() const { return time_; }
+ private:
+  gpr_timespec time_;
+};
+
 }  // namespace grpc
 
-#endif  // GRPC_INTERNAL_CPP_UTIL_TIME_H
+#endif  // !GRPC_CXX0X_NO_CHRONO
+
+#endif  // GRPCXX_TIME_H
diff --git a/include/grpc/support/tls.h b/include/grpc/support/tls.h
index 1077fdec295f70003ebe27bbf80e8ef9eb42240b..8dffd5225597de511ba7a082d49b661793faa4a4 100644
--- a/include/grpc/support/tls.h
+++ b/include/grpc/support/tls.h
@@ -44,7 +44,7 @@
    Thread locals have type gpr_intptr.
 
    Declaring a thread local variable 'foo':
-     GPR_TLS_DECL(foo, initial_value);
+     GPR_TLS_DECL(foo);
    Thread locals always have static scope.
 
    Initializing a thread local (must be done at library initialization 
diff --git a/src/core/iomgr/pollset_multipoller_with_poll_posix.c b/src/core/iomgr/pollset_multipoller_with_poll_posix.c
index bcef7c35b5da8dd04bf83e40be8e9ad671203f0b..25b7cfda1a16d5cf5e5d609167eb0ffa5ca90b19 100644
--- a/src/core/iomgr/pollset_multipoller_with_poll_posix.c
+++ b/src/core/iomgr/pollset_multipoller_with_poll_posix.c
@@ -203,7 +203,7 @@ static int multipoll_with_poll_pollset_maybe_work(
 }
 
 static void multipoll_with_poll_pollset_kick(grpc_pollset *p) {
-  grpc_pollset_kick_kick(&p->kick_state);
+  grpc_pollset_force_kick(p);
 }
 
 static void multipoll_with_poll_pollset_destroy(grpc_pollset *pollset) {
diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c
index 03fd94f136424c0091b2ee19d7063b168825b524..60d0dad6d87bc7f34c234e6b9e89f7bdee6cd350 100644
--- a/src/core/iomgr/pollset_posix.c
+++ b/src/core/iomgr/pollset_posix.c
@@ -47,9 +47,11 @@
 #include "src/core/iomgr/fd_posix.h"
 #include "src/core/iomgr/iomgr_internal.h"
 #include "src/core/iomgr/socket_utils_posix.h"
+#include "src/core/profiling/timers.h"
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpc/support/thd.h>
+#include <grpc/support/tls.h>
 #include <grpc/support/useful.h>
 
 static grpc_pollset g_backup_pollset;
@@ -57,6 +59,8 @@ static int g_shutdown_backup_poller;
 static gpr_event g_backup_poller_done;
 static gpr_event g_backup_pollset_shutdown_done;
 
+GPR_TLS_DECL(g_current_thread_poller);
+
 static void backup_poller(void *p) {
   gpr_timespec delta = gpr_time_from_millis(100);
   gpr_timespec last_poll = gpr_now();
@@ -76,17 +80,21 @@ static void backup_poller(void *p) {
 }
 
 void grpc_pollset_kick(grpc_pollset *p) {
-  if (p->counter) {
+  if (gpr_tls_get(&g_current_thread_poller) != (gpr_intptr)p && p->counter) {
     p->vtable->kick(p);
   }
 }
 
 void grpc_pollset_force_kick(grpc_pollset *p) {
-  grpc_pollset_kick_kick(&p->kick_state);
+  if (gpr_tls_get(&g_current_thread_poller) != (gpr_intptr)p) {
+    grpc_pollset_kick_kick(&p->kick_state);
+  }
 }
 
 static void kick_using_pollset_kick(grpc_pollset *p) {
-  grpc_pollset_kick_kick(&p->kick_state);
+  if (gpr_tls_get(&g_current_thread_poller) != (gpr_intptr)p) {
+    grpc_pollset_kick_kick(&p->kick_state);
+  }
 }
 
 /* global state management */
@@ -96,6 +104,8 @@ grpc_pollset *grpc_backup_pollset(void) { return &g_backup_pollset; }
 void grpc_pollset_global_init(void) {
   gpr_thd_id id;
 
+  gpr_tls_init(&g_current_thread_poller);
+
   /* Initialize kick fd state */
   grpc_pollset_kick_global_init();
 
@@ -129,6 +139,8 @@ void grpc_pollset_global_shutdown(void) {
 
   /* destroy the kick pipes */
   grpc_pollset_kick_global_destroy();
+
+  gpr_tls_destroy(&g_current_thread_poller);
 }
 
 /* main interface */
@@ -161,8 +173,8 @@ void grpc_pollset_del_fd(grpc_pollset *pollset, grpc_fd *fd) {
 
 int grpc_pollset_work(grpc_pollset *pollset, gpr_timespec deadline) {
   /* pollset->mu already held */
-  gpr_timespec now;
-  now = gpr_now();
+  gpr_timespec now = gpr_now();
+  int r;
   if (gpr_time_cmp(now, deadline) > 0) {
     return 0;
   }
@@ -172,7 +184,10 @@ int grpc_pollset_work(grpc_pollset *pollset, gpr_timespec deadline) {
   if (grpc_alarm_check(&pollset->mu, now, &deadline)) {
     return 1;
   }
-  return pollset->vtable->maybe_work(pollset, deadline, now, 1);
+  gpr_tls_set(&g_current_thread_poller, (gpr_intptr)pollset);
+  r = pollset->vtable->maybe_work(pollset, deadline, now, 1);
+  gpr_tls_set(&g_current_thread_poller, 0);
+  return r;
 }
 
 void grpc_pollset_shutdown(grpc_pollset *pollset,
@@ -396,6 +411,7 @@ static int unary_poll_pollset_maybe_work(grpc_pollset *pollset,
   pfd[1].events = grpc_fd_begin_poll(fd, pollset, POLLIN, POLLOUT, &fd_watcher);
 
   r = poll(pfd, GPR_ARRAY_SIZE(pfd), timeout);
+  GRPC_TIMER_MARK(POLL_FINISHED, r);
 
   grpc_fd_end_poll(&fd_watcher);
 
diff --git a/src/core/iomgr/resolve_address_windows.c b/src/core/iomgr/resolve_address_windows.c
index ac31dadd9d78faae8fca27433b6f4b4c512d007d..9b416dfe8aa54febf41ebe4fa0964d08db3f5691 100644
--- a/src/core/iomgr/resolve_address_windows.c
+++ b/src/core/iomgr/resolve_address_windows.c
@@ -65,7 +65,6 @@ grpc_resolved_addresses *grpc_blocking_resolve_address(
   int s;
   size_t i;
   grpc_resolved_addresses *addrs = NULL;
-  const gpr_timespec start_time = gpr_now();
 
   /* parse name, splitting it into host and port parts */
   gpr_split_host_port(name, &host, &port);
@@ -108,9 +107,6 @@ grpc_resolved_addresses *grpc_blocking_resolve_address(
   }
 
   {
-    const gpr_timespec delay = gpr_time_sub(gpr_now(), start_time);
-    const int delay_ms =
-        delay.tv_sec * GPR_MS_PER_SEC + delay.tv_nsec / GPR_NS_PER_MS;
     for (i = 0; i < addrs->naddrs; i++) {
       char *buf;
       grpc_sockaddr_to_string(&buf, (struct sockaddr *)&addrs->addrs[i].addr,
diff --git a/src/core/iomgr/tcp_server_windows.c b/src/core/iomgr/tcp_server_windows.c
index 6e10da97ccb5cf4656952a18b0932275dc599965..fe92846a71622739523f151b4fd27b5c350d9157 100644
--- a/src/core/iomgr/tcp_server_windows.c
+++ b/src/core/iomgr/tcp_server_windows.c
@@ -192,7 +192,7 @@ static void start_accept(server_port *port) {
   }
 
   /* TODO(jtattermusch): probably a race here, we regularly get use-after-free on server shutdown */
-  GPR_ASSERT(port->socket != 0xfeeefeee);
+  GPR_ASSERT(port->socket != (grpc_winsocket*)0xfeeefeee);
   success = port->AcceptEx(port->socket->socket, sock, port->addresses, 0,
                            addrlen, addrlen, &bytes_received,
                            &port->socket->read_info.overlapped);
diff --git a/src/core/surface/server.c b/src/core/surface/server.c
index e7719298701c32a3c784e4662a43f09824eb8f2d..3b129039bbf3a84b5333ffcc8ce15821ed05a7a1 100644
--- a/src/core/surface/server.c
+++ b/src/core/surface/server.c
@@ -1083,6 +1083,7 @@ static void begin_call(grpc_server *server, call_data *calld,
             &rc->data.batch.details->host_capacity, calld->host);
       cpstr(&rc->data.batch.details->method,
             &rc->data.batch.details->method_capacity, calld->path);
+      rc->data.batch.details->deadline = calld->deadline;
       grpc_call_set_completion_queue(calld->call, rc->data.batch.cq_bind);
       *rc->data.batch.call = calld->call;
       r->op = GRPC_IOREQ_RECV_INITIAL_METADATA;
diff --git a/src/core/tsi/ssl_transport_security.c b/src/core/tsi/ssl_transport_security.c
index 018ddc4456399fc79bf502ae9621bfffa733051b..b7c2859a1c9f09140f1ae31a85fc0099837943a3 100644
--- a/src/core/tsi/ssl_transport_security.c
+++ b/src/core/tsi/ssl_transport_security.c
@@ -34,6 +34,7 @@
 #include "src/core/tsi/ssl_transport_security.h"
 
 #include <limits.h>
+#include <string.h>
 
 #include <grpc/support/log.h>
 #include <grpc/support/sync.h>
diff --git a/src/cpp/client/channel.cc b/src/cpp/client/channel.cc
index 478f223322b88ecc5b6ef252bf554bd616930075..c541ddfb487ac43f0cb60d95167e2f732326aa7a 100644
--- a/src/cpp/client/channel.cc
+++ b/src/cpp/client/channel.cc
@@ -33,7 +33,6 @@
 
 #include "src/cpp/client/channel.h"
 
-#include <chrono>
 #include <memory>
 
 #include <grpc/grpc.h>
@@ -65,14 +64,14 @@ Call Channel::CreateCall(const RpcMethod& method, ClientContext* context,
       method.channel_tag()
           ? grpc_channel_create_registered_call(c_channel_, cq->cq(),
                                                 method.channel_tag(),
-                                                context->RawDeadline())
+                                                context->raw_deadline())
           : grpc_channel_create_call(c_channel_, cq->cq(), method.name(),
                                      context->authority().empty()
                                          ? target_.c_str()
                                          : context->authority().c_str(),
-                                     context->RawDeadline());
+                                     context->raw_deadline());
   GRPC_TIMER_MARK(CALL_CREATED, c_call);
-  context->set_call(c_call);
+  context->set_call(c_call, shared_from_this());
   return Call(c_call, this, cq);
 }
 
diff --git a/src/cpp/client/channel.h b/src/cpp/client/channel.h
index cd239247c8270c9518f39d27a068515c5dd31353..46009d20bad7692f3af5a0a74b6c3c0f354da80c 100644
--- a/src/cpp/client/channel.h
+++ b/src/cpp/client/channel.h
@@ -51,6 +51,7 @@ class Credentials;
 class StreamContextInterface;
 
 class Channel GRPC_FINAL : public GrpcLibrary,
+                           public std::enable_shared_from_this<Channel>,
                            public ChannelInterface {
  public:
   Channel(const grpc::string& target, grpc_channel* c_channel);
diff --git a/src/cpp/client/client_context.cc b/src/cpp/client/client_context.cc
index de9f8c7201da6e770f4f12086d1a9cb0ee2b21ae..70c9cb4c3b4edd8d151391fb2b5e53a27a1afc77 100644
--- a/src/cpp/client/client_context.cc
+++ b/src/cpp/client/client_context.cc
@@ -34,9 +34,7 @@
 #include <grpc++/client_context.h>
 
 #include <grpc/grpc.h>
-#include "src/cpp/util/time.h"
-
-using std::chrono::system_clock;
+#include <grpc++/time.h>
 
 namespace grpc {
 
@@ -44,7 +42,7 @@ ClientContext::ClientContext()
     : initial_metadata_received_(false),
       call_(nullptr),
       cq_(nullptr),
-      absolute_deadline_(gpr_inf_future) {}
+      deadline_(gpr_inf_future) {}
 
 ClientContext::~ClientContext() {
   if (call_) {
@@ -64,15 +62,6 @@ ClientContext::~ClientContext() {
   }
 }
 
-void ClientContext::set_absolute_deadline(
-    const system_clock::time_point& deadline) {
-  Timepoint2Timespec(deadline, &absolute_deadline_);
-}
-
-system_clock::time_point ClientContext::absolute_deadline() {
-  return Timespec2Timepoint(absolute_deadline_);
-}
-
 void ClientContext::AddMetadata(const grpc::string& meta_key,
                                 const grpc::string& meta_value) {
   send_initial_metadata_.insert(std::make_pair(meta_key, meta_value));
diff --git a/src/cpp/client/secure_credentials.cc b/src/cpp/client/secure_credentials.cc
index 0a73b2c0f676b9154239d784ac156a28f466a941..48bf7430b27bf924a1f689e86b75dfad975a1268 100644
--- a/src/cpp/client/secure_credentials.cc
+++ b/src/cpp/client/secure_credentials.cc
@@ -81,27 +81,27 @@ std::unique_ptr<Credentials> ComputeEngineCredentials() {
 // Builds service account credentials.
 std::unique_ptr<Credentials> ServiceAccountCredentials(
     const grpc::string& json_key, const grpc::string& scope,
-    std::chrono::seconds token_lifetime) {
-  if (token_lifetime.count() <= 0) {
+    long token_lifetime_seconds) {
+  if (token_lifetime_seconds <= 0) {
     gpr_log(GPR_ERROR,
             "Trying to create ServiceAccountCredentials "
             "with non-positive lifetime");
     return WrapCredentials(nullptr);
   }
-  gpr_timespec lifetime = gpr_time_from_seconds(token_lifetime.count());
+  gpr_timespec lifetime = gpr_time_from_seconds(token_lifetime_seconds);
   return WrapCredentials(grpc_service_account_credentials_create(
       json_key.c_str(), scope.c_str(), lifetime));
 }
 
 // Builds JWT credentials.
 std::unique_ptr<Credentials> JWTCredentials(
-    const grpc::string& json_key, std::chrono::seconds token_lifetime) {
-  if (token_lifetime.count() <= 0) {
+    const grpc::string& json_key, long token_lifetime_seconds) {
+  if (token_lifetime_seconds <= 0) {
     gpr_log(GPR_ERROR,
             "Trying to create JWTCredentials with non-positive lifetime");
     return WrapCredentials(nullptr);
   }
-  gpr_timespec lifetime = gpr_time_from_seconds(token_lifetime.count());
+  gpr_timespec lifetime = gpr_time_from_seconds(token_lifetime_seconds);
   return WrapCredentials(
       grpc_jwt_credentials_create(json_key.c_str(), lifetime));
 }
diff --git a/src/cpp/common/completion_queue.cc b/src/cpp/common/completion_queue.cc
index cdbe042d213a8008175494132bfde753bab9d4f7..07122db4a58c1fec9f65849556f43e559d61648f 100644
--- a/src/cpp/common/completion_queue.cc
+++ b/src/cpp/common/completion_queue.cc
@@ -36,7 +36,7 @@
 
 #include <grpc/grpc.h>
 #include <grpc/support/log.h>
-#include "src/cpp/util/time.h"
+#include <grpc++/time.h>
 
 namespace grpc {
 
@@ -77,13 +77,6 @@ CompletionQueue::NextStatus CompletionQueue::AsyncNextInternal(
   }
 }
 
-CompletionQueue::NextStatus CompletionQueue::AsyncNext(
-    void** tag, bool* ok, std::chrono::system_clock::time_point deadline) {
-  gpr_timespec gpr_deadline;
-  Timepoint2Timespec(deadline, &gpr_deadline);
-  return AsyncNextInternal(tag, ok, gpr_deadline);
-}
-
 bool CompletionQueue::Pluck(CompletionQueueTag* tag) {
   std::unique_ptr<grpc_event, EventDeleter> ev;
 
diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc
index b3cd1fdd74bb8c6ce34aec1ed4d2bbf810424d13..1d39378595c7688f846254cf765c49092edfc866 100644
--- a/src/cpp/server/server.cc
+++ b/src/cpp/server/server.cc
@@ -45,10 +45,10 @@
 #include <grpc++/server_context.h>
 #include <grpc++/server_credentials.h>
 #include <grpc++/thread_pool_interface.h>
+#include <grpc++/time.h>
 
 #include "src/core/profiling/timers.h"
 #include "src/cpp/proto/proto_utils.h"
-#include "src/cpp/util/time.h"
 
 namespace grpc {
 
@@ -353,7 +353,7 @@ class Server::AsyncRequest GRPC_FINAL : public CompletionQueueTag {
     ServerContext* ctx = ctx_ ? ctx_ : generic_ctx_;
     GPR_ASSERT(ctx);
     if (*status) {
-      ctx->deadline_ = Timespec2Timepoint(call_details_.deadline);
+      ctx->deadline_ = call_details_.deadline;
       for (size_t i = 0; i < array_.count; i++) {
         ctx->client_metadata_.insert(std::make_pair(
             grpc::string(array_.metadata[i].key),
diff --git a/src/cpp/server/server_context.cc b/src/cpp/server/server_context.cc
index ffd6d30d5d41ccd86a115dd725f7d3cbae1d5539..6b5e41d0a821e3788353ca55dbaf5b96357bd9c9 100644
--- a/src/cpp/server/server_context.cc
+++ b/src/cpp/server/server_context.cc
@@ -33,11 +33,11 @@
 
 #include <grpc++/server_context.h>
 
-#include <grpc++/impl/call.h>
-#include <grpc++/impl/sync.h>
 #include <grpc/grpc.h>
 #include <grpc/support/log.h>
-#include "src/cpp/util/time.h"
+#include <grpc++/impl/call.h>
+#include <grpc++/impl/sync.h>
+#include <grpc++/time.h>
 
 namespace grpc {
 
@@ -99,7 +99,7 @@ ServerContext::ServerContext()
 ServerContext::ServerContext(gpr_timespec deadline, grpc_metadata* metadata,
                              size_t metadata_count)
     : completion_op_(nullptr),
-      deadline_(Timespec2Timepoint(deadline)),
+      deadline_(deadline),
       call_(nullptr),
       cq_(nullptr),
       sent_initial_metadata_(false) {
diff --git a/src/cpp/util/time.cc b/src/cpp/util/time.cc
index 059ea72abf69271e5337ae6c23aaa4a2e8005ed4..1fef2a56deff8d53e6f7561fd84a25c28038e0d3 100644
--- a/src/cpp/util/time.cc
+++ b/src/cpp/util/time.cc
@@ -31,9 +31,12 @@
  *
  */
 
-#include "src/cpp/util/time.h"
+#include <grpc++/config.h>
+
+#ifndef GRPC_CXX0X_NO_CHRONO
 
 #include <grpc/support/time.h>
+#include <grpc++/time.h>
 
 using std::chrono::duration_cast;
 using std::chrono::nanoseconds;
@@ -68,3 +71,5 @@ system_clock::time_point Timespec2Timepoint(gpr_timespec t) {
 }
 
 }  // namespace grpc
+
+#endif  // !GRPC_CXX0X_NO_CHRONO
diff --git a/templates/Makefile.template b/templates/Makefile.template
index 21c29454c3e29342378b5cb61f65f93d4894d1d9..e51af39348e469daac938499fe4a80d1a19ad8f9 100644
--- a/templates/Makefile.template
+++ b/templates/Makefile.template
@@ -1208,17 +1208,10 @@ endif
 % if lib.get('secure', 'check') == 'yes' or lib.get('secure', 'check') == 'check':
 endif
 % endif
-
 % for src in lib.src:
-% if not proto_re.match(src):
-$(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o: \
-% for src2 in lib.src:
-% if proto_re.match(src2):
-    ${proto_to_cc(src2)}\
+% if not proto_re.match(src) and any(proto_re.match(src2) for src2 in lib.src):
+$(OBJDIR)/$(CONFIG)/${os.path.splitext(src)[0]}.o: ${' '.join(proto_to_cc(src2) for src2 in lib.src if proto_re.match(src2))}
 % endif
-% endfor
-% endif
-
 % endfor
 </%def>
 
diff --git a/test/cpp/client/credentials_test.cc b/test/cpp/client/credentials_test.cc
index 883f1dca7b919e11303802189be876b4712ec412..6840418989cb1bad0bf524bbfba8b895e7a8eeab 100644
--- a/test/cpp/client/credentials_test.cc
+++ b/test/cpp/client/credentials_test.cc
@@ -47,7 +47,7 @@ class CredentialsTest : public ::testing::Test {
 
 TEST_F(CredentialsTest, InvalidServiceAccountCreds) {
   std::unique_ptr<Credentials> bad1 =
-      ServiceAccountCredentials("", "", std::chrono::seconds(1));
+      ServiceAccountCredentials("", "", 1);
   EXPECT_EQ(nullptr, bad1.get());
 }
 
diff --git a/test/cpp/end2end/async_end2end_test.cc b/test/cpp/end2end/async_end2end_test.cc
index e3cbfd6f8df38ecb9d48d0561be6537c76873a25..6c0dfadbb912b644487e98e7bc459227eff8b9db 100644
--- a/test/cpp/end2end/async_end2end_test.cc
+++ b/test/cpp/end2end/async_end2end_test.cc
@@ -31,13 +31,12 @@
  *
  */
 
-#include <chrono>
 #include <memory>
 
+#include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/util/echo_duplicate.grpc.pb.h"
 #include "test/cpp/util/echo.grpc.pb.h"
-#include "src/cpp/util/time.h"
 #include <grpc++/async_unary_call.h>
 #include <grpc++/channel_arguments.h>
 #include <grpc++/channel_interface.h>
@@ -50,7 +49,7 @@
 #include <grpc++/server_credentials.h>
 #include <grpc++/status.h>
 #include <grpc++/stream.h>
-#include "test/core/util/port.h"
+#include <grpc++/time.h>
 #include <gtest/gtest.h>
 
 #include <grpc/grpc.h>
diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc
index dd2655251658bec37ccf92bd9c257fac381573c5..5e89490ecb03fc04a3c342da76bd49543904ef72 100644
--- a/test/cpp/end2end/end2end_test.cc
+++ b/test/cpp/end2end/end2end_test.cc
@@ -31,13 +31,12 @@
  *
  */
 
-#include <chrono>
 #include <thread>
 
+#include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/util/echo_duplicate.grpc.pb.h"
 #include "test/cpp/util/echo.grpc.pb.h"
-#include "src/cpp/util/time.h"
 #include "src/cpp/server/thread_pool.h"
 #include <grpc++/channel_arguments.h>
 #include <grpc++/channel_interface.h>
@@ -50,7 +49,7 @@
 #include <grpc++/server_credentials.h>
 #include <grpc++/status.h>
 #include <grpc++/stream.h>
-#include "test/core/util/port.h"
+#include <grpc++/time.h>
 #include <gtest/gtest.h>
 
 #include <grpc/grpc.h>
@@ -72,8 +71,8 @@ void MaybeEchoDeadline(ServerContext* context, const EchoRequest* request,
                        EchoResponse* response) {
   if (request->has_param() && request->param().echo_deadline()) {
     gpr_timespec deadline = gpr_inf_future;
-    if (context->absolute_deadline() != system_clock::time_point::max()) {
-      Timepoint2Timespec(context->absolute_deadline(), &deadline);
+    if (context->deadline() != system_clock::time_point::max()) {
+      Timepoint2Timespec(context->deadline(), &deadline);
     }
     response->mutable_param()->set_request_deadline(deadline.tv_sec);
   }
@@ -245,7 +244,7 @@ TEST_F(End2endTest, RpcDeadlineExpires) {
   ClientContext context;
   std::chrono::system_clock::time_point deadline =
       std::chrono::system_clock::now() + std::chrono::microseconds(10);
-  context.set_absolute_deadline(deadline);
+  context.set_deadline(deadline);
   Status s = stub_->Echo(&context, request, &response);
   EXPECT_EQ(StatusCode::DEADLINE_EXCEEDED, s.code());
 }
@@ -260,7 +259,7 @@ TEST_F(End2endTest, RpcLongDeadline) {
   ClientContext context;
   std::chrono::system_clock::time_point deadline =
       std::chrono::system_clock::now() + std::chrono::hours(1);
-  context.set_absolute_deadline(deadline);
+  context.set_deadline(deadline);
   Status s = stub_->Echo(&context, request, &response);
   EXPECT_EQ(response.message(), request.message());
   EXPECT_TRUE(s.IsOk());
@@ -277,7 +276,7 @@ TEST_F(End2endTest, EchoDeadline) {
   ClientContext context;
   std::chrono::system_clock::time_point deadline =
       std::chrono::system_clock::now() + std::chrono::seconds(100);
-  context.set_absolute_deadline(deadline);
+  context.set_deadline(deadline);
   Status s = stub_->Echo(&context, request, &response);
   EXPECT_EQ(response.message(), request.message());
   EXPECT_TRUE(s.IsOk());
@@ -428,7 +427,7 @@ TEST_F(End2endTest, DiffPackageServices) {
 // rpc and stream should fail on bad credentials.
 TEST_F(End2endTest, BadCredentials) {
   std::unique_ptr<Credentials> bad_creds =
-      ServiceAccountCredentials("", "", std::chrono::seconds(1));
+      ServiceAccountCredentials("", "", 1);
   EXPECT_EQ(nullptr, bad_creds.get());
   std::shared_ptr<ChannelInterface> channel =
       CreateChannel(server_address_.str(), bad_creds, ChannelArguments());
diff --git a/test/cpp/end2end/generic_end2end_test.cc b/test/cpp/end2end/generic_end2end_test.cc
index e70a1cb68b5ebb94379f3c5473c778583a5153cc..103f613f70efa23b1b7edab8fe733a812cc9d071 100644
--- a/test/cpp/end2end/generic_end2end_test.cc
+++ b/test/cpp/end2end/generic_end2end_test.cc
@@ -31,11 +31,9 @@
  *
  */
 
-#include <chrono>
 #include <memory>
 
 #include "src/cpp/proto/proto_utils.h"
-#include "src/cpp/util/time.h"
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 #include "test/cpp/util/echo.grpc.pb.h"
@@ -55,6 +53,7 @@
 #include <grpc++/slice.h>
 #include <grpc++/status.h>
 #include <grpc++/stream.h>
+#include <grpc++/time.h>
 #include <gtest/gtest.h>
 
 #include <grpc/grpc.h>
diff --git a/test/cpp/interop/client_helper.cc b/test/cpp/interop/client_helper.cc
index b4d5b88de538ec057e4567773ee5d5470f80fc86..a1dea383e6a3b683fbb8253a63bc69ef06637a48 100644
--- a/test/cpp/interop/client_helper.cc
+++ b/test/cpp/interop/client_helper.cc
@@ -85,8 +85,9 @@ std::shared_ptr<ChannelInterface> CreateChannelForTestCase(
     std::unique_ptr<Credentials> creds;
     GPR_ASSERT(FLAGS_enable_ssl);
     grpc::string json_key = GetServiceAccountJsonKey();
+    std::chrono::seconds token_lifetime = std::chrono::hours(1);
     creds = ServiceAccountCredentials(json_key, FLAGS_oauth_scope,
-                                      std::chrono::hours(1));
+                                      token_lifetime.count());
     return CreateTestChannel(host_port, FLAGS_server_host_override,
                              FLAGS_enable_ssl, FLAGS_use_prod_roots, creds);
   } else if (test_case == "compute_engine_creds") {
@@ -99,7 +100,8 @@ std::shared_ptr<ChannelInterface> CreateChannelForTestCase(
     std::unique_ptr<Credentials> creds;
     GPR_ASSERT(FLAGS_enable_ssl);
     grpc::string json_key = GetServiceAccountJsonKey();
-    creds = JWTCredentials(json_key, std::chrono::hours(1));
+    std::chrono::seconds token_lifetime = std::chrono::hours(1);
+    creds = JWTCredentials(json_key, token_lifetime.count());
     return CreateTestChannel(host_port, FLAGS_server_host_override,
                              FLAGS_enable_ssl, FLAGS_use_prod_roots, creds);
   } else {
diff --git a/test/cpp/util/time_test.cc b/test/cpp/util/time_test.cc
index 4641fdb4daec90a21a19cfb8920779c857c74b01..a3cfb1c961c56b5d1fc6d99e43f56b98e5ba5dc3 100644
--- a/test/cpp/util/time_test.cc
+++ b/test/cpp/util/time_test.cc
@@ -31,11 +31,8 @@
  *
  */
 
-#include "src/cpp/util/time.h"
-
-#include <chrono>
-
 #include <grpc/support/time.h>
+#include <grpc++/time.h>
 #include <gtest/gtest.h>
 
 using std::chrono::duration_cast;
diff --git a/tools/run_tests/build_csharp.sh b/tools/run_tests/build_csharp.sh
index 8227ad37bca5cd5f4ce06c32876106d4292f5df8..eae7bd50405aa37fbacbda8bfe62a4efdc87d931 100755
--- a/tools/run_tests/build_csharp.sh
+++ b/tools/run_tests/build_csharp.sh
@@ -30,9 +30,21 @@
 
 set -ex
 
+if [ "$CONFIG" = "dbg" ]
+then
+  MSBUILD_CONFIG="Debug"
+else
+  MSBUILD_CONFIG="Release"
+fi
+
 # change to gRPC repo root
 cd $(dirname $0)/../..
 
 root=`pwd`
 
-xbuild src/csharp/Grpc.sln
+if [ -n "$NUGET" ]
+then
+  $NUGET restore src/csharp/Grpc.sln
+fi
+
+xbuild /p:Configuration=$MSBUILD_CONFIG src/csharp/Grpc.sln
diff --git a/tools/run_tests/run_csharp.sh b/tools/run_tests/run_csharp.sh
index d10a41ae9f4858bd5d2bcd410cf79b2d1e8a2d4c..752e83ef70547a7bce5e6dc258eacaf2a0accb4d 100755
--- a/tools/run_tests/run_csharp.sh
+++ b/tools/run_tests/run_csharp.sh
@@ -30,17 +30,22 @@
 
 set -ex
 
+CONFIG=${CONFIG:-opt}
+
+if [ "$CONFIG" = "dbg" ]
+then
+  MSBUILD_CONFIG="Debug"
+else
+  MSBUILD_CONFIG="Release"
+fi
+
 # change to gRPC repo root
 cd $(dirname $0)/../..
 
 root=`pwd`
 cd src/csharp
 
-# TODO: All the tests run pretty fast. In the future, we might need to teach
-# run_tests.py about separate tests to make them run in parallel.
-for assembly_name in Grpc.Core.Tests Grpc.Examples.Tests Grpc.IntegrationTesting
-do
-  LD_LIBRARY_PATH=$root/libs/dbg nunit-console -labels $assembly_name/bin/Debug/$assembly_name.dll
-done
+export LD_LIBRARY_PATH=$root/libs/$CONFIG
+nunit-console -labels "$1/bin/$MSBUILD_CONFIG/$1.dll"
 
 
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index 5165983d970589492fc85c3af6779c29171897de..50fdec7f5f2a8e659a14245ee2c7a5fb7f4db445 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -61,7 +61,7 @@ class SimpleConfig(object):
     self.environ = environ
     self.environ['CONFIG'] = config
 
-  def job_spec(self, cmdline, hash_targets):
+  def job_spec(self, cmdline, hash_targets, shortname=None):
     """Construct a jobset.JobSpec for a test under this config
 
        Args:
@@ -74,6 +74,7 @@ class SimpleConfig(object):
                           be listed
     """
     return jobset.JobSpec(cmdline=cmdline,
+                          shortname=shortname,
                           environ=self.environ,
                           hash_targets=hash_targets
                               if self.allow_hashing else None)
@@ -218,9 +219,13 @@ class RubyLanguage(object):
 
 
 class CSharpLanguage(object):
-
   def test_specs(self, config, travis):
-    return [config.job_spec('tools/run_tests/run_csharp.sh', None)]
+    assemblies = ['Grpc.Core.Tests',
+                  'Grpc.Examples.Tests',
+                  'Grpc.IntegrationTesting']
+    return [config.job_spec(['tools/run_tests/run_csharp.sh', assembly],
+            None, shortname=assembly)
+            for assembly in assemblies ]
 
   def make_targets(self):
     return ['grpc_csharp_ext']
diff --git a/vsprojects/grpc++/grpc++.vcxproj b/vsprojects/grpc++/grpc++.vcxproj
index 07c018f111084a18fb85aa2a1c34b39dfff903b1..ac3191a8b2d0b1bca169b3a11657f22194f1b266 100644
--- a/vsprojects/grpc++/grpc++.vcxproj
+++ b/vsprojects/grpc++/grpc++.vcxproj
@@ -116,6 +116,7 @@
     <ClInclude Include="..\..\include\grpc++\status_code_enum.h" />
     <ClInclude Include="..\..\include\grpc++\stream.h" />
     <ClInclude Include="..\..\include\grpc++\thread_pool_interface.h" />
+    <ClInclude Include="..\..\include\grpc++\time.h" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\cpp\client\secure_credentials.h" />
@@ -123,7 +124,6 @@
     <ClInclude Include="..\..\src\cpp\client\channel.h" />
     <ClInclude Include="..\..\src\cpp\proto\proto_utils.h" />
     <ClInclude Include="..\..\src\cpp\server\thread_pool.h" />
-    <ClInclude Include="..\..\src\cpp\util\time.h" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\src\cpp\client\secure_credentials.cc">
diff --git a/vsprojects/grpc++/grpc++.vcxproj.filters b/vsprojects/grpc++/grpc++.vcxproj.filters
index 46b33bb8a66393a860d5ed066b50f070119c80ae..d5eeb7179074badce1ff38f0f4c2cfb0a1eea5ad 100644
--- a/vsprojects/grpc++/grpc++.vcxproj.filters
+++ b/vsprojects/grpc++/grpc++.vcxproj.filters
@@ -180,6 +180,9 @@
     <ClInclude Include="..\..\include\grpc++\thread_pool_interface.h">
       <Filter>include\grpc++</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\include\grpc++\time.h">
+      <Filter>include\grpc++</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\cpp\client\secure_credentials.h">
@@ -197,9 +200,6 @@
     <ClInclude Include="..\..\src\cpp\server\thread_pool.h">
       <Filter>src\cpp\server</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\src\cpp\util\time.h">
-      <Filter>src\cpp\util</Filter>
-    </ClInclude>
   </ItemGroup>
 
   <ItemGroup>