| diff --git a/tools/build_rules/genproto.bzl b/tools/build_rules/genproto.bzl | 
 | index 62284a3..bc76cd1 100644 | 
 | --- a/tools/build_rules/genproto.bzl | 
 | +++ b/tools/build_rules/genproto.bzl | 
 | @@ -25,6 +25,8 @@ def gensrcjar_impl(ctx): | 
 |          "JAR='%s'" % ctx.executable._jar.path, | 
 |          "OUTPUT='%s'" % out.path, | 
 |          "PROTO_COMPILER='%s'" % ctx.executable._proto_compiler.path, | 
 | +        "GRPC_JAVA_PLUGIN='%s'" % ctx.executable.grpc_java_plugin.path if \ | 
 | +            ctx.executable.grpc_java_plugin else "", | 
 |          "SOURCE='%s'" % ctx.file.src.path, | 
 |          ctx.executable._gensrcjar.path, | 
 |      ]), | 
 | @@ -43,14 +45,19 @@ gensrcjar = rule( | 
 |              allow_files = proto_filetype, | 
 |              single_file = True, | 
 |          ), | 
 | +        "grpc_java_plugin": attr.label( | 
 | +            cfg = "host", | 
 | +            executable = True, | 
 | +            single_file = True, | 
 | +        ), | 
 |          "_gensrcjar": attr.label( | 
 | -            default = Label("@bazel_tools//tools/build_rules:gensrcjar"), | 
 | +            default = Label("//tools/build_rules:gensrcjar"), | 
 |              executable = True, | 
 |          ), | 
 |          # TODO(bazel-team): this should be a hidden attribute with a default | 
 |          # value, but Skylark needs to support select first. | 
 |          "_proto_compiler": attr.label( | 
 | -            default = Label("@bazel_tools//third_party/protobuf:protoc"), | 
 | +            default = Label("//third_party/protobuf:protoc"), | 
 |              allow_files = True, | 
 |              executable = True, | 
 |              single_file = True, | 
 | @@ -73,13 +80,42 @@ gensrcjar = rule( | 
 |      outputs = {"srcjar": "lib%{name}.srcjar"}, | 
 |  ) | 
 |   | 
 | +def cc_grpc_library(name, src): | 
 | +  basename = src[:-len(".proto")] | 
 | + | 
 | +  native.genrule( | 
 | +      name = name + "_codegen", | 
 | +      srcs = [src], | 
 | +      tools = ["//third_party/protobuf:protoc", "//third_party/grpc:cpp_plugin"], | 
 | +      cmd = "\\\n".join([ | 
 | +          "$(location //third_party/protobuf:protoc)", | 
 | +          "    --plugin=protoc-gen-grpc=$(location //third_party/grpc:cpp_plugin)", | 
 | +          "    --cpp_out=$(GENDIR)", | 
 | +          "    --grpc_out=$(GENDIR)", | 
 | +          "    $(location " + src + ")"]), | 
 | +      outs = [basename + ".grpc.pb.h", basename + ".grpc.pb.cc", basename + ".pb.cc", basename + ".pb.h"]) | 
 | + | 
 | +  native.cc_library( | 
 | +      name = name, | 
 | +      srcs = [basename + ".grpc.pb.cc", basename + ".pb.cc"], | 
 | +      hdrs = [basename + ".grpc.pb.h", basename + ".pb.h"], | 
 | +      deps = ["//third_party/grpc:grpc++"], | 
 | +      includes = ["."]) | 
 | + | 
 |  # TODO(bazel-team): support proto => proto dependencies too | 
 | -def java_proto_library(name, src): | 
 | -  gensrcjar(name=name + "_srcjar", src=src) | 
 | +def java_proto_library(name, src, use_grpc_plugin=False): | 
 | +  grpc_java_plugin = None | 
 | +  if use_grpc_plugin: | 
 | +    grpc_java_plugin = "//third_party/grpc:grpc-java-plugin" | 
 | + | 
 | +  gensrcjar(name=name + "_srcjar", src=src, grpc_java_plugin=grpc_java_plugin) | 
 | +  deps = ["//third_party/protobuf"] | 
 | +  if use_grpc_plugin: | 
 | +    deps += ["//third_party/grpc:grpc-jar", "//third_party:guava"] | 
 |    native.java_library( | 
 |      name=name, | 
 |      srcs=[name + "_srcjar"], | 
 | -    deps=["@bazel_tools//third_party/protobuf"], | 
 | +    deps=deps, | 
 |      # The generated code has lots of 'rawtypes' warnings. | 
 |      javacopts=["-Xlint:-rawtypes"], | 
 |  ) | 
 | diff --git a/tools/build_rules/gensrcjar.sh b/tools/build_rules/gensrcjar.sh | 
 | index b94408a..c1674a3 100755 | 
 | --- a/tools/build_rules/gensrcjar.sh | 
 | +++ b/tools/build_rules/gensrcjar.sh | 
 | @@ -65,8 +65,14 @@ main() { | 
 |    "${PREPROCESSOR}" <"${SOURCE}" >"${processed_source}" \ | 
 |        || err "Preprocessor ${PREPROCESSOR} failed" | 
 |   | 
 | -  "${PROTO_COMPILER}" --java_out="${proto_output}" "${processed_source}" \ | 
 | -      || err "proto_compiler failed" | 
 | +  if [ -n "${GRPC_JAVA_PLUGIN}" ]; then | 
 | +    "${PROTO_COMPILER}" --plugin=protoc-gen-grpc="${GRPC_JAVA_PLUGIN}" \ | 
 | +        --grpc_out="${proto_output}" --java_out="${proto_output}" "${processed_source}" \ | 
 | +        || err "proto_compiler failed" | 
 | +  else | 
 | +    "${PROTO_COMPILER}" --java_out="${proto_output}" "${processed_source}" \ | 
 | +        || err "proto_compiler failed" | 
 | +  fi | 
 |    find "${proto_output}" -exec touch -t "${TIMESTAMP}" '{}' \; \ | 
 |        || err "Failed to reset timestamps" | 
 |    "${JAR}" cMf "${OUTPUT}.tmp" -C "${proto_output}" . \ |