diff --git a/BUILD b/BUILD
index 52d1d5a69f0c77fc651af3454952198cb2ee1bd6..fc4dfe8d9acc25adae764c0daef3c52062cace77 100644
--- a/BUILD
+++ b/BUILD
@@ -41,6 +41,7 @@ package(default_visibility = ["//visibility:public"])
 
 
 
+
 cc_library(
   name = "gpr",
   srcs = [
@@ -154,6 +155,7 @@ cc_library(
 )
 
 
+
 cc_library(
   name = "grpc",
   srcs = [
@@ -294,10 +296,6 @@ cc_library(
     "src/core/lib/tsi/ssl_types.h",
     "src/core/lib/tsi/transport_security.h",
     "src/core/lib/tsi/transport_security_interface.h",
-    "third_party/nanopb/pb.h",
-    "third_party/nanopb/pb_common.h",
-    "third_party/nanopb/pb_decode.h",
-    "third_party/nanopb/pb_encode.h",
     "src/core/ext/transport/chttp2/client/insecure/channel_create.c",
     "src/core/ext/transport/chttp2/client/secure/secure_channel_create.c",
     "src/core/ext/transport/chttp2/server/insecure/server_chttp2.c",
@@ -459,9 +457,6 @@ cc_library(
     "src/core/lib/tsi/fake_transport_security.c",
     "src/core/lib/tsi/ssl_transport_security.c",
     "src/core/lib/tsi/transport_security.c",
-    "third_party/nanopb/pb_common.c",
-    "third_party/nanopb/pb_decode.c",
-    "third_party/nanopb/pb_encode.c",
   ],
   hdrs = [
     "include/grpc/byte_buffer.h",
@@ -486,6 +481,7 @@ cc_library(
     "//external:libssl",
     "//external:zlib",
     ":gpr",
+    "//external:nanopb",
   ],
   copts = [
     "-std=gnu99",
@@ -493,6 +489,7 @@ cc_library(
 )
 
 
+
 cc_library(
   name = "grpc_codegen_lib",
   srcs = [
@@ -529,6 +526,7 @@ cc_library(
 )
 
 
+
 cc_library(
   name = "grpc_unsecure",
   srcs = [
@@ -655,10 +653,6 @@ cc_library(
     "src/core/lib/transport/static_metadata.h",
     "src/core/lib/transport/transport.h",
     "src/core/lib/transport/transport_impl.h",
-    "third_party/nanopb/pb.h",
-    "third_party/nanopb/pb_common.h",
-    "third_party/nanopb/pb_decode.h",
-    "third_party/nanopb/pb_encode.h",
     "src/core/ext/transport/chttp2/client/insecure/channel_create.c",
     "src/core/ext/transport/chttp2/server/insecure/server_chttp2.c",
     "src/core/ext/transport/chttp2/transport/alpn.c",
@@ -800,9 +794,6 @@ cc_library(
     "src/core/lib/transport/static_metadata.c",
     "src/core/lib/transport/transport.c",
     "src/core/lib/transport/transport_op_string.c",
-    "third_party/nanopb/pb_common.c",
-    "third_party/nanopb/pb_decode.c",
-    "third_party/nanopb/pb_encode.c",
   ],
   hdrs = [
     "include/grpc/byte_buffer.h",
@@ -824,6 +815,7 @@ cc_library(
   ],
   deps = [
     ":gpr",
+    "//external:nanopb",
   ],
   copts = [
     "-std=gnu99",
@@ -831,6 +823,7 @@ cc_library(
 )
 
 
+
 cc_library(
   name = "grpc_zookeeper",
   srcs = [
@@ -851,6 +844,7 @@ cc_library(
 )
 
 
+
 cc_library(
   name = "grpc++",
   srcs = [
@@ -983,6 +977,7 @@ cc_library(
 )
 
 
+
 cc_library(
   name = "grpc++_codegen_lib",
   srcs = [
@@ -1046,10 +1041,12 @@ cc_library(
     ".",
   ],
   deps = [
+    "//external:protobuf_clib",
   ],
 )
 
 
+
 cc_library(
   name = "grpc++_unsecure",
   srcs = [
@@ -1174,6 +1171,7 @@ cc_library(
 )
 
 
+
 cc_library(
   name = "grpc_plugin_support",
   srcs = [
@@ -1225,6 +1223,7 @@ cc_library(
 )
 
 
+
 cc_library(
   name = "grpc_csharp_ext",
   srcs = [
@@ -1244,6 +1243,7 @@ cc_library(
 
 
 
+
 objc_library(
   name = "gpr_objc",
   srcs = [
@@ -1357,6 +1357,7 @@ objc_library(
 )
 
 
+
 objc_library(
   name = "grpc_objc",
   srcs = [
@@ -1521,9 +1522,6 @@ objc_library(
     "src/core/lib/tsi/fake_transport_security.c",
     "src/core/lib/tsi/ssl_transport_security.c",
     "src/core/lib/tsi/transport_security.c",
-    "third_party/nanopb/pb_common.c",
-    "third_party/nanopb/pb_decode.c",
-    "third_party/nanopb/pb_encode.c",
   ],
   hdrs = [
     "include/grpc/byte_buffer.h",
@@ -1676,10 +1674,6 @@ objc_library(
     "src/core/lib/tsi/ssl_types.h",
     "src/core/lib/tsi/transport_security.h",
     "src/core/lib/tsi/transport_security_interface.h",
-    "third_party/nanopb/pb.h",
-    "third_party/nanopb/pb_common.h",
-    "third_party/nanopb/pb_decode.h",
-    "third_party/nanopb/pb_encode.h",
   ],
   includes = [
     "include",
@@ -1688,6 +1682,7 @@ objc_library(
   deps = [
     ":gpr_objc",
     "//external:libssl_objc",
+    "//external:nanopb",
   ],
   sdk_dylibs = ["libz"],
 )
diff --git a/templates/BUILD.template b/templates/BUILD.template
index 54dc69712526d5367085bd0654c9dc052df41803..23a656c3608528bd431e3ed9a5cf4dd1b67c2b91 100644
--- a/templates/BUILD.template
+++ b/templates/BUILD.template
@@ -49,7 +49,9 @@
       ]
     if target_dict.get('build', None) == 'protoc':
       deps.append("//external:protobuf_compiler")
-    if target_dict['name'] == 'grpc++_unsecure' or target_dict['name'] == 'grpc++':
+    if (target_dict['name'] == 'grpc++_unsecure' or
+        target_dict['name'] == 'grpc++' or
+        target_dict['name'] == 'grpc++_codegen_lib'):
       deps.append("//external:protobuf_clib")
     elif target_dict['name'] == 'grpc':
       deps.append("//external:zlib")
@@ -60,7 +62,7 @@
         deps.append(':%s' % (d))
     return deps
   %>
-  
+
   % for lib in libs:
   % if lib.build in ("all", "protoc"):
   ${cc_library(lib)}
@@ -80,13 +82,19 @@
   % endfor
   
   <%def name="cc_library(lib)">
+  <%
+    lib_hdrs = lib.get("headers", [])
+    hdrs = [h for h in lib_hdrs if not h.startswith('third_party/nanopb')]
+    srcs = [s for s in lib.src if not s.startswith('third_party/nanopb')]
+    uses_nanopb = len(lib_hdrs) != len(hdrs) or len(srcs) != len(lib.src)
+  %>
   cc_library(
     name = "${lib.name}",
     srcs = [
-  % for hdr in lib.get("headers", []):
+  % for hdr in hdrs:
       "${hdr}",
   % endfor
-  % for src in lib.src:
+  % for src in srcs:
       "${src}",
   % endfor
     ],
@@ -103,6 +111,9 @@
   % for dep in get_deps(lib):
       "${dep}",
   % endfor
+  % if uses_nanopb:
+      "//external:nanopb",
+  % endif
     ],
   % if lib.name in ("grpc", "grpc_unsecure"):
     copts = [
@@ -113,10 +124,16 @@
   </%def>
   
   <%def name="objc_library(lib)">
+  <%
+    lib_hdrs = lib.get("headers", [])
+    hdrs = [h for h in lib_hdrs if not h.startswith('third_party/nanopb')]
+    srcs = [s for s in lib.src if not s.startswith('third_party/nanopb')]
+    uses_nanopb = len(lib_hdrs) != len(hdrs) or len(srcs) != len(lib.src)
+  %>
   objc_library(
     name = "${lib.name}_objc",
     srcs = [
-  % for src in lib.src:
+  % for src in srcs:
       "${src}",
   % endfor
     ],
@@ -124,7 +141,7 @@
   % for hdr in lib.get("public_headers", []):
       "${hdr}",
   % endfor
-  % for hdr in lib.get("headers", []):
+  % for hdr in hdrs:
       "${hdr}",
   % endfor
     ],
@@ -138,6 +155,9 @@
   % endfor
   % if lib.get('secure', False):
       "//external:libssl_objc",
+  % endif
+  % if uses_nanopb:
+      "//external:nanopb",
   % endif
     ],
   % if lib.get("baselib", false):