diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc
index 4e428da1c6e29cec215bc7f122468addda382e0b..cd80f1f9a95965cc3bf1402f35b7a792480248d5 100644
--- a/test/cpp/qps/client_async.cc
+++ b/test/cpp/qps/client_async.cc
@@ -60,6 +60,7 @@ class ClientRpcContext {
   ClientRpcContext() {}
   virtual ~ClientRpcContext() {}
   virtual bool RunNextState() = 0;  // do next state, return false if steps done
+  virtual void StartNewClone() = 0;
   static void *tag(ClientRpcContext *c) { return reinterpret_cast<void *>(c); }
   static ClientRpcContext *detag(void *t) {
     return reinterpret_cast<ClientRpcContext *>(t);
@@ -83,7 +84,7 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
         req_(req),
         response_(),
         next_state_(&ClientRpcContextUnaryImpl::ReqSent),
-        callback_(on_done),
+        callback_(on_done), start_req_(start_req),
         start_(Timer::Now()),
         response_reader_(
       start_req(stub_, &context_, req_, ClientRpcContext::tag(this))) {}
@@ -93,6 +94,10 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
     hist->Add((Timer::Now() - start_) * 1e9);
   }
 
+  void StartNewClone() {
+    new ClientRpcContextUnaryImpl(stub_, req_, start_req_, callback_);
+  }
+
  private:
   bool ReqSent() {
     next_state_ = &ClientRpcContextUnaryImpl::RespDone;
@@ -113,6 +118,10 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
   ResponseType response_;
   bool (ClientRpcContextUnaryImpl::*next_state_)();
   std::function<void(grpc::Status, ResponseType *)> callback_;
+  std::function<
+          std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>(
+        TestService::Stub *, grpc::ClientContext *, const RequestType &,
+        void *)> start_req_;
   grpc::Status status_;
   double start_;
   std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>
@@ -152,6 +161,19 @@ class AsyncClient GRPC_FINAL : public Client {
     StartThreads(config.async_client_threads());
   }
 
+  ~AsyncClient() GRPC_OVERRIDE {
+    EndThreads();
+
+    for (auto& cq : cli_cqs_) {
+      cq->Shutdown();
+      void *got_tag;
+      bool ok;
+      while (cq->Next(&got_tag, &ok)) {
+        delete ClientRpcContext::detag(got_tag);
+      }
+    }
+  }
+
   void ThreadFunc(Histogram *histogram, size_t thread_idx) {
     void *got_tag;
     bool ok;
@@ -162,6 +184,7 @@ class AsyncClient GRPC_FINAL : public Client {
       // call the callback and then delete it
       ctx->report_stats(histogram);
       ctx->RunNextState();
+      ctx->StartNewClone();
       delete ctx;
     }
   }