diff --git a/src/compiler/csharp_generator.cc b/src/compiler/csharp_generator.cc
index 8a600904e7b64569e9a7d7fabe0c15e83b46cc46..51d8d982e2d25d8f9cbfdd1f64e124c41cb601d7 100644
--- a/src/compiler/csharp_generator.cc
+++ b/src/compiler/csharp_generator.cc
@@ -44,6 +44,7 @@
 using google::protobuf::compiler::csharp::GetFileNamespace;
 using google::protobuf::compiler::csharp::GetClassName;
 using google::protobuf::compiler::csharp::GetUmbrellaClassName;
+using google::protobuf::SimpleItoa;
 using grpc::protobuf::FileDescriptor;
 using grpc::protobuf::Descriptor;
 using grpc::protobuf::ServiceDescriptor;
@@ -226,6 +227,16 @@ void GenerateStaticMethodField(Printer* out, const MethodDescriptor *method) {
   out->Outdent();
 }
 
+void GenerateServiceDescriptorProperty(Printer* out, const ServiceDescriptor *service) {
+  out->Print("// service descriptor\n");
+  out->Print("public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor\n");
+  out->Print("{\n");
+  out->Print("  get { return $umbrella$.Descriptor.Services[$index$]; }\n",
+             "umbrella", GetUmbrellaClassName(service->file()), "index", SimpleItoa(service->index()));
+  out->Print("}\n");
+  out->Print("\n");
+}
+
 void GenerateClientInterface(Printer* out, const ServiceDescriptor *service) {
   out->Print("// client interface\n");
   out->Print("public interface $name$\n", "name",
@@ -472,6 +483,7 @@ void GenerateService(Printer* out, const ServiceDescriptor *service) {
   for (int i = 0; i < service->method_count(); i++) {
     GenerateStaticMethodField(out, service->method(i));
   }
+  GenerateServiceDescriptorProperty(out, service);
   GenerateClientInterface(out, service);
   GenerateServerInterface(out, service);
   GenerateClientStub(out, service);
diff --git a/src/compiler/csharp_generator.h b/src/compiler/csharp_generator.h
index 0610f5e9fbacf70d40089884a6e7f6021254dc4b..67e3ee30b54f32f676a467ce6b1a74b054dc3a9a 100644
--- a/src/compiler/csharp_generator.h
+++ b/src/compiler/csharp_generator.h
@@ -39,6 +39,7 @@
 using namespace std;
 
 #include <google/protobuf/compiler/csharp/csharp_names.h>
+#include <google/protobuf/stubs/strutil.h>
 
 namespace grpc_csharp_generator {
 
diff --git a/src/csharp/Grpc.Examples/MathGrpc.cs b/src/csharp/Grpc.Examples/MathGrpc.cs
index 42372d59a38acbc11df67e44506196887da51fa2..2e98f2166cccf1a8821822062432f2e5ee2d9eb2 100644
--- a/src/csharp/Grpc.Examples/MathGrpc.cs
+++ b/src/csharp/Grpc.Examples/MathGrpc.cs
@@ -48,7 +48,7 @@ namespace Math {
     // service descriptor
     public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
     {
-        get { return global::Math.Proto.Math.Descriptor.Services[0]; }
+      get { return global::Math.Proto.Math.Descriptor.Services[0]; }
     }
 
     // client interface
diff --git a/src/csharp/Grpc.HealthCheck/HealthGrpc.cs b/src/csharp/Grpc.HealthCheck/HealthGrpc.cs
index 9d452b0732f0450749e65e3eeb2eea4c61e98694..da721ce5f6ae45d9a27f09c375e7dc4f08388cb8 100644
--- a/src/csharp/Grpc.HealthCheck/HealthGrpc.cs
+++ b/src/csharp/Grpc.HealthCheck/HealthGrpc.cs
@@ -22,6 +22,12 @@ namespace Grpc.Health.V1Alpha {
         __Marshaller_HealthCheckRequest,
         __Marshaller_HealthCheckResponse);
 
+    // service descriptor
+    public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
+    {
+      get { return global::Grpc.Health.V1Alpha.Proto.Health.Descriptor.Services[0]; }
+    }
+
     // client interface
     public interface IHealthClient
     {
diff --git a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
index 1b5a30d75775a5933c743275bb70b6463620e54a..71e701b624b9fee07bc04d6eef7812145ced7c27 100644
--- a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
+++ b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
@@ -62,6 +62,12 @@ namespace Grpc.Testing {
         __Marshaller_StreamingOutputCallRequest,
         __Marshaller_StreamingOutputCallResponse);
 
+    // service descriptor
+    public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
+    {
+      get { return global::Grpc.Testing.Test.Descriptor.Services[0]; }
+    }
+
     // client interface
     public interface ITestServiceClient
     {