diff --git a/src/compiler/objective_c_generator.cc b/src/compiler/objective_c_generator.cc
index ba89b28b7b5fdd4f350ae39bbb1f0a918f316c82..1d7faf120dc4e5c475204d06d6392bd6ce62deb2 100644
--- a/src/compiler/objective_c_generator.cc
+++ b/src/compiler/objective_c_generator.cc
@@ -149,20 +149,17 @@ void PrintMethodDeclarations(Printer *printer, const MethodDescriptor *method) {
 void PrintSimpleImplementation(Printer *printer, const MethodDescriptor *method,
                                map< ::grpc::string, ::grpc::string> vars) {
   printer->Print("{\n");
-  printer->Print(vars, "  GRPCProtoCall *rpc = [self RPCTo$method_name$With");
+  printer->Print(vars, "  [[self RPCTo$method_name$With");
   if (method->client_streaming()) {
     printer->Print("RequestsWriter:requestWriter");
   } else {
     printer->Print("Request:request");
   }
   if (method->server_streaming()) {
-    printer->Print(" eventHandler:eventHandler];\n");
+    printer->Print(" eventHandler:eventHandler] start];\n");
   } else {
-    printer->Print(" handler:handler];\n");
+    printer->Print(" handler:handler] start];\n");
   }
-  printer->Print(
-      "  [rpc setResponseDispatchQueue:_defaultResponseDispatchQueue];\n");
-  printer->Print("  [rpc start];\n");
   printer->Print("}\n");
 }
 
@@ -170,29 +167,23 @@ void PrintAdvancedImplementation(Printer *printer,
                                  const MethodDescriptor *method,
                                  map< ::grpc::string, ::grpc::string> vars) {
   printer->Print("{\n");
-  printer->Print(
-      vars, "  GRPCProtoCall *rpc = [self RPCToMethod:@\"$method_name$\"\n");
+  printer->Print(vars, "  return [self RPCToMethod:@\"$method_name$\"\n");
 
-  printer->Print("                          requestsWriter:");
+  printer->Print("            requestsWriter:");
   if (method->client_streaming()) {
     printer->Print("requestWriter\n");
   } else {
     printer->Print("[GRXWriter writerWithValue:request]\n");
   }
 
-  printer->Print(
-      vars,
-      "                           responseClass:[$response_class$ class]\n");
+  printer->Print(vars, "             responseClass:[$response_class$ class]\n");
 
-  printer->Print("                      responsesWriteable:[GRXWriteable ");
+  printer->Print("        responsesWriteable:[GRXWriteable ");
   if (method->server_streaming()) {
     printer->Print("writeableWithEventHandler:eventHandler]];\n");
   } else {
     printer->Print("writeableWithSingleHandler:handler]];\n");
   }
-  printer->Print(
-      "  [rpc setResponseDispatchQueue:_defaultResponseDispatchQueue];\n");
-  printer->Print("  return rpc;\n");
 
   printer->Print("}\n");
 }
@@ -243,8 +234,6 @@ void PrintMethodImplementations(Printer *printer,
         "- (instancetype)initWithHost:(NSString *)host"
         " NS_DESIGNATED_INITIALIZER;\n");
     printer.Print("+ (instancetype)serviceWithHost:(NSString *)host;\n");
-    printer.Print(
-        "- (void)setDefaultResponseDispatchQueue:(dispatch_queue_t)queue;\n");
     printer.Print("@end\n");
   }
   return output;
@@ -262,15 +251,12 @@ void PrintMethodImplementations(Printer *printer,
         {"service_class", ServiceClassName(service)},
         {"package", service->file()->package()}};
 
-    printer.Print(vars, "@implementation $service_class$ {\n");
-    printer.Print(vars, "  dispatch_queue_t _defaultResponseDispatchQueue;\n");
-    printer.Print(vars, "}\n\n");
+    printer.Print(vars, "@implementation $service_class$\n\n");
 
     printer.Print("// Designated initializer\n");
     printer.Print("- (instancetype)initWithHost:(NSString *)host {\n");
     printer.Print(
         vars,
-        "  _defaultResponseDispatchQueue = dispatch_get_main_queue();\n"
         "  return (self = [super initWithHost:host"
         " packageName:@\"$package$\" serviceName:@\"$service_name$\"]);\n");
     printer.Print("}\n\n");
@@ -284,10 +270,6 @@ void PrintMethodImplementations(Printer *printer,
     printer.Print("}\n\n");
     printer.Print("+ (instancetype)serviceWithHost:(NSString *)host {\n");
     printer.Print("  return [[self alloc] initWithHost:host];\n");
-    printer.Print("}\n\n");
-    printer.Print(
-        "- (void)setDefaultResponseDispatchQueue:(dispatch_queue_t)queue {\n");
-    printer.Print("  _defaultResponseDispatchQueue = queue;\n");
     printer.Print("}\n\n\n");
 
     for (int i = 0; i < service->method_count(); i++) {
diff --git a/src/objective-c/tests/InteropTests.m b/src/objective-c/tests/InteropTests.m
index 4466d6810cc9797c791d13aa22356bc360ba4f0b..e7d28f4e459aeca97269d4668da635098325efac 100644
--- a/src/objective-c/tests/InteropTests.m
+++ b/src/objective-c/tests/InteropTests.m
@@ -459,23 +459,17 @@
 
 - (void)testAlternateDispatchQueue {
   XCTAssertNotNil(self.class.host);
-  __weak XCTestExpectation *expectation1 = [self expectationWithDescription:@"AlternateDispatchQueue1"];
+  NSNumber *kPayloadSize = @256;
+  id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:kPayloadSize
+                                               requestedResponseSize:kPayloadSize];
 
-  NSArray *requests = @[@27182, @8, @1828, @45904];
-  NSArray *responses = @[@31415, @9, @2653, @58979];
+  __weak XCTestExpectation *expectation1 = [self expectationWithDescription:@"AlternateDispatchQueue1"];
 
   // Set the default dispatch queue
-  NSString *queue1_label = @"test.queue1";
-  NSString *queue2_label = @"test.queue2";
-  dispatch_queue_t queue1 = dispatch_queue_create([queue1_label UTF8String], DISPATCH_QUEUE_SERIAL);
-  dispatch_queue_t queue2 = dispatch_queue_create([queue2_label UTF8String], DISPATCH_QUEUE_SERIAL);
-  [_service setDefaultResponseDispatchQueue:queue1];
+  NSString *queue_label = @"test.queue1";
+  dispatch_queue_t queue = dispatch_queue_create([queue_label UTF8String], DISPATCH_QUEUE_SERIAL);
   GRXBufferedPipe *requestsBuffer1 = [[GRXBufferedPipe alloc] init];
 
-  __block int index = 0;
-
-  id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index]
-                                               requestedResponseSize:responses[index]];
   [requestsBuffer1 writeValue:request];
 
   [_service fullDuplexCallWithRequestsWriter:requestsBuffer1
@@ -485,26 +479,11 @@
     XCTAssertNil(error, @"Finished with unexpected error: %@", error);
     XCTAssertTrue(done || response, @"Event handler called without an event.");
     NSString *label = [NSString stringWithUTF8String:dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)];
-    XCTAssert([label isEqualToString:queue1_label]);
-
-    if (response) {
-      XCTAssertLessThan(index, 4, @"More than 4 responses received.");
-      id expected = [RMTStreamingOutputCallResponse messageWithPayloadSize:responses[index]];
-      XCTAssertEqualObjects(response, expected);
-      index += 1;
-      if (index < 4) {
-        id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index]
-                                                     requestedResponseSize:responses[index]];
-        [requestsBuffer1 writeValue:request];
-      } else {
-        [requestsBuffer1 writesFinishedWithError:nil];
-      }
-    }
+                                  NSLog(@"main queue label:%@", label);
+    NSString *main_queue_label = [NSString stringWithUTF8String:dispatch_queue_get_label(dispatch_get_main_queue())];
+    XCTAssert([label isEqualToString:main_queue_label]);
 
-    if (done) {
-      XCTAssertEqual(index, 4, @"Received %i responses instead of 4.", index);
-      [expectation1 fulfill];
-    }
+    [expectation1 fulfill];
   }];
 
   [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil];
@@ -513,8 +492,6 @@
   __weak XCTestExpectation *expectation2 = [self expectationWithDescription:@"AlternateDispatchQueue2"];
   GRXBufferedPipe *requestsBuffer2 = [[GRXBufferedPipe alloc] init];
 
-  index = 0;
-
   [requestsBuffer2 writeValue:request];
 
   GRPCProtoCall *rpc = [_service RPCToFullDuplexCallWithRequestsWriter:requestsBuffer2
@@ -524,32 +501,13 @@
     XCTAssertNil(error, @"Finished with unexpected error: %@", error);
     XCTAssertTrue(done || response, @"Event handler called without an event.");
     NSString *label = [NSString stringWithUTF8String:dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)];
-    XCTAssert([label isEqualToString:queue2_label]);
-
-    if (response) {
-      XCTAssertLessThan(index, 4, @"More than 4 responses received.");
-      id expected = [RMTStreamingOutputCallResponse messageWithPayloadSize:responses[index]];
-      XCTAssertEqualObjects(response, expected);
-      index += 1;
-      if (index < 4) {
-        id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index]
-                                                     requestedResponseSize:responses[index]];
-        [requestsBuffer2 writeValue:request];
-      } else {
-        [requestsBuffer2 writesFinishedWithError:nil];
-      }
-    }
-
-    if (done) {
-      XCTAssertEqual(index, 4, @"Received %i responses instead of 4.", index);
-      [expectation2 fulfill];
-    }
+    XCTAssert([label isEqualToString:queue_label]);
+    [expectation2 fulfill];
   }];
-  [rpc setResponseDispatchQueue:queue2];
+  [rpc setResponseDispatchQueue:queue];
   [rpc start];
 
   [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil];
-  [_service setDefaultResponseDispatchQueue:dispatch_get_main_queue()];
 }
 
 @end