Made Objective C plugin build without error
diff --git a/Makefile b/Makefile
index 4e99231..22235b7 100644
--- a/Makefile
+++ b/Makefile
@@ -456,7 +456,7 @@
 
 .SECONDARY = %.pb.h %.pb.cc
 
-PROTOC_PLUGINS = $(BINDIR)/$(CONFIG)/grpc_cpp_plugin $(BINDIR)/$(CONFIG)/grpc_python_plugin $(BINDIR)/$(CONFIG)/grpc_ruby_plugin
+PROTOC_PLUGINS = $(BINDIR)/$(CONFIG)/grpc_cpp_plugin $(BINDIR)/$(CONFIG)/grpc_objective_c_plugin $(BINDIR)/$(CONFIG)/grpc_python_plugin $(BINDIR)/$(CONFIG)/grpc_ruby_plugin
 ifeq ($(DEP_MISSING),)
 all: static shared plugins
 dep_error:
@@ -632,6 +632,7 @@
 generic_end2end_test: $(BINDIR)/$(CONFIG)/generic_end2end_test
 grpc_cli: $(BINDIR)/$(CONFIG)/grpc_cli
 grpc_cpp_plugin: $(BINDIR)/$(CONFIG)/grpc_cpp_plugin
+grpc_objective_c_plugin: $(BINDIR)/$(CONFIG)/grpc_objective_c_plugin
 grpc_python_plugin: $(BINDIR)/$(CONFIG)/grpc_python_plugin
 grpc_ruby_plugin: $(BINDIR)/$(CONFIG)/grpc_ruby_plugin
 interop_client: $(BINDIR)/$(CONFIG)/interop_client
@@ -2266,6 +2267,8 @@
 	$(Q) $(INSTALL) -d $(prefix)/bin
 	$(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_cpp_plugin $(prefix)/bin/grpc_cpp_plugin
 	$(Q) $(INSTALL) -d $(prefix)/bin
+	$(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_objective_c_plugin $(prefix)/bin/grpc_objective_c_plugin
+	$(Q) $(INSTALL) -d $(prefix)/bin
 	$(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_python_plugin $(prefix)/bin/grpc_python_plugin
 	$(Q) $(INSTALL) -d $(prefix)/bin
 	$(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_ruby_plugin $(prefix)/bin/grpc_ruby_plugin
@@ -3615,6 +3618,7 @@
 
 LIBGRPC_PLUGIN_SUPPORT_SRC = \
     src/compiler/cpp_generator.cc \
+    src/compiler/objective_c_generator.cc \
     src/compiler/python_generator.cc \
     src/compiler/ruby_generator.cc \
 
@@ -3649,6 +3653,7 @@
 endif
 
 $(OBJDIR)/$(CONFIG)/src/compiler/cpp_generator.o: 
+$(OBJDIR)/$(CONFIG)/src/compiler/objective_c_generator.o: 
 $(OBJDIR)/$(CONFIG)/src/compiler/python_generator.o: 
 $(OBJDIR)/$(CONFIG)/src/compiler/ruby_generator.o: 
 
@@ -8331,6 +8336,36 @@
 endif
 
 
+GRPC_OBJECTIVE_C_PLUGIN_SRC = \
+    src/compiler/objective_c_plugin.cc \
+
+GRPC_OBJECTIVE_C_PLUGIN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_OBJECTIVE_C_PLUGIN_SRC))))
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/grpc_objective_c_plugin: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/grpc_objective_c_plugin: $(PROTOBUF_DEP) $(GRPC_OBJECTIVE_C_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a
+	$(E) "[HOSTLD]  Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(HOST_LDXX) $(HOST_LDFLAGS) $(GRPC_OBJECTIVE_C_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC) $(HOST_LDLIBS) $(HOST_LDLIBS_PROTOC) -o $(BINDIR)/$(CONFIG)/grpc_objective_c_plugin
+
+endif
+
+$(OBJDIR)/$(CONFIG)/src/compiler/objective_c_plugin.o:  $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a
+
+deps_grpc_objective_c_plugin: $(GRPC_OBJECTIVE_C_PLUGIN_OBJS:.o=.dep)
+
+ifneq ($(NO_DEPS),true)
+-include $(GRPC_OBJECTIVE_C_PLUGIN_OBJS:.o=.dep)
+endif
+
+
 GRPC_PYTHON_PLUGIN_SRC = \
     src/compiler/python_plugin.cc \
 
diff --git a/build.json b/build.json
index 06adfee..890a538 100644
--- a/build.json
+++ b/build.json
@@ -514,6 +514,8 @@
         "src/compiler/cpp_generator.h",
         "src/compiler/cpp_generator_helpers.h",
         "src/compiler/generator_helpers.h",
+        "src/compiler/objective_c_generator.h",
+        "src/compiler/objective_c_generator_helpers.h",
         "src/compiler/python_generator.h",
         "src/compiler/ruby_generator.h",
         "src/compiler/ruby_generator_helpers-inl.h",
@@ -522,6 +524,7 @@
       ],
       "src": [
         "src/compiler/cpp_generator.cc",
+        "src/compiler/objective_c_generator.cc",
         "src/compiler/python_generator.cc",
         "src/compiler/ruby_generator.cc"
       ],
@@ -1818,6 +1821,18 @@
       "secure": "no"
     },
     {
+      "name": "grpc_objective_c_plugin",
+      "build": "protoc",
+      "language": "c++",
+      "src": [
+        "src/compiler/objective_c_plugin.cc"
+      ],
+      "deps": [
+        "grpc_plugin_support"
+      ],
+      "secure": "no"
+    },
+    {
       "name": "grpc_python_plugin",
       "build": "protoc",
       "language": "c++",
diff --git a/src/compiler/generator_helpers.h b/src/compiler/generator_helpers.h
index 2a3366a..374e137 100644
--- a/src/compiler/generator_helpers.h
+++ b/src/compiler/generator_helpers.h
@@ -95,7 +95,7 @@
   }
 }
 
-inline grpc::string CapitalizeFirstLetter(grpc::string str) {
+inline grpc::string CapitalizeFirstLetter(grpc::string s) {
   if (s.empty()) {
     return s;
   }
diff --git a/src/compiler/objective_c_generator.cc b/src/compiler/objective_c_generator.cc
index 41ffabe..c68c9c3 100644
--- a/src/compiler/objective_c_generator.cc
+++ b/src/compiler/objective_c_generator.cc
@@ -47,8 +47,8 @@
                                const grpc::protobuf::MethodDescriptor *method,
                                std::map<grpc::string, grpc::string> *vars) {
   (*vars)["method_name"] = method->name();
-  (*vars)["request_type"] = PrefixedName(method->input_type());
-  (*vars)["response_type"] = PrefixedName(method->output_type());
+  (*vars)["request_type"] = PrefixedName(method->input_type()->name());
+  (*vars)["response_type"] = PrefixedName(method->output_type()->name());
 
   if (method->server_streaming()) {
     printer->Print("// When the response stream finishes, the handler is "
@@ -56,7 +56,7 @@
   } else {
     printer->Print("// The handler is only called once.\n\n");
   }
-  printer->Print(vars, "- (id<GRXLiveSource>)$method_name$WithRequest:"
+  printer->Print(*vars, "- (id<GRXLiveSource>)$method_name$WithRequest:"
                  "($request_type$)request completionHandler:(void(^)"
                  "($response_type$ *, NSError *))handler");
 }
@@ -65,9 +65,9 @@
                                   const grpc::protobuf::MethodDescriptor *method,
                                   std::map<grpc::string, grpc::string> *vars) {
   (*vars)["method_name"] = method->name();
-  (*vars)["request_type"] = PrefixedName(method->input_type());
+  (*vars)["request_type"] = PrefixedName(method->input_type()->name());
 
-  printer->Print(vars, "- (id<GRXLiveSource>)$method_name$WithRequest:"
+  printer->Print(*vars, "- (id<GRXLiveSource>)$method_name$WithRequest:"
                  "($request_type$)request delegate:(id<GRXSink>)delegate");
 }
 
@@ -75,11 +75,79 @@
                             const grpc::protobuf::MethodDescriptor *method,
                             std::map<grpc::string, grpc::string> *vars) {
   (*vars)["method_name"] = method->name();
-  printer->Print(vars, "- (GRXSource *)$method_name$WithRequest:"
+  printer->Print(*vars, "- (GRXSource *)$method_name$WithRequest:"
                  "(id<GRXSource>)request");
 }
 
-grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service
+void PrintSourceMethodSimpleBlock(grpc::protobuf::io::Printer *printer,
+                                  const grpc::protobuf::MethodDescriptor *method,
+                                  std::map<grpc::string, grpc::string> *vars) {
+  PrintSimpleBlockSignature(printer, method, vars);
+
+  (*vars)["method_name"] = method->name();
+  printer->Print(" {\n");
+  printer->Indent();
+  printer->Print(*vars, "return [[self $method_name$WithRequest:request] "
+                 "connectHandler:^(id value, NSError *error) {\n");
+  printer->Indent();
+  printer->Print("handler(value, error);\n");
+  printer->Outdent();
+  printer->Print("}];\n");
+  printer->Outdent();
+  printer->Print("}\n");
+}
+
+void PrintSourceMethodSimpleDelegate(grpc::protobuf::io::Printer *printer,
+                                     const grpc::protobuf::MethodDescriptor *method,
+                                     std::map<grpc::string, grpc::string> *vars) {
+  PrintSimpleDelegateSignature(printer, method, vars);
+
+  (*vars)["method_name"] = method->name();
+  printer->Print(" {\n");
+  printer->Indent();
+  printer->Print(*vars, "return [[self $method_name$WithRequest:request]"
+                 "connectToSink:delegate];\n");
+  printer->Outdent();
+  printer->Print("}\n");
+}
+
+void PrintSourceMethodAdvanced(grpc::protobuf::io::Printer *printer,
+                               const grpc::protobuf::MethodDescriptor *method,
+                               std::map<grpc::string, grpc::string> *vars) {
+  PrintAdvancedSignature(printer, method, vars);
+
+  (*vars)["method_name"] = method->name();
+  printer->Print(" {\n");
+  printer->Indent();
+  printer->Print(*vars, "return [self $method_name$WithRequest:request "
+                 "client:[self newClient]];\n");
+  printer->Outdent();
+  printer->Print("}\n");
+}
+
+void PrintSourceMethodHandler(grpc::protobuf::io::Printer *printer,
+                              const grpc::protobuf::MethodDescriptor *method,
+                              std::map<grpc::string, grpc::string> *vars) {
+  (*vars)["method_name"] = method->name();
+  (*vars)["response_type"] = PrefixedName(method->output_type()->name());
+  (*vars)["caps_name"] = grpc_generator::CapitalizeFirstLetter(method->name());
+
+  printer->Print(*vars, "- (GRXSource *)$method_name$WithRequest:"
+                 "(id<GRXSource>)request client:(PBgRPCClient *)client {\n");
+  printer->Indent();
+  printer->Print(*vars,
+                 "return [self responseWithMethod:$@\"$caps_name\"\n");
+  printer->Print(*vars,
+                 "                          class:[$response_type$ class]\n");
+  printer->Print("                        request:request\n");
+  printer->Print("                         client:client];\n");
+  printer->Outdent();
+  printer->Print("}\n");
+}
+
+}
+
+grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service,
                        const grpc::string message_header) {
   grpc::string output;
   grpc::protobuf::io::StringOutputStream output_stream(&output);
@@ -88,7 +156,7 @@
   printer.Print("#import \"PBgRPCClient.h\"\n");
   printer.Print("#import \"PBStub.h\"\n");
   vars["message_header"] = message_header;
-  printer.Print(&vars, "#import \"$message_header$\"\n\n");
+  printer.Print(vars, "#import \"$message_header$\"\n\n");
   printer.Print("@protocol GRXSource\n");
   printer.Print("@class GRXSource\n\n");
   vars["service_name"] = service->name();
@@ -114,89 +182,23 @@
   printer.Print("\n");
   printer.Print("@end\n\n");
   printer.Print("// Basic stub that only does marshalling and parsing\n");
-  printer.Print(&vars, "@interface $service_name$Stub :"
+  printer.Print(vars, "@interface $service_name$Stub :"
                 " PBStub<$service_name$Stub>\n");
   printer.Print("- (instancetype)initWithHost:(NSString *)host;\n");
   printer.Print("@end\n");
   return output;
 }
 
-void PrintSourceMethodSimpleBlock(grpc::protobuf::io::Printer *printer,
-                                  const grpc::protobuf::MethodDescriptor *method,
-                                  std::map<grpc::string, grpc::string> *vars) {
-  PrintSimpleBlockSignature(printer, method, vars);
-
-  (*vars)["method_name"] = method->name();
-  printer->Print(" {\n");
-  printer->Indent();
-  printer->Print(vars, "return [[self $method_name$WithRequest:request] "
-                 "connectHandler:^(id value, NSError *error) {\n");
-  printer->Indent();
-  printer->Print("handler(value, error);\n");
-  printer->Outdent();
-  printer->Print("}];\n");
-  printer->Outdent();
-  printer->Print("}\n");
-}
-
-void PrintSourceMethodSimpleDelegate(grpc::protobuf::io::Printer *printer,
-                                     const grpc::protobuf::MethodDescriptor *method,
-                                     std::map<grpc::string, grpc::string> *vars) {
-  PrintSimpleDelegateSignature(printer, method, vars);
-
-  (*vars)["method_name"] = method->name();
-  printer->Print(" {\n");
-  printer->Indent();
-  printer->Print(vars, "return [[self $method_name$WithRequest:request]"
-                 "connectToSink:delegate];\n");
-  printer->Outdent();
-  printer->Print("}\n");
-}
-
-void PrintSourceMethodAdvanced(grpc::protobuf::io::Printer *printer,
-                               const grpc::protobuf::MethodDescriptor *method,
-                               std::map<grpc::string, grpc::string> *vars) {
-  PrintAdvancedSignature(printer, method, vars);
-
-  (*vars)["method_name"] = method->name();
-  printer->Print(" {\n");
-  printer->Indent();
-  printer->Print(vars, "return [self $method_name$WithRequest:request "
-                 "client:[self newClient]];\n");
-  printer->Outdent();
-  printer->Print("}\n");
-}
-
-void PrintSourceMethodHandler(grpc::protobuf::io::Printer *printer,
-                              const grpc::protobuf::MethodDescriptor *method,
-                              std::map<grpc::string, grpc::string> *vars) {
-  (*vars)["method_name"] = method->name();
-  (*vars)["response_type"] = PrefixedName(method->output_type());
-  (*vars)["caps_name"] = grpc_generator::CapitalizeFirstLetter(method->name());
-
-  printer->Print(vars, "- (GRXSource *)$method_name$WithRequest:"
-                 "(id<GRXSource>)request client:(PBgRPCClient *)client {\n");
-  printer->Indent();
-  printer->Print(vars,
-                 "return [self responseWithMethod:$@\"$caps_name\"\n");
-  printer->Print(vars,
-                 "                          class:[$response_type$ class]\n");
-  printer->Print("                        request:request\n");
-  printer->Print("                         client:client];\n");
-  printer->Outdent();
-  printer->Print("}\n");
-}
-
 grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service) {
   grpc::string output;
   grpc::protobuf::io::StringOutputStream output_stream(&output);
   grpc::protobuf::io::Printer printer(&output_stream, '$');
   std::map<grpc::string, grpc::string> vars;
   vars["service_name"] = service->name();
-  printer.Print(&vars, "#import \"$service_name$Stub.pb.h\"\n");
+  printer.Print(vars, "#import \"$service_name$Stub.pb.h\"\n");
   printer.Print("#import \"PBGeneratedMessage+GRXSource.h\"\n\n");
   vars["full_name"] = service->full_name();
-  printer.Print(&vars,
+  printer.Print(vars,
                 "static NSString *const kInterface = @\"$full_name$\";\n");
   printer.Print("@implementation $service_name$Stub\n\n");
   printer.Print("- (instancetype)initWithHost:(NSString *)host {\n");
diff --git a/src/compiler/objective_c_generator.h b/src/compiler/objective_c_generator.h
index bea63f5..93c730b 100644
--- a/src/compiler/objective_c_generator.h
+++ b/src/compiler/objective_c_generator.h
@@ -38,7 +38,7 @@
 
 namespace grpc_objective_c_generator {
 
-grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service
+grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service,
                        const grpc::string message_header);
 
 grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service);
diff --git a/src/compiler/objective_c_generator_helpers.h b/src/compiler/objective_c_generator_helpers.h
index 0c2ece8..6a7c139 100644
--- a/src/compiler/objective_c_generator_helpers.h
+++ b/src/compiler/objective_c_generator_helpers.h
@@ -43,7 +43,7 @@
 const grpc::string prefix = "PBG";
 
 inline grpc::string MessageHeaderName(const grpc::protobuf::FileDescriptor *file) {
-  return FileNameInUpperCase(file) + ".pb.h";
+  return grpc_generator::FileNameInUpperCamel(file) + ".pb.h";
 }
 
 inline grpc::string StubFileName(grpc::string service_name) {
diff --git a/src/compiler/objective_c_plugin.cc b/src/compiler/objective_c_plugin.cc
index 4d4146b..eebce0c 100644
--- a/src/compiler/objective_c_plugin.cc
+++ b/src/compiler/objective_c_plugin.cc
@@ -56,21 +56,24 @@
 
     for (int i = 0; i < file->service_count(); i++) {
       const grpc::protobuf::ServiceDescriptor *service = file->service(i);
-      grpc::sring file_name = grpc_objective_c_generator::StubFileName(
+      grpc::string file_name = grpc_objective_c_generator::StubFileName(
           service->name());
 
       // Generate .pb.h
-      grpc::string header_code = grpc_objective_c_generator::GetHeader(service);
+      grpc::string header_code = grpc_objective_c_generator::GetHeader(
+          service, grpc_objective_c_generator::MessageHeaderName(file));
       std::unique_ptr<grpc::protobuf::io::ZeroCopyOutputStream> header_output(
         context->Open(file_name + ".pb.h"));
-      grpc::protobuf::io::CodedOutputStream header_coded_out(output.get());
+      grpc::protobuf::io::CodedOutputStream header_coded_out(
+          header_output.get());
       header_coded_out.WriteRaw(header_code.data(), header_code.size());
 
       // Generate .pb.m
       grpc::string source_code = grpc_objective_c_generator::GetSource(service);
       std::unique_ptr<grpc::protobuf::io::ZeroCopyOutputStream> source_output(
         context->Open(file_name + ".pb.m"));
-      grpc::protobuf::io::CodedOutputStream source_coded_out(output.get());
+      grpc::protobuf::io::CodedOutputStream source_coded_out(
+          source_output.get());
       source_coded_out.WriteRaw(source_code.data(), source_code.size());
     }