diff --git a/build/build.csproj b/build/build.csproj
index efc69c1..b6edf2b 100644
--- a/build/build.csproj
+++ b/build/build.csproj
@@ -38,6 +38,7 @@
 
     <Protos Include="$(ProtosDirectory)\extest\unittest_extras_full.proto" />
     <Protos Include="$(ProtosDirectory)\extest\unittest_extras_lite.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_generic_services.proto" />
     <Protos Include="$(ProtosDirectory)\extest\unittest_rpc_interop.proto" />
     <Protos Include="$(ProtosDirectory)\google\protobuf\descriptor.proto" />
     <Protos Include="$(ProtosDirectory)\google\protobuf\csharp_options.proto" />
@@ -101,6 +102,9 @@
     <GeneratedSource Include="$(BuildTempDirectory)\UnitTestRpcInterop.cs">
       <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
     </GeneratedSource>
+    <GeneratedSource Include="$(BuildTempDirectory)\UnitTestGenericServices.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
     <!-- Lite unit test -->
     <GeneratedSource Include="$(BuildTempDirectory)\UnitTestExtrasFullProtoFile.cs">
       <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
diff --git a/protos/extest/unittest_generic_services.proto b/protos/extest/unittest_generic_services.proto
new file mode 100644
index 0000000..3fe2e8e
--- /dev/null
+++ b/protos/extest/unittest_generic_services.proto
@@ -0,0 +1,29 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+import "google/protobuf/unittest.proto";
+import "google/protobuf/unittest_custom_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestGenericServices";
+
+option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+
+// We don't put this in a package within proto2 because we need to make sure
+// that the generated code doesn't depend on being in the proto2 namespace.
+package protobuf_unittest;
+
+option optimize_for = SPEED;
+
+service TestGenericService {
+  rpc Foo(FooRequest) returns (FooResponse);
+  rpc Bar(BarRequest) returns (BarResponse);
+}
+
+service TestGenericServiceWithCustomOptions {
+  option (service_opt1) = -9876543210;
+
+  rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) {
+    option (method_opt1) = METHODOPT1_VAL2;
+  }
+}
+
diff --git a/protos/google/protobuf/csharp_options.proto b/protos/google/protobuf/csharp_options.proto
index d9fe04e..33a7b03 100644
--- a/protos/google/protobuf/csharp_options.proto
+++ b/protos/google/protobuf/csharp_options.proto
@@ -58,10 +58,12 @@
   // Controls how services are generated, GENERIC is the deprecated original implementation
   // INTERFACE generates service interfaces only, RPCINTEROP generates interfaces and 
   // implementations using the included Windows RPC interop libarary.
-  optional CSharpServiceType service_generator_type = 225 [default = GENERIC];
+  optional CSharpServiceType service_generator_type = 225 [default = NONE];
 }
 
 enum CSharpServiceType {
+  // Services are ignored by the generator
+  NONE = 0;
   // Generates the original Java generic service implementations
   GENERIC = 1;
   // Generates an interface for the service and nothing else
diff --git a/src/ProtoGen/ServiceInterfaceGenerator.cs b/src/ProtoGen/ServiceInterfaceGenerator.cs
index 4aa8ffa..019df4c 100644
--- a/src/ProtoGen/ServiceInterfaceGenerator.cs
+++ b/src/ProtoGen/ServiceInterfaceGenerator.cs
@@ -47,6 +47,9 @@
       : base(descriptor) {
       svcType = descriptor.File.CSharpOptions.ServiceGeneratorType;
       switch (svcType) {
+        case CSharpServiceType.NONE:
+          _generator = new NoServicesGenerator(descriptor);
+          break;
         case CSharpServiceType.GENERIC:
           _generator = new GenericServiceGenerator(descriptor);
           break;
@@ -63,6 +66,19 @@
     public void Generate(TextGenerator writer) {
       _generator.Generate(writer);
     }
+      
+    class NoServicesGenerator : SourceGeneratorBase<ServiceDescriptor>, ISourceGenerator {
+      
+      public NoServicesGenerator(ServiceDescriptor descriptor)
+        : base(descriptor) {
+      }
+      public virtual void Generate(TextGenerator writer) {
+        writer.WriteLine("/*");
+        writer.WriteLine("* Service generation is now disabled by default, use the following option to enable:");
+        writer.WriteLine("* option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;");
+        writer.WriteLine("*/");
+      }
+    }
 
     class ServiceInterfaceGenerator : SourceGeneratorBase<ServiceDescriptor>, ISourceGenerator {
       
diff --git a/src/ProtocolBuffers.Test/DescriptorsTest.cs b/src/ProtocolBuffers.Test/DescriptorsTest.cs
index c5223f9..f3c03cd 100644
--- a/src/ProtocolBuffers.Test/DescriptorsTest.cs
+++ b/src/ProtocolBuffers.Test/DescriptorsTest.cs
@@ -75,13 +75,13 @@
       Assert.AreEqual("ImportEnum", UnitTestImportProtoFile.Descriptor.EnumTypes[0].Name);
       for (int i = 0; i < file.EnumTypes.Count; i++) {
         Assert.AreEqual(i, file.EnumTypes[i].Index);
-      }
-
-      ServiceDescriptor service = TestService.Descriptor;
-      Assert.AreEqual(service, file.Services[0]);
-      Assert.AreEqual(service, file.FindTypeByName<ServiceDescriptor>("TestService"));
-      Assert.IsNull(file.FindTypeByName<ServiceDescriptor>("NoSuchType"));
-      Assert.IsNull(file.FindTypeByName<ServiceDescriptor>("protobuf_unittest.TestService"));
+      }
+
+      ServiceDescriptor service = TestGenericService.Descriptor;
+      Assert.AreEqual(service, UnitTestGenericServices.Descriptor.Services[0]);
+      Assert.AreEqual(service, UnitTestGenericServices.Descriptor.FindTypeByName<ServiceDescriptor>("TestGenericService"));
+      Assert.IsNull(UnitTestGenericServices.Descriptor.FindTypeByName<ServiceDescriptor>("NoSuchType"));
+      Assert.IsNull(UnitTestGenericServices.Descriptor.FindTypeByName<ServiceDescriptor>("protobuf_unittest.TestGenericService"));
       Assert.AreEqual(0, UnitTestImportProtoFile.Descriptor.Services.Count);
       for (int i = 0; i < file.Services.Count; i++) {
         Assert.AreEqual(i, file.Services[i].Index);
@@ -261,11 +261,11 @@
 
     [Test]
     public void ServiceDescriptor() {
-      ServiceDescriptor service = TestService.Descriptor;
-
-      Assert.AreEqual("TestService", service.Name);
-      Assert.AreEqual("protobuf_unittest.TestService", service.FullName);
-      Assert.AreEqual(UnitTestProtoFile.Descriptor, service.File);
+      ServiceDescriptor service = TestGenericService.Descriptor;
+
+      Assert.AreEqual("TestGenericService", service.Name);
+      Assert.AreEqual("protobuf_unittest.TestGenericService", service.FullName);
+      Assert.AreEqual(UnitTestGenericServices.Descriptor, service.File);
 
       Assert.AreEqual(2, service.Methods.Count);
 
@@ -310,9 +310,9 @@
         enumType.getOptions().hasExtension(UnittestCustomOptions.enumOpt1));
       Assert.AreEqual(Integer.valueOf(-789),
         enumType.getOptions().getExtension(UnittestCustomOptions.enumOpt1));
-        */
-
-      ServiceDescriptor service = TestServiceWithCustomOptions.Descriptor;
+        */
+
+      ServiceDescriptor service = TestGenericServiceWithCustomOptions.Descriptor;
 
       Assert.IsTrue(service.Options.HasExtension(UnitTestCustomOptionsProtoFile.ServiceOpt1));
       Assert.AreEqual(-9876543210L, service.Options.GetExtension(UnitTestCustomOptionsProtoFile.ServiceOpt1));
diff --git a/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj b/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
index f72bcf8..83a598d 100644
--- a/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
+++ b/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
@@ -92,6 +92,7 @@
     <Compile Include="TestProtos\UnitTestCustomOptionsProtoFile.cs" />
     <Compile Include="TestProtos\UnitTestEmbedOptimizeForProtoFile.cs" />
     <Compile Include="TestProtos\UnitTestEmptyProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestGenericServices.cs" />
     <Compile Include="TestProtos\UnitTestImportLiteProtoFile.cs" />
     <Compile Include="TestProtos\UnitTestImportProtoFile.cs" />
     <Compile Include="TestProtos\UnitTestMessageSetProtoFile.cs" />
diff --git a/src/ProtocolBuffers.Test/ServiceTest.cs b/src/ProtocolBuffers.Test/ServiceTest.cs
index f6f7c74..579c458 100644
--- a/src/ProtocolBuffers.Test/ServiceTest.cs
+++ b/src/ProtocolBuffers.Test/ServiceTest.cs
@@ -50,12 +50,12 @@
 
     delegate void Action<T1, T2>(T1 t1, T2 t2);
 
-    private static readonly MethodDescriptor FooDescriptor = TestService.Descriptor.Methods[0];
-    private static readonly MethodDescriptor BarDescriptor = TestService.Descriptor.Methods[1];
+    private static readonly MethodDescriptor FooDescriptor = TestGenericService.Descriptor.Methods[0];
+    private static readonly MethodDescriptor BarDescriptor = TestGenericService.Descriptor.Methods[1];
 
     [Test]
     public void GetRequestPrototype() {
-      TestService service = new TestServiceImpl();
+      TestGenericService service = new TestServiceImpl();
 
       Assert.AreSame(service.GetRequestPrototype(FooDescriptor), FooRequest.DefaultInstance);
       Assert.AreSame(service.GetRequestPrototype(BarDescriptor), BarRequest.DefaultInstance);
@@ -63,7 +63,7 @@
 
     [Test]
     public void GetResponsePrototype() {
-      TestService service = new TestServiceImpl();
+      TestGenericService service = new TestServiceImpl();
 
       Assert.AreSame(service.GetResponsePrototype(FooDescriptor), FooResponse.DefaultInstance);
       Assert.AreSame(service.GetResponsePrototype(BarDescriptor), BarResponse.DefaultInstance);
@@ -71,14 +71,14 @@
 
     [Test]
     public void CallMethodFoo() {
-      MockRepository mocks = new MockRepository();
-      FooRequest fooRequest = FooRequest.CreateBuilder().Build();
+      MockRepository mocks = new MockRepository();
+      FooRequest fooRequest = FooRequest.CreateBuilder().Build();
       FooResponse fooResponse = FooResponse.CreateBuilder().Build();
       IRpcController controller = mocks.StrictMock<IRpcController>();
 
       bool fooCalled = false;
 
-      TestService service = new TestServiceImpl((request, responseAction) => {
+      TestGenericService service = new TestServiceImpl((request, responseAction) => {
         Assert.AreSame(fooRequest, request);
         fooCalled = true;
         responseAction(fooResponse);
@@ -115,8 +115,8 @@
       FooRequest fooRequest = FooRequest.CreateBuilder().Build();      
       MockRepository mocks = new MockRepository();
       IRpcChannel mockChannel = mocks.StrictMock<IRpcChannel>();
-      IRpcController mockController = mocks.StrictMock<IRpcController>();
-      TestService service = TestService.CreateStub(mockChannel);
+      IRpcController mockController = mocks.StrictMock<IRpcController>();
+      TestGenericService service = TestGenericService.CreateStub(mockChannel);
       Action<FooResponse> doneHandler = mocks.StrictMock<Action<FooResponse>>();
 
       using (mocks.Record()) {
@@ -126,7 +126,7 @@
             .IgnoreArguments()
             .Constraints(Is.Same(FooDescriptor), Is.Same(mockController), Is.Same(fooRequest), 
                          Is.Same(FooResponse.DefaultInstance), Is.Anything())
-            .Do((CallFooDelegate) ((p1, p2, p3, response, done) => done(response)));
+            .Do((CallFooDelegate) ((p1, p2, p3, response, done) => done(response)));
         doneHandler(FooResponse.DefaultInstance);
       }
 
@@ -137,14 +137,14 @@
 
     [Test]
     public void CallMethodBar() {
-      MockRepository mocks = new MockRepository();
-      BarRequest barRequest = BarRequest.CreateBuilder().Build();
+      MockRepository mocks = new MockRepository();
+      BarRequest barRequest = BarRequest.CreateBuilder().Build();
       BarResponse barResponse = BarResponse.CreateBuilder().Build();
       IRpcController controller = mocks.StrictMock<IRpcController>();
 
       bool barCalled = false;
 
-      TestService service = new TestServiceImpl(null, (request, responseAction) => {
+      TestGenericService service = new TestServiceImpl(null, (request, responseAction) => {
         Assert.AreSame(barRequest, request);
         barCalled = true;
         responseAction(barResponse);
@@ -168,15 +168,15 @@
     }
     
     
-    class TestServiceImpl : TestService {
+    class TestServiceImpl : TestGenericService {
       private readonly Action<FooRequest, Action<FooResponse>> fooHandler;
       private readonly Action<BarRequest, Action<BarResponse>> barHandler;
       private readonly IRpcController expectedController;
 
       internal TestServiceImpl() {
-      }
-
-      internal TestServiceImpl(Action<FooRequest, Action<FooResponse>> fooHandler,
+      }
+
+      internal TestServiceImpl(Action<FooRequest, Action<FooResponse>> fooHandler,
           Action<BarRequest, Action<BarResponse>> barHandler,
           IRpcController expectedController) {
         this.fooHandler = fooHandler;
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
index 1d2039c..4fca38d 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
@@ -3957,90 +3957,10 @@
   #endregion
   
   #region Services
-  public abstract class TestServiceWithCustomOptions : pb::IService {
-    public abstract void Foo(
-        pb::IRpcController controller,
-        global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest request,
-        global::System.Action<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse> done);
-    
-    public static pbd::ServiceDescriptor Descriptor {
-      get { return UnitTestCustomOptionsProtoFile.Descriptor.Services[0]; }
-    }
-    public pbd::ServiceDescriptor DescriptorForType {
-      get { return Descriptor; }
-    }
-    
-    public void CallMethod(
-        pbd::MethodDescriptor method,
-        pb::IRpcController controller,
-        pb::IMessage request,
-        global::System.Action<pb::IMessage> done) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.CallMethod() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          this.Foo(controller, (global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest) request,
-              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse>(
-              done));
-          return;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.GetRequestPrototype() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          return global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest.DefaultInstance;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.GetResponsePrototype() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          return global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public static Stub CreateStub(pb::IRpcChannel channel) {
-      return new Stub(channel);
-    }
-    
-    public class Stub : global::Google.ProtocolBuffers.TestProtos.TestServiceWithCustomOptions {
-      internal Stub(pb::IRpcChannel channel) {
-        this.channel = channel;
-      }
-      
-      private readonly pb::IRpcChannel channel;
-      
-      public pb::IRpcChannel Channel {
-        get { return channel; }
-      }
-      
-      public override void Foo(
-          pb::IRpcController controller,
-          global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest request,
-          global::System.Action<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse> done) {
-        channel.CallMethod(Descriptor.Methods[0],
-            controller, request, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance,
-            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance));
-      }
-    }
-  }
+  /*
+  * Service generation is now disabled by default, use the following option to enable:
+  * option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+  */
   #endregion
   
 }
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestGenericServices.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestGenericServices.cs
new file mode 100644
index 0000000..51f16d2
--- /dev/null
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestGenericServices.cs
@@ -0,0 +1,250 @@
+// Generated by ProtoGen, Version=0.9.0.0, Culture=neutral, PublicKeyToken=8fd7408b07f8d2cd.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestGenericServices {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static UnitTestGenericServices() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          "CiZleHRlc3QvdW5pdHRlc3RfZ2VuZXJpY19zZXJ2aWNlcy5wcm90bxIRcHJv" + 
+          "dG9idWZfdW5pdHRlc3QaJGdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9u" + 
+          "cy5wcm90bxoeZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvGi1nb29n" + 
+          "bGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8yoAEK" + 
+          "ElRlc3RHZW5lcmljU2VydmljZRJECgNGb28SHS5wcm90b2J1Zl91bml0dGVz" + 
+          "dC5Gb29SZXF1ZXN0Gh4ucHJvdG9idWZfdW5pdHRlc3QuRm9vUmVzcG9uc2US" + 
+          "RAoDQmFyEh0ucHJvdG9idWZfdW5pdHRlc3QuQmFyUmVxdWVzdBoeLnByb3Rv" + 
+          "YnVmX3VuaXR0ZXN0LkJhclJlc3BvbnNlMpUBCiNUZXN0R2VuZXJpY1NlcnZp" + 
+          "Y2VXaXRoQ3VzdG9tT3B0aW9ucxJjCgNGb28SKS5wcm90b2J1Zl91bml0dGVz" + 
+          "dC5DdXN0b21PcHRpb25Gb29SZXF1ZXN0GioucHJvdG9idWZfdW5pdHRlc3Qu" + 
+          "Q3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UiBeD6jB4CGgmQsose09uAy0lCREgB" + 
+          "wj4/CiFHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MSF1VuaXRU" + 
+          "ZXN0R2VuZXJpY1NlcnZpY2VziA4B");
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestCustomOptionsProtoFile.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, 
+          global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, 
+          global::Google.ProtocolBuffers.TestProtos.UnitTestCustomOptionsProtoFile.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Services
+  public abstract class TestGenericService : pb::IService {
+    public abstract void Foo(
+        pb::IRpcController controller,
+        global::Google.ProtocolBuffers.TestProtos.FooRequest request,
+        global::System.Action<global::Google.ProtocolBuffers.TestProtos.FooResponse> done);
+    public abstract void Bar(
+        pb::IRpcController controller,
+        global::Google.ProtocolBuffers.TestProtos.BarRequest request,
+        global::System.Action<global::Google.ProtocolBuffers.TestProtos.BarResponse> done);
+    
+    public static pbd::ServiceDescriptor Descriptor {
+      get { return UnitTestGenericServices.Descriptor.Services[0]; }
+    }
+    public pbd::ServiceDescriptor DescriptorForType {
+      get { return Descriptor; }
+    }
+    
+    public void CallMethod(
+        pbd::MethodDescriptor method,
+        pb::IRpcController controller,
+        pb::IMessage request,
+        global::System.Action<pb::IMessage> done) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+            "Service.CallMethod() given method descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          this.Foo(controller, (global::Google.ProtocolBuffers.TestProtos.FooRequest) request,
+              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.FooResponse>(
+              done));
+          return;
+        case 1:
+          this.Bar(controller, (global::Google.ProtocolBuffers.TestProtos.BarRequest) request,
+              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.BarResponse>(
+              done));
+          return;
+        default:
+          throw new global::System.InvalidOperationException("Can't get here.");
+      }
+    }
+    
+    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+            "Service.GetRequestPrototype() given method descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          return global::Google.ProtocolBuffers.TestProtos.FooRequest.DefaultInstance;
+        case 1:
+          return global::Google.ProtocolBuffers.TestProtos.BarRequest.DefaultInstance;
+        default:
+          throw new global::System.InvalidOperationException("Can't get here.");
+      }
+    }
+    
+    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+            "Service.GetResponsePrototype() given method descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          return global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance;
+        case 1:
+          return global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance;
+        default:
+          throw new global::System.InvalidOperationException("Can't get here.");
+      }
+    }
+    
+    public static Stub CreateStub(pb::IRpcChannel channel) {
+      return new Stub(channel);
+    }
+    
+    public class Stub : global::Google.ProtocolBuffers.TestProtos.TestGenericService {
+      internal Stub(pb::IRpcChannel channel) {
+        this.channel = channel;
+      }
+      
+      private readonly pb::IRpcChannel channel;
+      
+      public pb::IRpcChannel Channel {
+        get { return channel; }
+      }
+      
+      public override void Foo(
+          pb::IRpcController controller,
+          global::Google.ProtocolBuffers.TestProtos.FooRequest request,
+          global::System.Action<global::Google.ProtocolBuffers.TestProtos.FooResponse> done) {
+        channel.CallMethod(Descriptor.Methods[0],
+            controller, request, global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance,
+            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.FooResponse, global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance));
+      }
+      
+      public override void Bar(
+          pb::IRpcController controller,
+          global::Google.ProtocolBuffers.TestProtos.BarRequest request,
+          global::System.Action<global::Google.ProtocolBuffers.TestProtos.BarResponse> done) {
+        channel.CallMethod(Descriptor.Methods[1],
+            controller, request, global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance,
+            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.BarResponse, global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance));
+      }
+    }
+  }
+  public abstract class TestGenericServiceWithCustomOptions : pb::IService {
+    public abstract void Foo(
+        pb::IRpcController controller,
+        global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest request,
+        global::System.Action<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse> done);
+    
+    public static pbd::ServiceDescriptor Descriptor {
+      get { return UnitTestGenericServices.Descriptor.Services[1]; }
+    }
+    public pbd::ServiceDescriptor DescriptorForType {
+      get { return Descriptor; }
+    }
+    
+    public void CallMethod(
+        pbd::MethodDescriptor method,
+        pb::IRpcController controller,
+        pb::IMessage request,
+        global::System.Action<pb::IMessage> done) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+            "Service.CallMethod() given method descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          this.Foo(controller, (global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest) request,
+              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse>(
+              done));
+          return;
+        default:
+          throw new global::System.InvalidOperationException("Can't get here.");
+      }
+    }
+    
+    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+            "Service.GetRequestPrototype() given method descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          return global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest.DefaultInstance;
+        default:
+          throw new global::System.InvalidOperationException("Can't get here.");
+      }
+    }
+    
+    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+            "Service.GetResponsePrototype() given method descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          return global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance;
+        default:
+          throw new global::System.InvalidOperationException("Can't get here.");
+      }
+    }
+    
+    public static Stub CreateStub(pb::IRpcChannel channel) {
+      return new Stub(channel);
+    }
+    
+    public class Stub : global::Google.ProtocolBuffers.TestProtos.TestGenericServiceWithCustomOptions {
+      internal Stub(pb::IRpcChannel channel) {
+        this.channel = channel;
+      }
+      
+      private readonly pb::IRpcChannel channel;
+      
+      public pb::IRpcChannel Channel {
+        get { return channel; }
+      }
+      
+      public override void Foo(
+          pb::IRpcController controller,
+          global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest request,
+          global::System.Action<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse> done) {
+        channel.CallMethod(Descriptor.Methods[0],
+            controller, request, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance,
+            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance));
+      }
+    }
+  }
+  #endregion
+  
+}
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
index bf77ccb..8d7c97a 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
@@ -293,90 +293,10 @@
   #endregion
   
   #region Services
-  public abstract class TestService : pb::IService {
-    public abstract void Foo(
-        pb::IRpcController controller,
-        global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage request,
-        global::System.Action<global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage> done);
-    
-    public static pbd::ServiceDescriptor Descriptor {
-      get { return UnitTestNoGenericServicesProtoFile.Descriptor.Services[0]; }
-    }
-    public pbd::ServiceDescriptor DescriptorForType {
-      get { return Descriptor; }
-    }
-    
-    public void CallMethod(
-        pbd::MethodDescriptor method,
-        pb::IRpcController controller,
-        pb::IMessage request,
-        global::System.Action<pb::IMessage> done) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.CallMethod() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          this.Foo(controller, (global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage) request,
-              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage>(
-              done));
-          return;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.GetRequestPrototype() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          return global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.DefaultInstance;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.GetResponsePrototype() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          return global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.DefaultInstance;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public static Stub CreateStub(pb::IRpcChannel channel) {
-      return new Stub(channel);
-    }
-    
-    public class Stub : global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestService {
-      internal Stub(pb::IRpcChannel channel) {
-        this.channel = channel;
-      }
-      
-      private readonly pb::IRpcChannel channel;
-      
-      public pb::IRpcChannel Channel {
-        get { return channel; }
-      }
-      
-      public override void Foo(
-          pb::IRpcController controller,
-          global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage request,
-          global::System.Action<global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage> done) {
-        channel.CallMethod(Descriptor.Methods[0],
-            controller, request, global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.DefaultInstance,
-            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage, global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.Builder>(done, global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.DefaultInstance));
-      }
-    }
-  }
+  /*
+  * Service generation is now disabled by default, use the following option to enable:
+  * option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+  */
   #endregion
   
 }
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
index 2d86a64..a02255d 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
@@ -18512,112 +18512,10 @@
   #endregion
   
   #region Services
-  public abstract class TestService : pb::IService {
-    public abstract void Foo(
-        pb::IRpcController controller,
-        global::Google.ProtocolBuffers.TestProtos.FooRequest request,
-        global::System.Action<global::Google.ProtocolBuffers.TestProtos.FooResponse> done);
-    public abstract void Bar(
-        pb::IRpcController controller,
-        global::Google.ProtocolBuffers.TestProtos.BarRequest request,
-        global::System.Action<global::Google.ProtocolBuffers.TestProtos.BarResponse> done);
-    
-    public static pbd::ServiceDescriptor Descriptor {
-      get { return UnitTestProtoFile.Descriptor.Services[0]; }
-    }
-    public pbd::ServiceDescriptor DescriptorForType {
-      get { return Descriptor; }
-    }
-    
-    public void CallMethod(
-        pbd::MethodDescriptor method,
-        pb::IRpcController controller,
-        pb::IMessage request,
-        global::System.Action<pb::IMessage> done) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.CallMethod() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          this.Foo(controller, (global::Google.ProtocolBuffers.TestProtos.FooRequest) request,
-              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.FooResponse>(
-              done));
-          return;
-        case 1:
-          this.Bar(controller, (global::Google.ProtocolBuffers.TestProtos.BarRequest) request,
-              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.BarResponse>(
-              done));
-          return;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.GetRequestPrototype() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          return global::Google.ProtocolBuffers.TestProtos.FooRequest.DefaultInstance;
-        case 1:
-          return global::Google.ProtocolBuffers.TestProtos.BarRequest.DefaultInstance;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.GetResponsePrototype() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          return global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance;
-        case 1:
-          return global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public static Stub CreateStub(pb::IRpcChannel channel) {
-      return new Stub(channel);
-    }
-    
-    public class Stub : global::Google.ProtocolBuffers.TestProtos.TestService {
-      internal Stub(pb::IRpcChannel channel) {
-        this.channel = channel;
-      }
-      
-      private readonly pb::IRpcChannel channel;
-      
-      public pb::IRpcChannel Channel {
-        get { return channel; }
-      }
-      
-      public override void Foo(
-          pb::IRpcController controller,
-          global::Google.ProtocolBuffers.TestProtos.FooRequest request,
-          global::System.Action<global::Google.ProtocolBuffers.TestProtos.FooResponse> done) {
-        channel.CallMethod(Descriptor.Methods[0],
-            controller, request, global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance,
-            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.FooResponse, global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance));
-      }
-      
-      public override void Bar(
-          pb::IRpcController controller,
-          global::Google.ProtocolBuffers.TestProtos.BarRequest request,
-          global::System.Action<global::Google.ProtocolBuffers.TestProtos.BarResponse> done) {
-        channel.CallMethod(Descriptor.Methods[1],
-            controller, request, global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance,
-            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.BarResponse, global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance));
-      }
-    }
-  }
+  /*
+  * Service generation is now disabled by default, use the following option to enable:
+  * option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+  */
   #endregion
   
 }
diff --git a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
index 7eef570..855f8fe 100644
--- a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
+++ b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
@@ -47,7 +47,7 @@
       byte[] descriptorData = global::System.Convert.FromBase64String(
           "CiRnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8SD2dvb2ds" + 
           "ZS5wcm90b2J1ZhogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8i" + 
-          "uQMKEUNTaGFycEZpbGVPcHRpb25zEhEKCW5hbWVzcGFjZRgBIAEoCRIaChJ1" + 
+          "tgMKEUNTaGFycEZpbGVPcHRpb25zEhEKCW5hbWVzcGFjZRgBIAEoCRIaChJ1" + 
           "bWJyZWxsYV9jbGFzc25hbWUYAiABKAkSHAoOcHVibGljX2NsYXNzZXMYAyAB" + 
           "KAg6BHRydWUSFgoObXVsdGlwbGVfZmlsZXMYBCABKAgSFAoMbmVzdF9jbGFz" + 
           "c2VzGAUgASgIEhYKDmNvZGVfY29udHJhY3RzGAYgASgIEiQKHGV4cGFuZF9u" + 
@@ -55,22 +55,22 @@
           "CCABKAg6BHRydWUSHAoOZmlsZV9leHRlbnNpb24Y3QEgASgJOgMuY3MSGwoS" + 
           "dW1icmVsbGFfbmFtZXNwYWNlGN4BIAEoCRIcChBvdXRwdXRfZGlyZWN0b3J5" + 
           "GN8BIAEoCToBLhImChZpZ25vcmVfZ29vZ2xlX3Byb3RvYnVmGOABIAEoCDoF" + 
-          "ZmFsc2USTAoWc2VydmljZV9nZW5lcmF0b3JfdHlwZRjhASABKA4yIi5nb29n" + 
-          "bGUucHJvdG9idWYuQ1NoYXJwU2VydmljZVR5cGU6B0dFTkVSSUMiKwoSQ1No" + 
-          "YXJwRmllbGRPcHRpb25zEhUKDXByb3BlcnR5X25hbWUYASABKAkiLAoUQ1No" + 
-          "YXJwU2VydmljZU9wdGlvbnMSFAoMaW50ZXJmYWNlX2lkGAEgASgJIioKE0NT" + 
-          "aGFycE1ldGhvZE9wdGlvbnMSEwoLZGlzcGF0Y2hfaWQYASABKAUqQQoRQ1No" + 
-          "YXJwU2VydmljZVR5cGUSCwoHR0VORVJJQxABEg0KCUlOVEVSRkFDRRACEhAK" + 
-          "DElSUENESVNQQVRDSBADOl4KE2NzaGFycF9maWxlX29wdGlvbnMSHC5nb29n" + 
-          "bGUucHJvdG9idWYuRmlsZU9wdGlvbnMY6AcgASgLMiIuZ29vZ2xlLnByb3Rv" + 
-          "YnVmLkNTaGFycEZpbGVPcHRpb25zOmEKFGNzaGFycF9maWVsZF9vcHRpb25z" + 
-          "Eh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxjoByABKAsyIy5nb29n" + 
-          "bGUucHJvdG9idWYuQ1NoYXJwRmllbGRPcHRpb25zOmcKFmNzaGFycF9zZXJ2" + 
-          "aWNlX29wdGlvbnMSHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMY" + 
-          "6AcgASgLMiUuZ29vZ2xlLnByb3RvYnVmLkNTaGFycFNlcnZpY2VPcHRpb25z" + 
-          "OmQKFWNzaGFycF9tZXRob2Rfb3B0aW9ucxIeLmdvb2dsZS5wcm90b2J1Zi5N" + 
-          "ZXRob2RPcHRpb25zGOgHIAEoCzIkLmdvb2dsZS5wcm90b2J1Zi5DU2hhcnBN" + 
-          "ZXRob2RPcHRpb25z");
+          "ZmFsc2USSQoWc2VydmljZV9nZW5lcmF0b3JfdHlwZRjhASABKA4yIi5nb29n" + 
+          "bGUucHJvdG9idWYuQ1NoYXJwU2VydmljZVR5cGU6BE5PTkUiKwoSQ1NoYXJw" + 
+          "RmllbGRPcHRpb25zEhUKDXByb3BlcnR5X25hbWUYASABKAkiLAoUQ1NoYXJw" + 
+          "U2VydmljZU9wdGlvbnMSFAoMaW50ZXJmYWNlX2lkGAEgASgJIioKE0NTaGFy" + 
+          "cE1ldGhvZE9wdGlvbnMSEwoLZGlzcGF0Y2hfaWQYASABKAUqSwoRQ1NoYXJw" + 
+          "U2VydmljZVR5cGUSCAoETk9ORRAAEgsKB0dFTkVSSUMQARINCglJTlRFUkZB" + 
+          "Q0UQAhIQCgxJUlBDRElTUEFUQ0gQAzpeChNjc2hhcnBfZmlsZV9vcHRpb25z" + 
+          "EhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGOgHIAEoCzIiLmdvb2ds" + 
+          "ZS5wcm90b2J1Zi5DU2hhcnBGaWxlT3B0aW9uczphChRjc2hhcnBfZmllbGRf" + 
+          "b3B0aW9ucxIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY6AcgASgL" + 
+          "MiMuZ29vZ2xlLnByb3RvYnVmLkNTaGFycEZpZWxkT3B0aW9uczpnChZjc2hh" + 
+          "cnBfc2VydmljZV9vcHRpb25zEh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VP" + 
+          "cHRpb25zGOgHIAEoCzIlLmdvb2dsZS5wcm90b2J1Zi5DU2hhcnBTZXJ2aWNl" + 
+          "T3B0aW9uczpkChVjc2hhcnBfbWV0aG9kX29wdGlvbnMSHi5nb29nbGUucHJv" + 
+          "dG9idWYuTWV0aG9kT3B0aW9ucxjoByABKAsyJC5nb29nbGUucHJvdG9idWYu" + 
+          "Q1NoYXJwTWV0aG9kT3B0aW9ucw==");
       pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
         descriptor = root;
         internal__static_google_protobuf_CSharpFileOptions__Descriptor = Descriptor.MessageTypes[0];
@@ -105,6 +105,7 @@
   }
   #region Enums
   public enum CSharpServiceType {
+    NONE = 0,
     GENERIC = 1,
     INTERFACE = 2,
     IRPCDISPATCH = 3,
@@ -257,7 +258,7 @@
     
     public const int ServiceGeneratorTypeFieldNumber = 225;
     private bool hasServiceGeneratorType;
-    private global::Google.ProtocolBuffers.DescriptorProtos.CSharpServiceType serviceGeneratorType_ = global::Google.ProtocolBuffers.DescriptorProtos.CSharpServiceType.GENERIC;
+    private global::Google.ProtocolBuffers.DescriptorProtos.CSharpServiceType serviceGeneratorType_ = global::Google.ProtocolBuffers.DescriptorProtos.CSharpServiceType.NONE;
     public bool HasServiceGeneratorType {
       get { return hasServiceGeneratorType; }
     }
@@ -824,7 +825,7 @@
       }
       public Builder ClearServiceGeneratorType() {
         result.hasServiceGeneratorType = false;
-        result.serviceGeneratorType_ = global::Google.ProtocolBuffers.DescriptorProtos.CSharpServiceType.GENERIC;
+        result.serviceGeneratorType_ = global::Google.ProtocolBuffers.DescriptorProtos.CSharpServiceType.NONE;
         return this;
       }
     }
diff --git a/src/ProtocolBuffers2008.sln b/src/ProtocolBuffers2008.sln
index a73fdd4..93b9550 100644
--- a/src/ProtocolBuffers2008.sln
+++ b/src/ProtocolBuffers2008.sln
@@ -16,6 +16,7 @@
 		..\protos\google\protobuf\unittest_embed_optimize_for.proto = ..\protos\google\protobuf\unittest_embed_optimize_for.proto
 		..\protos\google\protobuf\unittest_empty.proto = ..\protos\google\protobuf\unittest_empty.proto
 		..\protos\google\protobuf\unittest_enormous_descriptor.proto = ..\protos\google\protobuf\unittest_enormous_descriptor.proto
+		..\protos\extest\unittest_extras_full.proto = ..\protos\extest\unittest_extras_full.proto
 		..\protos\extest\unittest_extras_lite.proto = ..\protos\extest\unittest_extras_lite.proto
 		..\protos\google\protobuf\unittest_import.proto = ..\protos\google\protobuf\unittest_import.proto
 		..\protos\google\protobuf\unittest_import_lite.proto = ..\protos\google\protobuf\unittest_import_lite.proto
@@ -24,6 +25,7 @@
 		..\protos\google\protobuf\unittest_mset.proto = ..\protos\google\protobuf\unittest_mset.proto
 		..\protos\google\protobuf\unittest_no_generic_services.proto = ..\protos\google\protobuf\unittest_no_generic_services.proto
 		..\protos\google\protobuf\unittest_optimize_for.proto = ..\protos\google\protobuf\unittest_optimize_for.proto
+		..\protos\extest\unittest_generic_services.proto = ..\protos\extest\unittest_generic_services.proto
 		..\protos\extest\unittest_rpc_interop.proto = ..\protos\extest\unittest_rpc_interop.proto
 	EndProjectSection
 EndProject
diff --git a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs
index 2d86a64..a02255d 100644
--- a/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs
+++ b/src/ProtocolBuffersLite.Test/TestProtos/UnitTestProtoFile.cs
@@ -18512,112 +18512,10 @@
   #endregion
   
   #region Services
-  public abstract class TestService : pb::IService {
-    public abstract void Foo(
-        pb::IRpcController controller,
-        global::Google.ProtocolBuffers.TestProtos.FooRequest request,
-        global::System.Action<global::Google.ProtocolBuffers.TestProtos.FooResponse> done);
-    public abstract void Bar(
-        pb::IRpcController controller,
-        global::Google.ProtocolBuffers.TestProtos.BarRequest request,
-        global::System.Action<global::Google.ProtocolBuffers.TestProtos.BarResponse> done);
-    
-    public static pbd::ServiceDescriptor Descriptor {
-      get { return UnitTestProtoFile.Descriptor.Services[0]; }
-    }
-    public pbd::ServiceDescriptor DescriptorForType {
-      get { return Descriptor; }
-    }
-    
-    public void CallMethod(
-        pbd::MethodDescriptor method,
-        pb::IRpcController controller,
-        pb::IMessage request,
-        global::System.Action<pb::IMessage> done) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.CallMethod() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          this.Foo(controller, (global::Google.ProtocolBuffers.TestProtos.FooRequest) request,
-              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.FooResponse>(
-              done));
-          return;
-        case 1:
-          this.Bar(controller, (global::Google.ProtocolBuffers.TestProtos.BarRequest) request,
-              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.BarResponse>(
-              done));
-          return;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.GetRequestPrototype() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          return global::Google.ProtocolBuffers.TestProtos.FooRequest.DefaultInstance;
-        case 1:
-          return global::Google.ProtocolBuffers.TestProtos.BarRequest.DefaultInstance;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {
-      if (method.Service != Descriptor) {
-        throw new global::System.ArgumentException(
-            "Service.GetResponsePrototype() given method descriptor for wrong service type.");
-      }
-      switch(method.Index) {
-        case 0:
-          return global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance;
-        case 1:
-          return global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance;
-        default:
-          throw new global::System.InvalidOperationException("Can't get here.");
-      }
-    }
-    
-    public static Stub CreateStub(pb::IRpcChannel channel) {
-      return new Stub(channel);
-    }
-    
-    public class Stub : global::Google.ProtocolBuffers.TestProtos.TestService {
-      internal Stub(pb::IRpcChannel channel) {
-        this.channel = channel;
-      }
-      
-      private readonly pb::IRpcChannel channel;
-      
-      public pb::IRpcChannel Channel {
-        get { return channel; }
-      }
-      
-      public override void Foo(
-          pb::IRpcController controller,
-          global::Google.ProtocolBuffers.TestProtos.FooRequest request,
-          global::System.Action<global::Google.ProtocolBuffers.TestProtos.FooResponse> done) {
-        channel.CallMethod(Descriptor.Methods[0],
-            controller, request, global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance,
-            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.FooResponse, global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance));
-      }
-      
-      public override void Bar(
-          pb::IRpcController controller,
-          global::Google.ProtocolBuffers.TestProtos.BarRequest request,
-          global::System.Action<global::Google.ProtocolBuffers.TestProtos.BarResponse> done) {
-        channel.CallMethod(Descriptor.Methods[1],
-            controller, request, global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance,
-            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.BarResponse, global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance));
-      }
-    }
-  }
+  /*
+  * Service generation is now disabled by default, use the following option to enable:
+  * option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+  */
   #endregion
   
 }
