diff --git a/.travis.yml b/.travis.yml
index c626242557160988adfb1d65cbde27d090762dce..97cf99d71ee9e19725a5e586d127b25816237ce9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -34,7 +34,7 @@ script:
   - if [ ! -z "$USE_GCC" ] ; then export CC=gcc-$USE_GCC ; export CXX=g++-$USE_GCC ; fi
   - ./tools/run_tests/run_tests.py -l $TEST -t -j $JOBS -c $CONFIG -s 4.0
 after_success:
-  - if [ "$CONFIG" = "gcov" ] ; then coveralls --exclude third_party --exclude gens --exclude test --exclude src/compiler -b. --gcov-options '\-p' ; fi
+  - if [ "$CONFIG" = "gcov" ] ; then coveralls --exclude third_party --exclude gens --exclude test --exclude tools --exclude src/compiler -b. --gcov-options '\-p' ; fi
 notifications:
   email: false
   webhooks:
diff --git a/BUILD b/BUILD
index fbcfd66400c39306ab95ea1c2bcb8440a1b48cba..6d68b8e644c05c53239cb1b206313c0f3712f103 100644
--- a/BUILD
+++ b/BUILD
@@ -856,3 +856,30 @@ cc_binary(
 
 
 
+
+objc_path = "src/objective-c"
+
+rx_library_path = objc_path + "/RxLibrary"
+
+objc_library(
+    name = "rx_library",
+    hdrs = glob([
+        rx_library_path + "/*.h",
+        rx_library_path + "/transformations/*.h",
+    ]),
+    srcs = glob([
+        rx_library_path + "/*.m",
+        rx_library_path + "/transformations/*.m",
+    ]),
+    includes = [objc_path],
+    deps = [
+        ":rx_library_private",
+    ],
+)
+
+objc_library(
+    name = "rx_library_private",
+    hdrs = glob([rx_library_path + "/private/*.h"]),
+    srcs = glob([rx_library_path + "/private/*.m"]),
+    visibility = ["//visibility:private"],
+)
diff --git a/Makefile b/Makefile
index df6be1d4d28084a283d7d1a7df1e96cb95b625cd..6a2f92740330a2dda7564de2e0fac2a395ce5be3 100644
--- a/Makefile
+++ b/Makefile
@@ -5645,7 +5645,7 @@ endif
 
 
 GEN_HPACK_TABLES_SRC = \
-    src/core/transport/chttp2/gen_hpack_tables.c \
+    tools/codegen/core/gen_hpack_tables.c \
 
 GEN_HPACK_TABLES_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GEN_HPACK_TABLES_SRC))))
 ifeq ($(NO_SECURE),true)
@@ -5656,14 +5656,14 @@ $(BINDIR)/$(CONFIG)/gen_hpack_tables: openssl_dep_error
 
 else
 
-$(BINDIR)/$(CONFIG)/gen_hpack_tables: $(GEN_HPACK_TABLES_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a
+$(BINDIR)/$(CONFIG)/gen_hpack_tables: $(GEN_HPACK_TABLES_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a
 	$(E) "[LD]      Linking $@"
 	$(Q) mkdir -p `dirname $@`
-	$(Q) $(LD) $(LDFLAGS) $(GEN_HPACK_TABLES_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/gen_hpack_tables
+	$(Q) $(LD) $(LDFLAGS) $(GEN_HPACK_TABLES_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/gen_hpack_tables
 
 endif
 
-$(OBJDIR)/$(CONFIG)/src/core/transport/chttp2/gen_hpack_tables.o:  $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a
+$(OBJDIR)/$(CONFIG)/tools/codegen/core/gen_hpack_tables.o:  $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a
 deps_gen_hpack_tables: $(GEN_HPACK_TABLES_OBJS:.o=.dep)
 
 ifneq ($(NO_SECURE),true)
diff --git a/build.json b/build.json
index 282e82562a8b210b6ce4b14140093880014c8dda..8f34692f9d077507dda33aafc09a5ac09fb525e7 100644
--- a/build.json
+++ b/build.json
@@ -997,10 +997,9 @@
       "build": "tool",
       "language": "c",
       "src": [
-        "src/core/transport/chttp2/gen_hpack_tables.c"
+        "tools/codegen/core/gen_hpack_tables.c"
       ],
       "deps": [
-        "grpc_test_util",
         "gpr",
         "grpc"
       ]
diff --git a/gRPC.podspec b/gRPC.podspec
index 9bd847be28933012aace645e8285b5a2b73f07ae..e2a2fbba27705d815c18b45351e88f50fbb43d70 100644
--- a/gRPC.podspec
+++ b/gRPC.podspec
@@ -34,7 +34,6 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-
 Pod::Spec.new do |s|
   s.name     = 'gRPC'
   s.version  = '0.6.0'
@@ -50,31 +49,427 @@ Pod::Spec.new do |s|
   s.osx.deployment_target = '10.8'
   s.requires_arc = true
 
+  objc_dir = 'src/objective-c'
+
   # Reactive Extensions library for iOS.
-  s.subspec 'RxLibrary' do |rs|
-    rs.source_files = 'src/objective-c/RxLibrary/*.{h,m}',
-                      'src/objective-c/RxLibrary/transformations/*.{h,m}',
-                      'src/objective-c/RxLibrary/private/*.{h,m}'
-    rs.private_header_files = 'src/objective-c/RxLibrary/private/*.h'
+  s.subspec 'RxLibrary' do |ss|
+    src_dir = "#{objc_dir}/RxLibrary"
+    ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}"
+    ss.private_header_files = "#{src_dir}/private/*.h"
+    ss.header_mappings_dir = "#{objc_dir}"
   end
 
   # Core cross-platform gRPC library, written in C.
-  s.subspec 'C-Core' do |cs|
-    cs.source_files = 'src/core/support/env.h', 'src/core/support/file.h', 'src/core/support/murmur_hash.h', 'src/core/support/grpc_string.h', 'src/core/support/string_win32.h', 'src/core/support/thd_internal.h', '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/cancellable_platform.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/grpc_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', 'src/core/support/alloc.c', 'src/core/support/cancellable.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/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', 'src/core/httpcli/format_request.h', 'src/core/httpcli/httpcli.h', 'src/core/httpcli/httpcli_security_connector.h', 'src/core/httpcli/parser.h', '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/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/core/census/grpc_context.h', 'src/core/channel/census_filter.h', 'src/core/channel/channel_args.h', 'src/core/channel/channel_stack.h', 'src/core/channel/child_channel.h', 'src/core/channel/client_channel.h', 'src/core/channel/client_setup.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/compression/message_compress.h', 'src/core/debug/trace.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_kick_posix.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/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/surface/byte_buffer_queue.h', 'src/core/surface/call.h', 'src/core/surface/channel.h', 'src/core/surface/client.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/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/metadata.h', 'src/core/transport/stream_op.h', 'src/core/transport/transport.h', 'src/core/transport/transport_impl.h', 'src/core/census/context.h', 'include/grpc/grpc_security.h', 'include/grpc/byte_buffer.h', 'include/grpc/byte_buffer_reader.h', 'include/grpc/compression.h', 'include/grpc/grpc.h', 'include/grpc/status.h', 'include/grpc/census.h', 'src/core/httpcli/format_request.c', 'src/core/httpcli/httpcli.c', 'src/core/httpcli/httpcli_security_connector.c', 'src/core/httpcli/parser.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/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', 'src/core/census/grpc_context.c', 'src/core/channel/channel_args.c', 'src/core/channel/channel_stack.c', 'src/core/channel/child_channel.c', 'src/core/channel/client_channel.c', 'src/core/channel/client_setup.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/compression/algorithm.c', 'src/core/compression/message_compress.c', 'src/core/debug/trace.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_kick_posix.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/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/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_create.c', 'src/core/surface/client.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/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/status_conversion.c', 'src/core/transport/chttp2/stream_encoder.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_transport.c', 'src/core/transport/metadata.c', 'src/core/transport/stream_op.c', 'src/core/transport/transport.c', 'src/core/transport/transport_op_string.c', 'src/core/census/context.c', 'src/core/census/initialize.c', 
-    cs.private_header_files = 'src/core/support/env.h', 'src/core/support/file.h', 'src/core/support/murmur_hash.h', 'src/core/support/string.h', 'src/core/support/string_win32.h', 'src/core/support/thd_internal.h', 'src/core/httpcli/format_request.h', 'src/core/httpcli/httpcli.h', 'src/core/httpcli/httpcli_security_connector.h', 'src/core/httpcli/parser.h', '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/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/core/census/grpc_context.h', 'src/core/channel/census_filter.h', 'src/core/channel/channel_args.h', 'src/core/channel/channel_stack.h', 'src/core/channel/child_channel.h', 'src/core/channel/client_channel.h', 'src/core/channel/client_setup.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/compression/message_compress.h', 'src/core/debug/trace.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_kick_posix.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/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/surface/byte_buffer_queue.h', 'src/core/surface/call.h', 'src/core/surface/channel.h', 'src/core/surface/client.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/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/metadata.h', 'src/core/transport/stream_op.h', 'src/core/transport/transport.h', 'src/core/transport/transport_impl.h', 'src/core/census/context.h', 
-    cs.header_mappings_dir = '.'
-    # The core library includes its headers as either "src/core/..." or "grpc/...", meaning we have
-    # to tell XCode to look for headers under the "include" subdirectory too.
-    #
-    # TODO(jcanizales): Instead of doing this, during installation move everything under
-    # "include/grpc" one directory up. The directory names under PODS_ROOT are implementation
-    # details of Cocoapods, and have changed in the past, breaking this podspec.
-    cs.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Headers/Private/gRPC" ' +
-                                             '"$(PODS_ROOT)/Headers/Private/gRPC/include"' }
-
-    cs.requires_arc = false
-    cs.libraries = 'z'
-    cs.dependency 'OpenSSL', '~> 1.0.200'
+  s.subspec 'C-Core' do |ss|
+    ss.source_files = 'src/core/support/env.h',
+                      'src/core/support/file.h',
+                      'src/core/support/murmur_hash.h',
+                      'src/core/support/grpc_string.h',
+                      'src/core/support/string_win32.h',
+                      'src/core/support/thd_internal.h',
+                      'grpc/support/alloc.h',
+                      'grpc/support/atm.h',
+                      'grpc/support/atm_gcc_atomic.h',
+                      'grpc/support/atm_gcc_sync.h',
+                      'grpc/support/atm_win32.h',
+                      'grpc/support/cancellable_platform.h',
+                      'grpc/support/cmdline.h',
+                      'grpc/support/cpu.h',
+                      'grpc/support/histogram.h',
+                      'grpc/support/host_port.h',
+                      'grpc/support/log.h',
+                      'grpc/support/log_win32.h',
+                      'grpc/support/port_platform.h',
+                      'grpc/support/slice.h',
+                      'grpc/support/slice_buffer.h',
+                      'grpc/support/string_util.h',
+                      'grpc/support/subprocess.h',
+                      'grpc/support/sync.h',
+                      'grpc/support/sync_generic.h',
+                      'grpc/support/sync_posix.h',
+                      'grpc/support/sync_win32.h',
+                      'grpc/support/thd.h',
+                      'grpc/support/grpc_time.h',
+                      'grpc/support/tls.h',
+                      'grpc/support/tls_gcc.h',
+                      'grpc/support/tls_msvc.h',
+                      'grpc/support/tls_pthread.h',
+                      'grpc/support/useful.h',
+                      'src/core/support/alloc.c',
+                      'src/core/support/cancellable.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/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',
+                      'src/core/httpcli/format_request.h',
+                      'src/core/httpcli/httpcli.h',
+                      'src/core/httpcli/httpcli_security_connector.h',
+                      'src/core/httpcli/parser.h',
+                      '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/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/core/census/grpc_context.h',
+                      'src/core/channel/census_filter.h',
+                      'src/core/channel/channel_args.h',
+                      'src/core/channel/channel_stack.h',
+                      'src/core/channel/child_channel.h',
+                      'src/core/channel/client_channel.h',
+                      'src/core/channel/client_setup.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/compression/message_compress.h',
+                      'src/core/debug/trace.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_kick_posix.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/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/surface/byte_buffer_queue.h',
+                      'src/core/surface/call.h',
+                      'src/core/surface/channel.h',
+                      'src/core/surface/client.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/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/metadata.h',
+                      'src/core/transport/stream_op.h',
+                      'src/core/transport/transport.h',
+                      'src/core/transport/transport_impl.h',
+                      'src/core/census/context.h',
+                      'grpc/grpc_security.h',
+                      'grpc/byte_buffer.h',
+                      'grpc/byte_buffer_reader.h',
+                      'grpc/compression.h',
+                      'grpc/grpc.h',
+                      'grpc/status.h',
+                      'grpc/census.h',
+                      'src/core/httpcli/format_request.c',
+                      'src/core/httpcli/httpcli.c',
+                      'src/core/httpcli/httpcli_security_connector.c',
+                      'src/core/httpcli/parser.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/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',
+                      'src/core/census/grpc_context.c',
+                      'src/core/channel/channel_args.c',
+                      'src/core/channel/channel_stack.c',
+                      'src/core/channel/child_channel.c',
+                      'src/core/channel/client_channel.c',
+                      'src/core/channel/client_setup.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/compression/algorithm.c',
+                      'src/core/compression/message_compress.c',
+                      'src/core/debug/trace.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_kick_posix.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/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/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_create.c',
+                      'src/core/surface/client.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/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/status_conversion.c',
+                      'src/core/transport/chttp2/stream_encoder.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_transport.c',
+                      'src/core/transport/metadata.c',
+                      'src/core/transport/stream_op.c',
+                      'src/core/transport/transport.c',
+                      'src/core/transport/transport_op_string.c',
+                      'src/core/census/context.c',
+                      'src/core/census/initialize.c'
+
+    ss.private_header_files = 'src/core/support/env.h',
+                              'src/core/support/file.h',
+                              'src/core/support/murmur_hash.h',
+                              'src/core/support/string.h',
+                              'src/core/support/string_win32.h',
+                              'src/core/support/thd_internal.h',
+                              'src/core/httpcli/format_request.h',
+                              'src/core/httpcli/httpcli.h',
+                              'src/core/httpcli/httpcli_security_connector.h',
+                              'src/core/httpcli/parser.h',
+                              '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/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/core/census/grpc_context.h',
+                              'src/core/channel/census_filter.h',
+                              'src/core/channel/channel_args.h',
+                              'src/core/channel/channel_stack.h',
+                              'src/core/channel/child_channel.h',
+                              'src/core/channel/client_channel.h',
+                              'src/core/channel/client_setup.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/compression/message_compress.h',
+                              'src/core/debug/trace.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_kick_posix.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/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/surface/byte_buffer_queue.h',
+                              'src/core/surface/call.h',
+                              'src/core/surface/channel.h',
+                              'src/core/surface/client.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/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/metadata.h',
+                              'src/core/transport/stream_op.h',
+                              'src/core/transport/transport.h',
+                              'src/core/transport/transport_impl.h',
+                              'src/core/census/context.h'
+
+    ss.header_mappings_dir = '.'
+
+    ss.requires_arc = false
+    ss.libraries = 'z'
+    ss.dependency 'OpenSSL', '~> 1.0.200'
   end
 
   # This is a workaround for Cocoapods Issue #1437.
@@ -82,12 +477,15 @@ Pod::Spec.new do |s|
   # It needs to be here (top-level) instead of in the C-Core subspec because Cocoapods doesn't run
   # prepare_command's of subspecs.
   #
-  # TODO(jcanizales): Try out Todd Reed's solution at Issue #1437.
+  # TODO(jcanizales): Try out others' solutions at Issue #1437.
   s.prepare_command = <<-CMD
+    # Move contents of include up a level to avoid manually specifying include paths
+    cp -r "include/grpc" "."
+
     DIR_TIME="grpc/support"
     BAD_TIME="$DIR_TIME/time.h"
     GOOD_TIME="$DIR_TIME/grpc_time.h"
-    grep -rl "$BAD_TIME" include/grpc src/core | xargs sed -i '' -e s@$BAD_TIME@$GOOD_TIME@g
+    grep -rl "$BAD_TIME" grpc src/core src/objective-c/GRPCClient | xargs sed -i '' -e s@$BAD_TIME@$GOOD_TIME@g
     if [ -f "include/$BAD_TIME" ];
     then
       mv -f "include/$BAD_TIME" "include/$GOOD_TIME"
@@ -96,7 +494,7 @@ Pod::Spec.new do |s|
     DIR_STRING="src/core/support"
     BAD_STRING="$DIR_STRING/string.h"
     GOOD_STRING="$DIR_STRING/grpc_string.h"
-    grep -rl "$BAD_STRING" include/grpc src/core | xargs sed -i '' -e s@$BAD_STRING@$GOOD_STRING@g
+    grep -rl "$BAD_STRING" grpc src/core src/objective-c/GRPCClient | xargs sed -i '' -e s@$BAD_STRING@$GOOD_STRING@g
     if [ -f "$BAD_STRING" ];
     then
       mv -f "$BAD_STRING" "$GOOD_STRING"
@@ -104,28 +502,27 @@ Pod::Spec.new do |s|
   CMD
 
   # Objective-C wrapper around the core gRPC library.
-  s.subspec 'GRPCClient' do |gs|
-    gs.source_files = 'src/objective-c/GRPCClient/*.{h,m}',
-                      'src/objective-c/GRPCClient/private/*.{h,m}'
-    gs.private_header_files = 'src/objective-c/GRPCClient/private/*.h'
-    gs.compiler_flags = '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w'
-
-    gs.dependency 'gRPC/C-Core'
-    # TODO(jcanizales): Remove this when the prepare_command moves everything under "include/grpc"
-    # one directory up.
-    gs.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Headers/Public/gRPC/include"' }
-    gs.dependency 'gRPC/RxLibrary'
+  s.subspec 'GRPCClient' do |ss|
+    src_dir = "#{objc_dir}/GRPCClient"
+    ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}"
+    ss.private_header_files = "#{src_dir}/private/*.h"
+    ss.header_mappings_dir = "#{objc_dir}"
+
+    ss.dependency 'gRPC/C-Core'
+    ss.dependency 'gRPC/RxLibrary'
 
     # Certificates, to be able to establish TLS connections:
-    gs.resource_bundles = { 'gRPC' => ['etc/roots.pem'] }
+    ss.resource_bundles = { 'gRPC' => ['etc/roots.pem'] }
   end
 
   # RPC library for ProtocolBuffers, based on gRPC
-  s.subspec 'ProtoRPC' do |ps|
-    ps.source_files = 'src/objective-c/ProtoRPC/*.{h,m}'
+  s.subspec 'ProtoRPC' do |ss|
+    src_dir = "#{objc_dir}/ProtoRPC"
+    ss.source_files = "#{src_dir}/*.{h,m}"
+    ss.header_mappings_dir = "#{objc_dir}"
 
-    ps.dependency 'gRPC/GRPCClient'
-    ps.dependency 'gRPC/RxLibrary'
-    ps.dependency 'Protobuf', '~> 3.0.0-alpha-3'
+    ss.dependency 'gRPC/GRPCClient'
+    ss.dependency 'gRPC/RxLibrary'
+    ss.dependency 'Protobuf', '~> 3.0.0-alpha-3'
   end
 end
diff --git a/include/grpc++/impl/call.h b/include/grpc++/impl/call.h
index 33e66816f534e4d66773277da72c20549a33bebf..64fa5d6efbeedaa9ce2db3a4c917797f95aa9910 100644
--- a/include/grpc++/impl/call.h
+++ b/include/grpc++/impl/call.h
@@ -41,6 +41,7 @@
 #include <grpc++/status.h>
 #include <grpc++/impl/serialization_traits.h>
 
+#include <functional>
 #include <memory>
 #include <map>
 
diff --git a/src/compiler/objective_c_plugin.cc b/src/compiler/objective_c_plugin.cc
index b5ac2bafa99c1720def0051d09dc1353be1b5261..2b5ab758fcd39383ec7d2157b801eafa1c64920a 100644
--- a/src/compiler/objective_c_plugin.cc
+++ b/src/compiler/objective_c_plugin.cc
@@ -62,8 +62,8 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
     {
       // Generate .pbrpc.h
 
-      string imports = string("#import \"") + file_name + ".pbobjc.h\"\n"
-        "#import <gRPC/ProtoService.h>\n";
+      string imports = string("#import \"") + file_name + ".pbobjc.h\"\n\n"
+        "#import <ProtoRPC/ProtoService.h>\n";
 
       // TODO(jcanizales): Instead forward-declare the input and output types
       // and import the files in the .pbrpc.m
@@ -87,10 +87,10 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
     {
       // Generate .pbrpc.m
 
-      string imports = string("#import \"") + file_name + ".pbrpc.h\"\n"
-        "#import <gRPC/GRXWriteable.h>\n"
-        "#import <gRPC/GRXWriter+Immediate.h>\n"
-        "#import <gRPC/ProtoRPC.h>\n";
+      string imports = string("#import \"") + file_name + ".pbrpc.h\"\n\n"
+        "#import <ProtoRPC/ProtoRPC.h>\n"
+        "#import <RxLibrary/GRXWriteable.h>\n"
+        "#import <RxLibrary/GRXWriter+Immediate.h>\n";
 
       string definitions;
       for (int i = 0; i < file->service_count(); i++) {
diff --git a/src/core/iomgr/pollset_windows.c b/src/core/iomgr/pollset_windows.c
index d0507af9602287a26571454591582f9fa8adb66a..926ee8fdd90f040d90e0f9465cd0f901434e8da5 100644
--- a/src/core/iomgr/pollset_windows.c
+++ b/src/core/iomgr/pollset_windows.c
@@ -39,6 +39,7 @@
 
 #include "src/core/iomgr/alarm_internal.h"
 #include "src/core/iomgr/iomgr_internal.h"
+#include "src/core/iomgr/pollset.h"
 #include "src/core/iomgr/pollset_windows.h"
 
 /* There isn't really any such thing as a pollset under Windows, due to the
@@ -54,6 +55,7 @@ void grpc_pollset_init(grpc_pollset *pollset) {
 void grpc_pollset_shutdown(grpc_pollset *pollset,
                            void (*shutdown_done)(void *arg),
                            void *shutdown_done_arg) {
+  grpc_pollset_kick(pollset);
   shutdown_done(shutdown_done_arg);
 }
 
@@ -68,10 +70,10 @@ int grpc_pollset_work(grpc_pollset *pollset, gpr_timespec deadline) {
   if (gpr_time_cmp(now, deadline) > 0) {
     return 0 /* GPR_FALSE */;
   }
-  if (grpc_maybe_call_delayed_callbacks(NULL, 1 /* GPR_TRUE */)) {
+  if (grpc_maybe_call_delayed_callbacks(&pollset->mu, 1 /* GPR_TRUE */)) {
     return 1 /* GPR_TRUE */;
   }
-  if (grpc_alarm_check(NULL, now, &deadline)) {
+  if (grpc_alarm_check(&pollset->mu, now, &deadline)) {
     return 1 /* GPR_TRUE */;
   }
   gpr_cv_wait(&pollset->cv, &pollset->mu, deadline);
diff --git a/src/core/support/histogram.c b/src/core/support/histogram.c
index 2f1adcf511983e53129e9ad0ac1258b1e4712a81..902970389103dd93cecd5c462b6d0d9d4b804ca7 100644
--- a/src/core/support/histogram.c
+++ b/src/core/support/histogram.c
@@ -164,7 +164,9 @@ static double threshold_for_count_below(gpr_histogram *h, double count_below) {
   size_t lower_idx;
   size_t upper_idx;
 
-  GPR_ASSERT(h->count >= 1);
+  if (h->count == 0) {
+    return 0.0;
+  }
 
   if (count_below <= 0) {
     return h->min_seen;
diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c
index bd0fabf9dac99375e7a5a8eafa90a6ed29c57502..063a23cfb1855810a45a02aa71c77573a6f412f4 100644
--- a/src/core/surface/completion_queue.c
+++ b/src/core/surface/completion_queue.c
@@ -208,6 +208,7 @@ grpc_event grpc_completion_queue_next(grpc_completion_queue *cc,
     }
     if (cc->shutdown) {
       ev = create_shutdown_event();
+      grpc_pollset_kick(&cc->pollset);
       break;
     }
     if (!grpc_pollset_work(&cc->pollset, deadline)) {
diff --git a/src/objective-c/GRPCClient/GRPCCall.h b/src/objective-c/GRPCClient/GRPCCall.h
index 7b42498d42b978285bf1d17b805cebcb2236fd45..33aae1074759edc967d9eb6229c525a1c5702ecd 100644
--- a/src/objective-c/GRPCClient/GRPCCall.h
+++ b/src/objective-c/GRPCClient/GRPCCall.h
@@ -46,7 +46,7 @@
 // transparently on the same TCP connection.
 
 #import <Foundation/Foundation.h>
-#import <gRPC/GRXWriter.h>
+#import <RxLibrary/GRXWriter.h>
 
 @class GRPCMethodName;
 
diff --git a/src/objective-c/GRPCClient/GRPCCall.m b/src/objective-c/GRPCClient/GRPCCall.m
index a9625a179973daba0816344ad708f2dd2b98054e..77eebeff7615cc12d36aa4de756990be33e6fa29 100644
--- a/src/objective-c/GRPCClient/GRPCCall.m
+++ b/src/objective-c/GRPCClient/GRPCCall.m
@@ -34,7 +34,7 @@
 #import "GRPCCall.h"
 
 #include <grpc/grpc.h>
-#include <grpc/support/grpc_time.h>
+#include <grpc/support/time.h>
 
 #import "GRPCMethodName.h"
 #import "private/GRPCChannel.h"
diff --git a/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m b/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m
index 7d5ecb56d9a69a14925a260459e54439adc3d305..59c0565494b107c1678db7c59f8f2ed42f678a31 100644
--- a/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m
+++ b/src/objective-c/GRPCClient/private/GRPCDelegateWrapper.m
@@ -33,7 +33,7 @@
 
 #import "GRPCDelegateWrapper.h"
 
-#import <gRPC/GRXWriteable.h>
+#import <RxLibrary/GRXWriteable.h>
 
 @interface GRPCDelegateWrapper ()
 // These are atomic so that cancellation can nillify them from any thread.
diff --git a/src/objective-c/GRPCClient/private/GRPCMethodName+HTTP2Encoding.h b/src/objective-c/GRPCClient/private/GRPCMethodName+HTTP2Encoding.h
index 28c7374517c0d3bb3cad6f67e9a8b2523fab1f5c..81c80f2a49228769b0b18ced30b942c6c26bfcf7 100644
--- a/src/objective-c/GRPCClient/private/GRPCMethodName+HTTP2Encoding.h
+++ b/src/objective-c/GRPCClient/private/GRPCMethodName+HTTP2Encoding.h
@@ -33,7 +33,7 @@
 
 #import <Foundation/Foundation.h>
 
-#import "GRPCMethodName.h"
+#import "GRPCClient/GRPCMethodName.h"
 
 @interface GRPCMethodName (HTTP2Encoding)
 - (NSString *)HTTP2Path;
diff --git a/src/objective-c/GRPCClient/private/GRPCSecureChannel.m b/src/objective-c/GRPCClient/private/GRPCSecureChannel.m
index 2cbc6e0f838b35c8e82256a53962324183219948..0f6eece885ece000556894d576a696f285f28b5e 100644
--- a/src/objective-c/GRPCClient/private/GRPCSecureChannel.m
+++ b/src/objective-c/GRPCClient/private/GRPCSecureChannel.m
@@ -38,7 +38,7 @@
 @implementation GRPCSecureChannel
 
 - (instancetype)initWithHost:(NSString *)host {
-  static const grpc_credentials *kCredentials;
+  static grpc_credentials *kCredentials;
   static dispatch_once_t loading;
   dispatch_once(&loading, ^{
     // Do not use NSBundle.mainBundle, as it's nil for tests of library projects.
diff --git a/src/objective-c/GRPCClient/private/NSError+GRPC.m b/src/objective-c/GRPCClient/private/NSError+GRPC.m
index f7390476d9a5fd6d6c18b36a8d155130371503b7..638f41cb11e761984f50df94648e852bbb2ce67a 100644
--- a/src/objective-c/GRPCClient/private/NSError+GRPC.m
+++ b/src/objective-c/GRPCClient/private/NSError+GRPC.m
@@ -33,7 +33,7 @@
 
 #import "NSError+GRPC.h"
 
-#include <grpc.h>
+#include <grpc/grpc.h>
 
 NSString * const kGRPCErrorDomain = @"io.grpc";
 
diff --git a/src/objective-c/ProtoRPC/ProtoRPC.h b/src/objective-c/ProtoRPC/ProtoRPC.h
index b6375f52d6fc648e92ffb811729a95c2ca46ac8e..a3833106195f01fd446e9c947f851a974461bea9 100644
--- a/src/objective-c/ProtoRPC/ProtoRPC.h
+++ b/src/objective-c/ProtoRPC/ProtoRPC.h
@@ -32,7 +32,7 @@
  */
 
 #import <Foundation/Foundation.h>
-#import <gRPC/GRPCCall.h>
+#import <GRPCClient/GRPCCall.h>
 
 @interface ProtoRPC : GRPCCall
 
diff --git a/src/objective-c/ProtoRPC/ProtoRPC.m b/src/objective-c/ProtoRPC/ProtoRPC.m
index b8f80084223dffa088833ae3b8a86336abb45460..39120344156fc5c29f8002e24ca0ef9c6810c3dd 100644
--- a/src/objective-c/ProtoRPC/ProtoRPC.m
+++ b/src/objective-c/ProtoRPC/ProtoRPC.m
@@ -33,10 +33,10 @@
 
 #import "ProtoRPC.h"
 
-#import <gRPC/GRXWriteable.h>
-#import <gRPC/GRXWriter.h>
-#import <gRPC/GRXWriter+Transformations.h>
 #import <Protobuf/GPBProtocolBuffers.h>
+#import <RxLibrary/GRXWriteable.h>
+#import <RxLibrary/GRXWriter.h>
+#import <RxLibrary/GRXWriter+Transformations.h>
 
 @implementation ProtoRPC {
   id<GRXWriteable> _responseWriteable;
diff --git a/src/objective-c/ProtoRPC/ProtoService.m b/src/objective-c/ProtoRPC/ProtoService.m
index 453d7b3f1a6bec4408342683b625c0504d5dd50e..47bdb5dc6e87ae27c6a9332eee6179aeec7ff030 100644
--- a/src/objective-c/ProtoRPC/ProtoService.m
+++ b/src/objective-c/ProtoRPC/ProtoService.m
@@ -33,9 +33,9 @@
 
 #import "ProtoService.h"
 
-#import <gRPC/GRPCMethodName.h>
-#import <gRPC/GRXWriteable.h>
-#import <gRPC/GRXWriter.h>
+#import <GRPCClient/GRPCMethodName.h>
+#import <RxLibrary/GRXWriteable.h>
+#import <RxLibrary/GRXWriter.h>
 
 #import "ProtoRPC.h"
 
diff --git a/src/objective-c/RxLibrary/transformations/GRXMappingWriter.h b/src/objective-c/RxLibrary/transformations/GRXMappingWriter.h
index dcebb6132afa8a92ac3754084cfd4760d35ac815..55f6f82f20b1b54853cafdfc5e842f61e00e8682 100644
--- a/src/objective-c/RxLibrary/transformations/GRXMappingWriter.h
+++ b/src/objective-c/RxLibrary/transformations/GRXMappingWriter.h
@@ -31,7 +31,7 @@
  *
  */
 
-#import "GRXWriter.h"
+#import "RxLibrary/GRXWriter.h"
 
 // A "proxy" writer that transforms all the values of its input writer by using a mapping function.
 @interface GRXMappingWriter : GRXWriter
diff --git a/src/objective-c/examples/Sample/Sample/ViewController.m b/src/objective-c/examples/Sample/Sample/ViewController.m
index 0011a4508df6bcfbc3e560a173dc3616e2cf88af..05bd6fa2dbc5c5ba8be85cfc8e2c7a9c89f39952 100644
--- a/src/objective-c/examples/Sample/Sample/ViewController.m
+++ b/src/objective-c/examples/Sample/Sample/ViewController.m
@@ -33,12 +33,12 @@
 
 #import "ViewController.h"
 
-#import <gRPC/GRPCCall.h>
-#import <gRPC/GRPCMethodName.h>
-#import <gRPC/GRXWriter+Immediate.h>
-#import <gRPC/GRXWriteable.h>
+#import <GRPCClient/GRPCCall.h>
+#import <GRPCClient/GRPCMethodName.h>
 #import <RemoteTest/Messages.pbobjc.h>
 #import <RemoteTest/Test.pbrpc.h>
+#import <RxLibrary/GRXWriter+Immediate.h>
+#import <RxLibrary/GRXWriteable.h>
 
 @implementation ViewController
 
diff --git a/src/objective-c/tests/GRPCClientTests.m b/src/objective-c/tests/GRPCClientTests.m
index 268e67af2f07fea2d0c7d454e90cd133d554a0a1..e421127ea1ece2fcc168e4d507f4d183f049cf58 100644
--- a/src/objective-c/tests/GRPCClientTests.m
+++ b/src/objective-c/tests/GRPCClientTests.m
@@ -34,11 +34,11 @@
 #import <UIKit/UIKit.h>
 #import <XCTest/XCTest.h>
 
-#import <gRPC/GRPCCall.h>
-#import <gRPC/GRPCMethodName.h>
-#import <gRPC/GRXWriter+Immediate.h>
-#import <gRPC/GRXWriteable.h>
+#import <GRPCClient/GRPCCall.h>
+#import <GRPCClient/GRPCMethodName.h>
 #import <RemoteTest/Messages.pbobjc.h>
+#import <RxLibrary/GRXWriteable.h>
+#import <RxLibrary/GRXWriter+Immediate.h>
 
 // These are a few tests similar to InteropTests, but which use the generic gRPC client (GRPCCall)
 // rather than a generated proto library on top of it.
diff --git a/src/objective-c/tests/InteropTests.m b/src/objective-c/tests/InteropTests.m
index 0a512c17dcb25eb9699dd6472468ba9d220c1cad..684f7c2ff6fc3b585434c75faf39902dfd669d7e 100644
--- a/src/objective-c/tests/InteropTests.m
+++ b/src/objective-c/tests/InteropTests.m
@@ -36,13 +36,13 @@
 #import <UIKit/UIKit.h>
 #import <XCTest/XCTest.h>
 
-#import <gRPC/GRXWriter+Immediate.h>
-#import <gRPC/GRXBufferedPipe.h>
-#import <gRPC/ProtoRPC.h>
+#import <ProtoRPC/ProtoRPC.h>
 #import <RemoteTest/Empty.pbobjc.h>
 #import <RemoteTest/Messages.pbobjc.h>
 #import <RemoteTest/Test.pbobjc.h>
 #import <RemoteTest/Test.pbrpc.h>
+#import <RxLibrary/GRXBufferedPipe.h>
+#import <RxLibrary/GRXWriter+Immediate.h>
 
 // Convenience constructors for the generated proto messages:
 
diff --git a/src/objective-c/tests/LocalClearTextTests.m b/src/objective-c/tests/LocalClearTextTests.m
index 68ffd232003a1d70940db31d47a07c0e3df9ba2d..05cc10410a1157bda9e63643dbc24d804a9ef77d 100644
--- a/src/objective-c/tests/LocalClearTextTests.m
+++ b/src/objective-c/tests/LocalClearTextTests.m
@@ -34,12 +34,12 @@
 #import <UIKit/UIKit.h>
 #import <XCTest/XCTest.h>
 
-#import <gRPC/GRPCCall.h>
-#import <gRPC/GRPCMethodName.h>
-#import <gRPC/GRXWriter+Immediate.h>
-#import <gRPC/GRXWriteable.h>
+#import <GRPCClient/GRPCCall.h>
+#import <GRPCClient/GRPCMethodName.h>
 #import <RouteGuide/RouteGuide.pbobjc.h>
 #import <RouteGuide/RouteGuide.pbrpc.h>
+#import <RxLibrary/GRXWriteable.h>
+#import <RxLibrary/GRXWriter+Immediate.h>
 
 // These tests require a gRPC "RouteGuide" sample server to be running locally. You can compile and
 // run one by following the instructions here: https://github.com/grpc/grpc-common/blob/master/cpp/cpptutorial.md#try-it-out
diff --git a/src/objective-c/tests/RxLibraryUnitTests.m b/src/objective-c/tests/RxLibraryUnitTests.m
index 89984d9481ce85b228c6c1d43cd0b28fad332641..5e3162875a737a36dfea11d8ea40aebcd1651236 100644
--- a/src/objective-c/tests/RxLibraryUnitTests.m
+++ b/src/objective-c/tests/RxLibraryUnitTests.m
@@ -34,9 +34,9 @@
 #import <UIKit/UIKit.h>
 #import <XCTest/XCTest.h>
 
-#import <gRPC/GRXBufferedPipe.h>
-#import <gRPC/GRXWriter.h>
-#import <gRPC/GRXWriteable.h>
+#import <RxLibrary/GRXBufferedPipe.h>
+#import <RxLibrary/GRXWriteable.h>
+#import <RxLibrary/GRXWriter.h>
 
 // A mock of a GRXSingleValueHandler block that can be queried for how many times it was called and
 // what were the last values passed to it.
diff --git a/templates/BUILD.template b/templates/BUILD.template
index ec5fb3584f00295e418679911b6a0b6d6ec2d782..63e9f9ebeb6f471e2107928f5baf081c93dbb9b8 100644
--- a/templates/BUILD.template
+++ b/templates/BUILD.template
@@ -112,3 +112,30 @@ cc_binary(
   ],
 )
 </%def>
+
+objc_path = "src/objective-c"
+
+rx_library_path = objc_path + "/RxLibrary"
+
+objc_library(
+    name = "rx_library",
+    hdrs = glob([
+        rx_library_path + "/*.h",
+        rx_library_path + "/transformations/*.h",
+    ]),
+    srcs = glob([
+        rx_library_path + "/*.m",
+        rx_library_path + "/transformations/*.m",
+    ]),
+    includes = [objc_path],
+    deps = [
+        ":rx_library_private",
+    ],
+)
+
+objc_library(
+    name = "rx_library_private",
+    hdrs = glob([rx_library_path + "/private/*.h"]),
+    srcs = glob([rx_library_path + "/private/*.m"]),
+    visibility = ["//visibility:private"],
+)
diff --git a/templates/gRPC.podspec.template b/templates/gRPC.podspec.template
index 03c303b414a4a534bc222f0a2b0510e139ff161d..02e90d718047ee15a44dc2686eb52ad7e031fe1e 100644
--- a/templates/gRPC.podspec.template
+++ b/templates/gRPC.podspec.template
@@ -38,11 +38,27 @@ bad_header_names = ('time.h', 'string.h')
 def fix_header_name(name):
   split_name = name.split('/')
   if split_name[-1] in bad_header_names:
-    return '/'.join(split_name[:-1] + ['grpc_' + split_name[-1]])
-  else:
-    return name
+    split_name[-1] = 'grpc_' + split_name[-1]
+  if split_name[0] == 'include':
+    split_name = split_name[1:]
+  return '/'.join(split_name)
+
+def grpc_files(libs):
+  out = []
+  for lib in libs:
+    if lib.name in ("grpc", "gpr"):
+      out.extend(fix_header_name(h) for h in lib.get('headers', []))
+      out.extend(fix_header_name(h) for h in lib.get('public_headers', []))
+      out.extend(lib.get('src', []))
+  return out;
+
+def grpc_private_headers(libs):
+  out = []
+  for lib in libs:
+    if lib.name in ("grpc", "gpr"):
+      out.extend(lib.get('headers', []))
+  return out
 %>
-
 Pod::Spec.new do |s|
   s.name     = 'gRPC'
   s.version  = '0.6.0'
@@ -58,53 +74,27 @@ Pod::Spec.new do |s|
   s.osx.deployment_target = '10.8'
   s.requires_arc = true
 
+  objc_dir = 'src/objective-c'
+
   # Reactive Extensions library for iOS.
-  s.subspec 'RxLibrary' do |rs|
-    rs.source_files = 'src/objective-c/RxLibrary/*.{h,m}',
-                      'src/objective-c/RxLibrary/transformations/*.{h,m}',
-                      'src/objective-c/RxLibrary/private/*.{h,m}'
-    rs.private_header_files = 'src/objective-c/RxLibrary/private/*.h'
+  s.subspec 'RxLibrary' do |ss|
+    src_dir = "#{objc_dir}/RxLibrary"
+    ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}"
+    ss.private_header_files = "#{src_dir}/private/*.h"
+    ss.header_mappings_dir = "#{objc_dir}"
   end
 
   # Core cross-platform gRPC library, written in C.
-  s.subspec 'C-Core' do |cs|
-    cs.source_files = \
-% for lib in libs:
-% if lib.name in ("grpc", "gpr"):
-% for hdr in lib.get("headers", []):
-'${fix_header_name(hdr)}', \
-% endfor
-% for hdr in lib.get("public_headers", []):
-'${fix_header_name(hdr)}', \
-% endfor
-% for src in lib.src:
-'${src}', \
-% endfor
-% endif
-% endfor
-
-    cs.private_header_files = \
-% for lib in libs:
-% if lib.name in ("grpc", "gpr"):
-% for hdr in lib.get("headers", []):
-'${hdr}', \
-% endfor
-% endif
-% endfor
-
-    cs.header_mappings_dir = '.'
-    # The core library includes its headers as either "src/core/..." or "grpc/...", meaning we have
-    # to tell XCode to look for headers under the "include" subdirectory too.
-    #
-    # TODO(jcanizales): Instead of doing this, during installation move everything under
-    # "include/grpc" one directory up. The directory names under PODS_ROOT are implementation
-    # details of Cocoapods, and have changed in the past, breaking this podspec.
-    cs.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Headers/Private/gRPC" ' +
-                                             '"$(PODS_ROOT)/Headers/Private/gRPC/include"' }
-
-    cs.requires_arc = false
-    cs.libraries = 'z'
-    cs.dependency 'OpenSSL', '~> 1.0.200'
+  s.subspec 'C-Core' do |ss|
+    ss.source_files = ${(',\n' + 22*' ').join('\'%s\'' % f for f in grpc_files(libs))}
+
+    ss.private_header_files = ${(',\n' + 30*' ').join('\'%s\'' % f for f in grpc_private_headers(libs))}
+
+    ss.header_mappings_dir = '.'
+
+    ss.requires_arc = false
+    ss.libraries = 'z'
+    ss.dependency 'OpenSSL', '~> 1.0.200'
   end
 
   # This is a workaround for Cocoapods Issue #1437.
@@ -112,12 +102,15 @@ Pod::Spec.new do |s|
   # It needs to be here (top-level) instead of in the C-Core subspec because Cocoapods doesn't run
   # prepare_command's of subspecs.
   #
-  # TODO(jcanizales): Try out Todd Reed's solution at Issue #1437.
+  # TODO(jcanizales): Try out others' solutions at Issue #1437.
   s.prepare_command = <<-CMD
+    # Move contents of include up a level to avoid manually specifying include paths
+    cp -r "include/grpc" "."
+
     DIR_TIME="grpc/support"
     BAD_TIME="$DIR_TIME/time.h"
     GOOD_TIME="$DIR_TIME/grpc_time.h"
-    grep -rl "$BAD_TIME" include/grpc src/core | xargs sed -i '' -e s@$BAD_TIME@$GOOD_TIME@g
+    grep -rl "$BAD_TIME" grpc src/core src/objective-c/GRPCClient | xargs sed -i '' -e s@$BAD_TIME@$GOOD_TIME@g
     if [ -f "include/$BAD_TIME" ];
     then
       mv -f "include/$BAD_TIME" "include/$GOOD_TIME"
@@ -126,7 +119,7 @@ Pod::Spec.new do |s|
     DIR_STRING="src/core/support"
     BAD_STRING="$DIR_STRING/string.h"
     GOOD_STRING="$DIR_STRING/grpc_string.h"
-    grep -rl "$BAD_STRING" include/grpc src/core | xargs sed -i '' -e s@$BAD_STRING@$GOOD_STRING@g
+    grep -rl "$BAD_STRING" grpc src/core src/objective-c/GRPCClient | xargs sed -i '' -e s@$BAD_STRING@$GOOD_STRING@g
     if [ -f "$BAD_STRING" ];
     then
       mv -f "$BAD_STRING" "$GOOD_STRING"
@@ -134,28 +127,27 @@ Pod::Spec.new do |s|
   CMD
 
   # Objective-C wrapper around the core gRPC library.
-  s.subspec 'GRPCClient' do |gs|
-    gs.source_files = 'src/objective-c/GRPCClient/*.{h,m}',
-                      'src/objective-c/GRPCClient/private/*.{h,m}'
-    gs.private_header_files = 'src/objective-c/GRPCClient/private/*.h'
-    gs.compiler_flags = '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w'
-
-    gs.dependency 'gRPC/C-Core'
-    # TODO(jcanizales): Remove this when the prepare_command moves everything under "include/grpc"
-    # one directory up.
-    gs.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Headers/Public/gRPC/include"' }
-    gs.dependency 'gRPC/RxLibrary'
+  s.subspec 'GRPCClient' do |ss|
+    src_dir = "#{objc_dir}/GRPCClient"
+    ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}"
+    ss.private_header_files = "#{src_dir}/private/*.h"
+    ss.header_mappings_dir = "#{objc_dir}"
+
+    ss.dependency 'gRPC/C-Core'
+    ss.dependency 'gRPC/RxLibrary'
 
     # Certificates, to be able to establish TLS connections:
-    gs.resource_bundles = { 'gRPC' => ['etc/roots.pem'] }
+    ss.resource_bundles = { 'gRPC' => ['etc/roots.pem'] }
   end
 
   # RPC library for ProtocolBuffers, based on gRPC
-  s.subspec 'ProtoRPC' do |ps|
-    ps.source_files = 'src/objective-c/ProtoRPC/*.{h,m}'
-
-    ps.dependency 'gRPC/GRPCClient'
-    ps.dependency 'gRPC/RxLibrary'
-    ps.dependency 'Protobuf', '~> 3.0.0-alpha-3'
+  s.subspec 'ProtoRPC' do |ss|
+    src_dir = "#{objc_dir}/ProtoRPC"
+    ss.source_files = "#{src_dir}/*.{h,m}"
+    ss.header_mappings_dir = "#{objc_dir}"
+
+    ss.dependency 'gRPC/GRPCClient'
+    ss.dependency 'gRPC/RxLibrary'
+    ss.dependency 'Protobuf', '~> 3.0.0-alpha-3'
   end
 end
diff --git a/templates/tools/doxygen/Doxyfile.include b/templates/tools/doxygen/Doxyfile.include
index 1391016348fb17c38372b9a9e7d3eaa9c7825763..2934ebe7d80b144ea95218c57452016005f9ec8f 100644
--- a/templates/tools/doxygen/Doxyfile.include
+++ b/templates/tools/doxygen/Doxyfile.include
@@ -778,7 +778,7 @@ WARN_LOGFILE           =
 # spaces.
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = ${' '.join(
+INPUT                  = ${' \\\n'.join(
                                itertools.chain.from_iterable(
 			           target.public_headers +
 				   ([]
diff --git a/test/proto/messages.proto b/test/proto/messages.proto
index 65a81404652520a211940cd4af81968620ea8dc2..500e79cc81a1ed7187d955fe6fe94582bae85230 100644
--- a/test/proto/messages.proto
+++ b/test/proto/messages.proto
@@ -46,6 +46,14 @@ enum PayloadType {
   RANDOM = 2;
 }
 
+// Compression algorithms
+enum CompressionType {
+  // No compression
+  NONE = 0;
+  GZIP = 1;
+  DEFLATE = 2;
+}
+
 // A block of data, to simply increase gRPC message size.
 message Payload {
   // The type of data in body.
@@ -54,6 +62,13 @@ message Payload {
   optional bytes body = 2;
 }
 
+// A protobuf representation for grpc status. This is used by test
+// clients to specify a status that the server should attempt to return.
+message EchoStatus { 
+  optional int32 code = 1;
+  optional string message = 2;
+}
+
 // Unary request.
 message SimpleRequest {
   // Desired payload type in the response from the server.
@@ -72,6 +87,12 @@ message SimpleRequest {
 
   // Whether SimpleResponse should include OAuth scope.
   optional bool fill_oauth_scope = 5;
+
+  // Compression algorithm to be used by the server for the response (stream)
+  optional CompressionType response_compression = 6;
+
+  // Whether server should return a given status
+  optional EchoStatus response_status = 7;
 }
 
 // Unary response, as configured by the request.
@@ -123,6 +144,12 @@ message StreamingOutputCallRequest {
 
   // Optional input payload sent along with the request.
   optional Payload payload = 3;
+
+  // Compression algorithm to be used by the server for the response (stream)
+  optional CompressionType response_compression = 6;
+
+  // Whether server should return a given status
+  optional EchoStatus response_status = 7;
 }
 
 // Server-streaming response, as configured by the request and parameters.
diff --git a/test/proto/test.proto b/test/proto/test.proto
index b9483d84378380ed4a216ae76680ac08a7c23aec..1214152513fa1de963cc67fa973d5aa1a0f141e5 100644
--- a/test/proto/test.proto
+++ b/test/proto/test.proto
@@ -71,3 +71,11 @@ service TestService {
   rpc HalfDuplexCall(stream StreamingOutputCallRequest)
       returns (stream StreamingOutputCallResponse);
 }
+
+
+// A simple service NOT implemented at servers so clients can test for
+// that case.
+service UnimplementedService {
+  // A call that no server should implement
+  rpc UnimplementedCall(grpc.testing.Empty) returns(grpc.testing.Empty);  
+}
diff --git a/src/core/transport/chttp2/gen_hpack_tables.c b/tools/codegen/core/gen_hpack_tables.c
similarity index 100%
rename from src/core/transport/chttp2/gen_hpack_tables.c
rename to tools/codegen/core/gen_hpack_tables.c
diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++
index f947b7823ebec799c2de6e4515692d3cbbfca1dd..d782dc18f789feda4b7c01fceb35532ded0efa7f 100644
--- a/tools/doxygen/Doxyfile.c++
+++ b/tools/doxygen/Doxyfile.c++
@@ -760,7 +760,43 @@ WARN_LOGFILE           =
 # spaces.
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = include/grpc++/async_generic_service.h include/grpc++/async_unary_call.h include/grpc++/byte_buffer.h include/grpc++/channel_arguments.h include/grpc++/channel_interface.h include/grpc++/client_context.h include/grpc++/completion_queue.h include/grpc++/config.h include/grpc++/config_protobuf.h include/grpc++/create_channel.h include/grpc++/credentials.h include/grpc++/generic_stub.h include/grpc++/impl/call.h include/grpc++/impl/client_unary_call.h include/grpc++/impl/grpc_library.h include/grpc++/impl/internal_stub.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++/slice.h include/grpc++/status.h include/grpc++/status_code_enum.h include/grpc++/stream.h include/grpc++/thread_pool_interface.h include/grpc++/time.h
+INPUT                  = include/grpc++/async_generic_service.h \
+include/grpc++/async_unary_call.h \
+include/grpc++/byte_buffer.h \
+include/grpc++/channel_arguments.h \
+include/grpc++/channel_interface.h \
+include/grpc++/client_context.h \
+include/grpc++/completion_queue.h \
+include/grpc++/config.h \
+include/grpc++/config_protobuf.h \
+include/grpc++/create_channel.h \
+include/grpc++/credentials.h \
+include/grpc++/generic_stub.h \
+include/grpc++/impl/call.h \
+include/grpc++/impl/client_unary_call.h \
+include/grpc++/impl/grpc_library.h \
+include/grpc++/impl/internal_stub.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++/slice.h \
+include/grpc++/status.h \
+include/grpc++/status_code_enum.h \
+include/grpc++/stream.h \
+include/grpc++/thread_pool_interface.h \
+include/grpc++/time.h
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index deee6837a02e53cd41f6ab83f787cca8babf2f5e..575cd95753e118070f91b816503c5ad0bc2dd0d2 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -760,7 +760,74 @@ WARN_LOGFILE           =
 # spaces.
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = include/grpc++/async_generic_service.h include/grpc++/async_unary_call.h include/grpc++/byte_buffer.h include/grpc++/channel_arguments.h include/grpc++/channel_interface.h include/grpc++/client_context.h include/grpc++/completion_queue.h include/grpc++/config.h include/grpc++/config_protobuf.h include/grpc++/create_channel.h include/grpc++/credentials.h include/grpc++/generic_stub.h include/grpc++/impl/call.h include/grpc++/impl/client_unary_call.h include/grpc++/impl/grpc_library.h include/grpc++/impl/internal_stub.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++/slice.h include/grpc++/status.h include/grpc++/status_code_enum.h include/grpc++/stream.h include/grpc++/thread_pool_interface.h include/grpc++/time.h src/cpp/client/secure_credentials.h src/cpp/server/secure_server_credentials.h src/cpp/client/channel.h src/cpp/server/thread_pool.h src/cpp/client/secure_channel_arguments.cc src/cpp/client/secure_credentials.cc src/cpp/server/secure_server_credentials.cc 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/credentials.cc src/cpp/client/generic_stub.cc src/cpp/client/insecure_credentials.cc src/cpp/client/internal_stub.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/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/server/thread_pool.cc src/cpp/util/byte_buffer.cc src/cpp/util/slice.cc src/cpp/util/status.cc src/cpp/util/time.cc
+INPUT                  = include/grpc++/async_generic_service.h \
+include/grpc++/async_unary_call.h \
+include/grpc++/byte_buffer.h \
+include/grpc++/channel_arguments.h \
+include/grpc++/channel_interface.h \
+include/grpc++/client_context.h \
+include/grpc++/completion_queue.h \
+include/grpc++/config.h \
+include/grpc++/config_protobuf.h \
+include/grpc++/create_channel.h \
+include/grpc++/credentials.h \
+include/grpc++/generic_stub.h \
+include/grpc++/impl/call.h \
+include/grpc++/impl/client_unary_call.h \
+include/grpc++/impl/grpc_library.h \
+include/grpc++/impl/internal_stub.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++/slice.h \
+include/grpc++/status.h \
+include/grpc++/status_code_enum.h \
+include/grpc++/stream.h \
+include/grpc++/thread_pool_interface.h \
+include/grpc++/time.h \
+src/cpp/client/secure_credentials.h \
+src/cpp/server/secure_server_credentials.h \
+src/cpp/client/channel.h \
+src/cpp/server/thread_pool.h \
+src/cpp/client/secure_channel_arguments.cc \
+src/cpp/client/secure_credentials.cc \
+src/cpp/server/secure_server_credentials.cc \
+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/credentials.cc \
+src/cpp/client/generic_stub.cc \
+src/cpp/client/insecure_credentials.cc \
+src/cpp/client/internal_stub.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/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/server/thread_pool.cc \
+src/cpp/util/byte_buffer.cc \
+src/cpp/util/slice.cc \
+src/cpp/util/status.cc \
+src/cpp/util/time.cc
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core
index 7cc96b2e06a337b32bc63b4f08a9adda540bb4b2..1bfd78752897d25800cd20759cdce350937a881f 100644
--- a/tools/doxygen/Doxyfile.core
+++ b/tools/doxygen/Doxyfile.core
@@ -760,7 +760,41 @@ WARN_LOGFILE           =
 # spaces.
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = include/grpc/grpc_security.h include/grpc/byte_buffer.h include/grpc/byte_buffer_reader.h include/grpc/compression.h include/grpc/grpc.h include/grpc/status.h include/grpc/census.h 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/cancellable_platform.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
+INPUT                  = include/grpc/grpc_security.h \
+include/grpc/byte_buffer.h \
+include/grpc/byte_buffer_reader.h \
+include/grpc/compression.h \
+include/grpc/grpc.h \
+include/grpc/status.h \
+include/grpc/census.h \
+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/cancellable_platform.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
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index ce18bb4f272c3e05647085283677f57874b355da..0fa529f89e1e99f50ed873ed24dc86d04975431d 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -760,7 +760,302 @@ WARN_LOGFILE           =
 # spaces.
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = include/grpc/grpc_security.h include/grpc/byte_buffer.h include/grpc/byte_buffer_reader.h include/grpc/compression.h include/grpc/grpc.h include/grpc/status.h include/grpc/census.h src/core/httpcli/format_request.h src/core/httpcli/httpcli.h src/core/httpcli/httpcli_security_connector.h src/core/httpcli/parser.h 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/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/core/census/grpc_context.h src/core/channel/census_filter.h src/core/channel/channel_args.h src/core/channel/channel_stack.h src/core/channel/child_channel.h src/core/channel/client_channel.h src/core/channel/client_setup.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/compression/message_compress.h src/core/debug/trace.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_kick_posix.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/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/surface/byte_buffer_queue.h src/core/surface/call.h src/core/surface/channel.h src/core/surface/client.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/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/metadata.h src/core/transport/stream_op.h src/core/transport/transport.h src/core/transport/transport_impl.h src/core/census/context.h src/core/httpcli/format_request.c src/core/httpcli/httpcli.c src/core/httpcli/httpcli_security_connector.c src/core/httpcli/parser.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/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 src/core/census/grpc_context.c src/core/channel/channel_args.c src/core/channel/channel_stack.c src/core/channel/child_channel.c src/core/channel/client_channel.c src/core/channel/client_setup.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/compression/algorithm.c src/core/compression/message_compress.c src/core/debug/trace.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_kick_posix.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/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/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_create.c src/core/surface/client.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/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/status_conversion.c src/core/transport/chttp2/stream_encoder.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_transport.c src/core/transport/metadata.c src/core/transport/stream_op.c src/core/transport/transport.c src/core/transport/transport_op_string.c src/core/census/context.c src/core/census/initialize.c 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/cancellable_platform.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 src/core/support/env.h src/core/support/file.h src/core/support/murmur_hash.h src/core/support/string.h src/core/support/string_win32.h src/core/support/thd_internal.h src/core/support/alloc.c src/core/support/cancellable.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/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
+INPUT                  = include/grpc/grpc_security.h \
+include/grpc/byte_buffer.h \
+include/grpc/byte_buffer_reader.h \
+include/grpc/compression.h \
+include/grpc/grpc.h \
+include/grpc/status.h \
+include/grpc/census.h \
+src/core/httpcli/format_request.h \
+src/core/httpcli/httpcli.h \
+src/core/httpcli/httpcli_security_connector.h \
+src/core/httpcli/parser.h \
+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/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/core/census/grpc_context.h \
+src/core/channel/census_filter.h \
+src/core/channel/channel_args.h \
+src/core/channel/channel_stack.h \
+src/core/channel/child_channel.h \
+src/core/channel/client_channel.h \
+src/core/channel/client_setup.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/compression/message_compress.h \
+src/core/debug/trace.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_kick_posix.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/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/surface/byte_buffer_queue.h \
+src/core/surface/call.h \
+src/core/surface/channel.h \
+src/core/surface/client.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/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/metadata.h \
+src/core/transport/stream_op.h \
+src/core/transport/transport.h \
+src/core/transport/transport_impl.h \
+src/core/census/context.h \
+src/core/httpcli/format_request.c \
+src/core/httpcli/httpcli.c \
+src/core/httpcli/httpcli_security_connector.c \
+src/core/httpcli/parser.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/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 \
+src/core/census/grpc_context.c \
+src/core/channel/channel_args.c \
+src/core/channel/channel_stack.c \
+src/core/channel/child_channel.c \
+src/core/channel/client_channel.c \
+src/core/channel/client_setup.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/compression/algorithm.c \
+src/core/compression/message_compress.c \
+src/core/debug/trace.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_kick_posix.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/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/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_create.c \
+src/core/surface/client.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/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/status_conversion.c \
+src/core/transport/chttp2/stream_encoder.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_transport.c \
+src/core/transport/metadata.c \
+src/core/transport/stream_op.c \
+src/core/transport/transport.c \
+src/core/transport/transport_op_string.c \
+src/core/census/context.c \
+src/core/census/initialize.c \
+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/cancellable_platform.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 \
+src/core/support/env.h \
+src/core/support/file.h \
+src/core/support/murmur_hash.h \
+src/core/support/string.h \
+src/core/support/string_win32.h \
+src/core/support/thd_internal.h \
+src/core/support/alloc.c \
+src/core/support/cancellable.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/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
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json
index ff985b37346ed3d3232b0209cb23f7cbf2a0890d..4092759b2d83c15e8bf3a9397ff0225078e48998 100644
--- a/tools/run_tests/sources_and_headers.json
+++ b/tools/run_tests/sources_and_headers.json
@@ -199,7 +199,6 @@
   }, 
   {
     "deps": [
-      "grpc_test_util", 
       "gpr", 
       "grpc"
     ], 
@@ -207,7 +206,7 @@
     "language": "c", 
     "name": "gen_hpack_tables", 
     "src": [
-      "src/core/transport/chttp2/gen_hpack_tables.c"
+      "tools/codegen/core/gen_hpack_tables.c"
     ]
   }, 
   {
diff --git a/vsprojects/Grpc.mak b/vsprojects/Grpc.mak
index 27f0b3aec30eb2d077b8395831670ff688511550..b3be4fcf248b26775d178f01e7f3cd77dec8b8e4 100644
--- a/vsprojects/Grpc.mak
+++ b/vsprojects/Grpc.mak
@@ -135,8 +135,8 @@ fling_server: fling_server.exe
 	$(OUT_DIR)\fling_server.exe
 gen_hpack_tables.exe: build_libs $(OUT_DIR)
 	echo Building gen_hpack_tables
-	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\src\core\transport\chttp2\gen_hpack_tables.c 
-	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gen_hpack_tables.exe" Debug\grpc_test_util.lib Debug\gpr.lib Debug\grpc.lib $(LIBS) $(OUT_DIR)\gen_hpack_tables.obj 
+	$(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\tools\codegen\core\gen_hpack_tables.c 
+	$(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gen_hpack_tables.exe" Debug\gpr.lib Debug\grpc.lib $(LIBS) $(OUT_DIR)\gen_hpack_tables.obj 
 gen_hpack_tables: gen_hpack_tables.exe
 	echo Running gen_hpack_tables
 	$(OUT_DIR)\gen_hpack_tables.exe