diff --git a/Makefile b/Makefile
index e931d0d13c0f1037a6cefaa478d71074e322d47d..4f9184f4a4c483e00415c73748ce9badcd5fb9d5 100644
--- a/Makefile
+++ b/Makefile
@@ -2331,7 +2331,7 @@ $(GENDIR)/src/proto/grpc/testing/echo.pb.cc: src/proto/grpc/testing/echo.proto $
 $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc: src/proto/grpc/testing/echo.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc
 	$(E) "[GRPC]    Generating gRPC's protobuf service CC file from $<"
 	$(Q) mkdir -p `dirname $@`
-	$(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $<
+	$(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=generate_mock_code=true:$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $<
 endif
 
 ifeq ($(NO_PROTOC),true)
diff --git a/include/grpc++/test/mock_stream.h b/include/grpc++/test/mock_stream.h
index 1b1a7351855997a41da01db8d65726ea5bbfcd47..e1dbd5ae3f475b127cc808e09a8eaabd1ae41f7f 100644
--- a/include/grpc++/test/mock_stream.h
+++ b/include/grpc++/test/mock_stream.h
@@ -3,11 +3,11 @@
 
 #include <stdint.h>
 
+#include <gmock/gmock.h>
 #include <grpc++/impl/codegen/call.h>
 #include <grpc++/support/async_stream.h>
 #include <grpc++/support/async_unary_call.h>
 #include <grpc++/support/sync_stream.h>
-#include <gmock/gmock.h>
 
 namespace grpc {
 namespace testing {
diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc
index c13577ce52c0a99236b5837a1fa7706c5bece6ea..d64f8c95322e27f4f15152ce33611baaaf0292ea 100644
--- a/src/compiler/cpp_generator.cc
+++ b/src/compiler/cpp_generator.cc
@@ -1408,7 +1408,8 @@ grpc::string GetSourceEpilogue(grpc_generator::File *file,
 }
 
 // TODO(mmukhi): Make sure we need parameters or not.
-grpc::string GetMockPrologue(grpc_generator::File *file, const Parameters & /*params*/ ) {
+grpc::string GetMockPrologue(grpc_generator::File *file,
+                             const Parameters & /*params*/) {
   grpc::string output;
   {
     // Scope the output stream so it closes and finalizes output to the string.
@@ -1434,7 +1435,8 @@ grpc::string GetMockPrologue(grpc_generator::File *file, const Parameters & /*pa
 }
 
 // TODO(mmukhi): Add client-stream and completion-queue headers.
-grpc::string GetMockIncludes(grpc_generator::File *file, const Parameters &params) {
+grpc::string GetMockIncludes(grpc_generator::File *file,
+                             const Parameters &params) {
   grpc::string output;
   {
     // Scope the output stream so it closes and finalizes output to the string.
@@ -1442,9 +1444,8 @@ grpc::string GetMockIncludes(grpc_generator::File *file, const Parameters &param
     std::map<grpc::string, grpc::string> vars;
 
     static const char *headers_strs[] = {
-      "grpc++/impl/codegen/async_stream.h",
-      "grpc++/impl/codegen/sync_stream.h",
-      "gmock/gmock.h",
+        "grpc++/impl/codegen/async_stream.h",
+        "grpc++/impl/codegen/sync_stream.h", "gmock/gmock.h",
     };
     std::vector<grpc::string> headers(headers_strs, array_end(headers_strs));
     PrintIncludes(printer.get(), headers, params);
@@ -1452,7 +1453,7 @@ grpc::string GetMockIncludes(grpc_generator::File *file, const Parameters &param
     if (!file->package().empty()) {
       std::vector<grpc::string> parts = file->package_parts();
 
-      for(auto part = parts.begin(); part != parts.end(); part++) {
+      for (auto part = parts.begin(); part != parts.end(); part++) {
         vars["part"] = *part;
         printer->Print(vars, "namespace $part$ {\n");
       }
@@ -1475,36 +1476,33 @@ void PrintMockClientMethods(grpc_generator::Printer *printer,
         *vars,
         "MOCK_METHOD3($Method$, ::grpc::Status(::grpc::ClientContext* context, "
         "const $Request$& request, $Response$* response));\n");
-    printer->Print(
-        *vars,
-        "MOCK_METHOD3(Async$Method$Raw, "
-        "::grpc::ClientAsyncResponseReaderInterface< $Response$>*"
-        "(::grpc::ClientContext* context, const $Request$& request, "
-        "::grpc::CompletionQueue* cq));\n");
+    printer->Print(*vars,
+                   "MOCK_METHOD3(Async$Method$Raw, "
+                   "::grpc::ClientAsyncResponseReaderInterface< $Response$>*"
+                   "(::grpc::ClientContext* context, const $Request$& request, "
+                   "::grpc::CompletionQueue* cq));\n");
   } else if (ClientOnlyStreaming(method)) {
     printer->Print(
         *vars,
         "MOCK_METHOD2($Method$Raw, "
         "::grpc::ClientWriterInterface< $Request$>*"
         "(::grpc::ClientContext* context, $Response$* response));\n");
-    printer->Print(
-        *vars,
-        "MOCK_METHOD4(Async$Method$Raw, "
-        "::grpc::ClientAsyncWriterInterface< $Request$>*"
-        "(::grpc::ClientContext* context, $Response$* response, "
-        "::grpc::CompletionQueue* cq, void* tag));\n");
+    printer->Print(*vars,
+                   "MOCK_METHOD4(Async$Method$Raw, "
+                   "::grpc::ClientAsyncWriterInterface< $Request$>*"
+                   "(::grpc::ClientContext* context, $Response$* response, "
+                   "::grpc::CompletionQueue* cq, void* tag));\n");
   } else if (ServerOnlyStreaming(method)) {
     printer->Print(
         *vars,
         "MOCK_METHOD2($Method$Raw, "
         "::grpc::ClientReaderInterface< $Response$>*"
         "(::grpc::ClientContext* context, const $Request$& request));\n");
-    printer->Print(
-        *vars,
-        "MOCK_METHOD4(Async$Method$Raw, "
-        "::grpc::ClientAsyncReaderInterface< $Response$>*"
-        "(::grpc::ClientContext* context, const $Request$& request, "
-        "::grpc::CompletionQueue* cq, void* tag));\n");
+    printer->Print(*vars,
+                   "MOCK_METHOD4(Async$Method$Raw, "
+                   "::grpc::ClientAsyncReaderInterface< $Response$>*"
+                   "(::grpc::ClientContext* context, const $Request$& request, "
+                   "::grpc::CompletionQueue* cq, void* tag));\n");
   } else if (method->BidiStreaming()) {
     printer->Print(
         *vars,
@@ -1521,8 +1519,8 @@ void PrintMockClientMethods(grpc_generator::Printer *printer,
 }
 
 void PrintMockService(grpc_generator::Printer *printer,
-                              const grpc_generator::Service *service,
-                              std::map<grpc::string, grpc::string> *vars) {
+                      const grpc_generator::Service *service,
+                      std::map<grpc::string, grpc::string> *vars) {
   (*vars)["Service"] = service->name();
 
   printer->Print(service->GetLeadingComments("//").c_str());
@@ -1540,7 +1538,6 @@ void PrintMockService(grpc_generator::Printer *printer,
   }
   printer->Outdent();
   printer->Print("};\n");
-
 }
 
 grpc::string GetMockServices(grpc_generator::File *file,
@@ -1557,12 +1554,12 @@ grpc::string GetMockServices(grpc_generator::File *file,
       vars["Package"].append(".");
     }
 
-    if(!params.services_namespace.empty()) {
+    if (!params.services_namespace.empty()) {
       vars["services_namespace"] = params.services_namespace;
       printer->Print(vars, "\nnamespace $services_namespace$ {\n\n");
     }
 
-    for (int i =0; i < file->service_count(); i++) {
+    for (int i = 0; i < file->service_count(); i++) {
       PrintMockService(printer.get(), file->service(i).get(), &vars);
       printer->Print("\n");
     }
@@ -1574,13 +1571,14 @@ grpc::string GetMockServices(grpc_generator::File *file,
   return output;
 }
 
-grpc::string GetMockEpilogue(grpc_generator::File *file, const Parameters & /*params*/) {
+grpc::string GetMockEpilogue(grpc_generator::File *file,
+                             const Parameters & /*params*/) {
   grpc::string temp;
 
   if (!file->package().empty()) {
     std::vector<grpc::string> parts = file->package_parts();
 
-    for (auto part = parts.begin(); part != parts.end(); part++){
+    for (auto part = parts.begin(); part != parts.end(); part++) {
       temp.append("} // namespace ");
       temp.append(*part);
       temp.append("\n");
diff --git a/src/compiler/cpp_generator.h b/src/compiler/cpp_generator.h
index cd672d120d56d810f2f0321d2361f3f71e1454a4..6119ebe2896c9a9065a39a286b1d32440a4a7ac9 100644
--- a/src/compiler/cpp_generator.h
+++ b/src/compiler/cpp_generator.h
@@ -65,6 +65,8 @@ struct Parameters {
   bool use_system_headers;
   // Prefix to any grpc include
   grpc::string grpc_search_path;
+  // Generate GMOCK code to facilitate unit testing.
+  bool generate_mock_code;
 };
 
 // Return the prologue of the generated header file.
@@ -101,35 +103,35 @@ grpc::string GetSourceEpilogue(grpc_generator::File *file,
 
 // Return the prologue of the generated mock file.
 grpc::string GetMockPrologue(grpc_generator::File *file,
-                               const Parameters &params);
+                             const Parameters &params);
 
 // Return the includes needed for generated mock file.
 grpc::string GetMockIncludes(grpc_generator::File *file,
-                               const Parameters &params);
+                             const Parameters &params);
 
 // Return the services for generated mock file.
-grpc::string GetMockServices(grpc_generator::File* file,
-                               const Parameters &params);
+grpc::string GetMockServices(grpc_generator::File *file,
+                             const Parameters &params);
 
 // Return the epilogue of generated mock file.
-grpc::string GetMockEpilogue(grpc_generator::File* file,
-                               const Parameters &params);
+grpc::string GetMockEpilogue(grpc_generator::File *file,
+                             const Parameters &params);
 
 // Return the prologue of the generated mock file.
 grpc::string GetMockPrologue(grpc_generator::File *file,
-                               const Parameters &params);
+                             const Parameters &params);
 
 // Return the includes needed for generated mock file.
 grpc::string GetMockIncludes(grpc_generator::File *file,
-                               const Parameters &params);
+                             const Parameters &params);
 
 // Return the services for generated mock file.
-grpc::string GetMockServices(grpc_generator::File* file,
-                               const Parameters &params);
+grpc::string GetMockServices(grpc_generator::File *file,
+                             const Parameters &params);
 
 // Return the epilogue of generated mock file.
-grpc::string GetMockEpilogue(grpc_generator::File* file,
-                               const Parameters &params);
+grpc::string GetMockEpilogue(grpc_generator::File *file,
+                             const Parameters &params);
 
 }  // namespace grpc_cpp_generator
 
diff --git a/src/compiler/cpp_plugin.cc b/src/compiler/cpp_plugin.cc
index a0986d92cee23593a1f0a546551752244fd803b2..35f1bf3e93c8c11bb72087d08973d7d0e9ffe2eb 100644
--- a/src/compiler/cpp_plugin.cc
+++ b/src/compiler/cpp_plugin.cc
@@ -62,6 +62,7 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
 
     grpc_cpp_generator::Parameters generator_parameters;
     generator_parameters.use_system_headers = true;
+    generator_parameters.generate_mock_code = false;
 
     ProtoBufFile pbfile(file);
 
@@ -85,6 +86,13 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
           }
         } else if (param[0] == "grpc_search_path") {
           generator_parameters.grpc_search_path = param[1];
+        } else if (param[0] == "generate_mock_code") {
+          if (param[1] == "true") {
+            generator_parameters.generate_mock_code = true;
+          } else if (param[1] != "false") {
+            *error = grpc::string("Invalid parameter: ") + *parameter_string;
+            return false;
+          }
         } else {
           *error = grpc::string("Unknown parameter: ") + *parameter_string;
           return false;
@@ -114,6 +122,9 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
     grpc::protobuf::io::CodedOutputStream source_coded_out(source_output.get());
     source_coded_out.WriteRaw(source_code.data(), source_code.size());
 
+    if (!generator_parameters.generate_mock_code) {
+      return true;
+    }
     grpc::string mock_code =
         grpc_cpp_generator::GetMockPrologue(&pbfile, generator_parameters) +
         grpc_cpp_generator::GetMockIncludes(&pbfile, generator_parameters) +
diff --git a/test/cpp/end2end/mock_test.cc b/test/cpp/end2end/mock_test.cc
index b7968ce23068bac0966849d920e1d4f0bb53f7c2..9c040a0cc37f349b604933c1d20ba419823c53f8 100644
--- a/test/cpp/end2end/mock_test.cc
+++ b/test/cpp/end2end/mock_test.cc
@@ -1,5 +1,5 @@
 /*
-*
+ *
  * Copyright 2015, Google Inc.
  * All rights reserved.
  *
@@ -34,6 +34,7 @@
 #include <climits>
 #include <thread>
 
+#include <gmock/gmock.h>
 #include <grpc++/channel.h>
 #include <grpc++/client_context.h>
 #include <grpc++/create_channel.h>
@@ -45,7 +46,6 @@
 #include <grpc/support/thd.h>
 #include <grpc/support/time.h>
 #include <gtest/gtest.h>
-#include <gmock/gmock.h>
 
 #include <grpc++/test/mock_stream.h>
 
@@ -55,7 +55,7 @@
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 
-#include<iostream>
+#include <iostream>
 
 using namespace std;
 using grpc::testing::EchoRequest;
@@ -98,8 +98,8 @@ class FakeClient {
     grpc::string msg("hello");
     grpc::string exp(msg);
 
-    std::unique_ptr<ClientWriterInterface<EchoRequest>>
-        cstream = stub_->RequestStream(&context, &response);
+    std::unique_ptr<ClientWriterInterface<EchoRequest>> cstream =
+        stub_->RequestStream(&context, &response);
 
     request.set_message(msg);
     EXPECT_TRUE(cstream->Write(request));
@@ -122,8 +122,8 @@ class FakeClient {
     request.set_message("hello world");
 
     ClientContext context;
-    std::unique_ptr<ClientReaderInterface<EchoResponse>>
-        cstream = stub_->ResponseStream(&context, request);
+    std::unique_ptr<ClientReaderInterface<EchoResponse>> cstream =
+        stub_->ResponseStream(&context, request);
 
     grpc::string exp = "";
     EXPECT_TRUE(cstream->Read(&response));
@@ -197,8 +197,7 @@ class TestServiceImpl : public EchoTestService::Service {
     return Status::OK;
   }
 
-  Status ResponseStream(ServerContext* context,
-                        const EchoRequest* request,
+  Status ResponseStream(ServerContext* context, const EchoRequest* request,
                         ServerWriter<EchoResponse>* writer) {
     EchoResponse response;
     vector<grpc::string> tokens = split(request->message());
@@ -221,23 +220,22 @@ class TestServiceImpl : public EchoTestService::Service {
     }
     return Status::OK;
   }
+
  private:
   const vector<grpc::string> split(const grpc::string& input) {
     grpc::string buff("");
     vector<grpc::string> result;
 
-    for (auto n:input) {
+    for (auto n : input) {
       if (n != ' ') {
         buff += n;
         continue;
       }
-      if (buff == "")
-        continue;
+      if (buff == "") continue;
       result.push_back(buff);
       buff = "";
     }
-    if (buff != "")
-      result.push_back(buff);
+    if (buff != "") result.push_back(buff);
 
     return result;
   }
@@ -280,7 +278,9 @@ TEST_F(MockTest, SimpleRpc) {
   MockEchoTestServiceStub stub;
   EchoResponse resp;
   resp.set_message("hello world");
-  EXPECT_CALL(stub, Echo(_, _, _)).Times(AtLeast(1)).WillOnce(DoAll(SetArgPointee<2>(resp), Return(Status::OK)));
+  EXPECT_CALL(stub, Echo(_, _, _))
+      .Times(AtLeast(1))
+      .WillOnce(DoAll(SetArgPointee<2>(resp), Return(Status::OK)));
   client.ResetStub(&stub);
   client.DoEcho();
 }
@@ -299,7 +299,8 @@ TEST_F(MockTest, ClientStream) {
   EXPECT_CALL(*w, WritesDone());
   EXPECT_CALL(*w, Finish()).WillOnce(Return(Status::OK));
 
-  EXPECT_CALL(stub, RequestStreamRaw(_, _)).WillOnce(DoAll(SetArgPointee<1>(resp), Return(w)));
+  EXPECT_CALL(stub, RequestStreamRaw(_, _))
+      .WillOnce(DoAll(SetArgPointee<1>(resp), Return(w)));
   client.ResetStub(&stub);
   client.DoRequestStream();
 }
@@ -316,10 +317,10 @@ TEST_F(MockTest, ServerStream) {
   EchoResponse resp2;
   resp2.set_message("world");
 
-  EXPECT_CALL(*r, Read(_)).
-      WillOnce(DoAll(SetArgPointee<0>(resp1), Return(true))).
-      WillOnce(DoAll(SetArgPointee<0>(resp2), Return(true))).
-      WillOnce(Return(false));
+  EXPECT_CALL(*r, Read(_))
+      .WillOnce(DoAll(SetArgPointee<0>(resp1), Return(true)))
+      .WillOnce(DoAll(SetArgPointee<0>(resp2), Return(true)))
+      .WillOnce(Return(false));
   EXPECT_CALL(*r, Finish()).WillOnce(Return(Status::OK));
 
   EXPECT_CALL(stub, ResponseStreamRaw(_, _)).WillOnce(Return(r));
@@ -328,9 +329,7 @@ TEST_F(MockTest, ServerStream) {
   client.DoResponseStream();
 }
 
-ACTION_P(copy, msg) {
-  arg0->set_message(msg->message());
-}
+ACTION_P(copy, msg) { arg0->set_message(msg->message()); }
 
 TEST_F(MockTest, BidiStream) {
   ResetStub();
@@ -340,12 +339,14 @@ TEST_F(MockTest, BidiStream) {
   auto rw = new MockClientReaderWriter<EchoRequest, EchoResponse>();
   EchoRequest msg;
 
-  EXPECT_CALL(*rw, Write(_, _)).Times(3).WillRepeatedly(DoAll(SaveArg<0>(&msg), Return(true)));
-  EXPECT_CALL(*rw, Read(_)).
-      WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))).
-      WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))).
-      WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))).
-      WillOnce(Return(false));
+  EXPECT_CALL(*rw, Write(_, _))
+      .Times(3)
+      .WillRepeatedly(DoAll(SaveArg<0>(&msg), Return(true)));
+  EXPECT_CALL(*rw, Read(_))
+      .WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true)))
+      .WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true)))
+      .WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true)))
+      .WillOnce(Return(false));
   EXPECT_CALL(*rw, WritesDone());
   EXPECT_CALL(*rw, Finish()).WillOnce(Return(Status::OK));