diff --git a/include/caosdb/file_transmission/download_request_handler.h b/include/caosdb/file_transmission/download_request_handler.h
index 965db6419de180f46e1a712d4a4d5795857599ab..9c82b232bed9e0b702c38eeeeb762899a3071528 100644
--- a/include/caosdb/file_transmission/download_request_handler.h
+++ b/include/caosdb/file_transmission/download_request_handler.h
@@ -55,10 +55,10 @@
 #include "caosdb/file_transmission/file_writer.h" // for FileWriter
 #include "caosdb/handler_interface.h"             // for HandlerTag, Handl...
 #include <cstdint>                                // for uint64_t
-#include <grpcpp/impl/codegen/async_stream.h>     // for ClientAsyncReader
-#include <grpcpp/impl/codegen/client_context.h>   // for ClientContext
-#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue
-#include <grpcpp/impl/codegen/status.h>           // for Status
+#include <grpcpp/client_context.h>                // for ClientContext
+#include <grpcpp/completion_queue.h>              // for CompletionQueue
+#include <grpcpp/support/async_stream.h>          // for ClientAsyncReader
+#include <grpcpp/support/status.h>                // for Status
 #include <memory>                                 // for unique_ptr
 
 namespace caosdb::transaction {
diff --git a/include/caosdb/file_transmission/register_file_upload_handler.h b/include/caosdb/file_transmission/register_file_upload_handler.h
index 37df2dbf0fb895cd77f63bab2596a0b124c48b9c..37cc6cf6ae83aa23781cc65924cefba83be22627 100644
--- a/include/caosdb/file_transmission/register_file_upload_handler.h
+++ b/include/caosdb/file_transmission/register_file_upload_handler.h
@@ -49,13 +49,13 @@
 #ifndef CAOSDB_FILE_TRANSMISSION_REGISTER_FILE_UPLOAD_H
 #define CAOSDB_FILE_TRANSMISSION_REGISTER_FILE_UPLOAD_H
 
-#include "caosdb/entity/v1/main.grpc.pb.h" // for FileTransmissionS...
-#include "caosdb/entity/v1/main.pb.h"      // for FileDownloadResponse
-#include "caosdb/handler_interface.h"      // for HandlerTag, Handl...
-#include "caosdb/unary_rpc_handler.h"
-#include <grpcpp/impl/codegen/async_unary_call.h> // for ClientAsyncRespons...
-#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue
-#include <memory>                                 // for unique_ptr
+#include "caosdb/entity/v1/main.grpc.pb.h"   // for FileTransmissionS...
+#include "caosdb/entity/v1/main.pb.h"        // for FileDownloadResponse
+#include "caosdb/handler_interface.h"        // for HandlerTag, Handl...
+#include "caosdb/unary_rpc_handler.h"        // for  UnaryRpcHandler
+#include <grpcpp/completion_queue.h>         // for CompletionQueue
+#include <grpcpp/support/async_unary_call.h> // for ClientAsyncResponseReader
+#include <memory>                            // for unique_ptr
 
 namespace caosdb::transaction {
 
diff --git a/include/caosdb/file_transmission/upload_request_handler.h b/include/caosdb/file_transmission/upload_request_handler.h
index 099e39e62a087111308f7afdf77631a3e42c5d09..f9d6aab9abf1800ab7e5ebece6f2f7011f86cca0 100644
--- a/include/caosdb/file_transmission/upload_request_handler.h
+++ b/include/caosdb/file_transmission/upload_request_handler.h
@@ -55,10 +55,10 @@
 #include "caosdb/file_transmission/file_reader.h" // for FileReader
 #include "caosdb/handler_interface.h"             // for HandlerTag, Handl...
 #include <cstdint>                                // for uint64_t
-#include <grpcpp/impl/codegen/async_stream.h>     // for ClientAsyncWriter
-#include <grpcpp/impl/codegen/client_context.h>   // for ClientContext
-#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue
-#include <grpcpp/impl/codegen/status.h>           // for Status
+#include <grpcpp/client_context.h>                // for ClientContext
+#include <grpcpp/completion_queue.h>              // for CompletionQueue
+#include <grpcpp/support/async_stream.h>          // for ClientAsyncReader
+#include <grpcpp/support/status.h>                // for Status
 #include <memory>                                 // for unique_ptr
 
 namespace caosdb::transaction {
diff --git a/include/caosdb/transaction_handler.h b/include/caosdb/transaction_handler.h
index 6fa386be32628d5d0ae80a90dda1e1293d1eae70..3f9fc811a2137d9b8c8d0205c15704179a1c3554 100644
--- a/include/caosdb/transaction_handler.h
+++ b/include/caosdb/transaction_handler.h
@@ -1,11 +1,11 @@
 #pragma once
-#include "caosdb/entity/v1/main.grpc.pb.h"        // for FileTransmissionS...
-#include "caosdb/entity/v1/main.pb.h"             // for FileDownloadResponse
-#include "caosdb/handler_interface.h"             // for HandlerTag
-#include "caosdb/unary_rpc_handler.h"             // for HandlerTag, Handl...
-#include <grpcpp/impl/codegen/async_unary_call.h> // for ClientAsyncRespons...
-#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue
-#include <memory>                                 // for unique_ptr
+#include "caosdb/entity/v1/main.grpc.pb.h"   // for FileTransmissionS...
+#include "caosdb/entity/v1/main.pb.h"        // for FileDownloadResponse
+#include "caosdb/handler_interface.h"        // for HandlerTag
+#include "caosdb/unary_rpc_handler.h"        // for HandlerTag, Handl...
+#include <grpcpp/completion_queue.h>         // for CompletionQueue
+#include <grpcpp/support/async_unary_call.h> // for ClientAsyncResponseReader
+#include <memory>                            // for unique_ptr
 
 namespace caosdb::transaction {
 
diff --git a/include/caosdb/unary_rpc_handler.h b/include/caosdb/unary_rpc_handler.h
index a505a8724d67b5434b3535e15bc1ccb9eb635de4..06b9457ceae715b4319739f46d810d7a892612d7 100644
--- a/include/caosdb/unary_rpc_handler.h
+++ b/include/caosdb/unary_rpc_handler.h
@@ -49,11 +49,11 @@
 #ifndef CAOSDB_UNARY_RPC_HANDLER_H
 #define CAOSDB_UNARY_RPC_HANDLER_H
 
-#include "caosdb/handler_interface.h"             // for HandlerTag, Handl...
-#include "caosdb/transaction_status.h"            // for TransactionStatus
-#include <grpcpp/impl/codegen/client_context.h>   // for ClientContext
-#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue
-#include <grpcpp/impl/codegen/status.h>           // for Status
+#include "caosdb/handler_interface.h"  // for HandlerTag, Handl...
+#include "caosdb/transaction_status.h" // for TransactionStatus
+#include <grpcpp/client_context.h>     // for ClientContext
+#include <grpcpp/completion_queue.h>   // for CompletionQueue
+#include <grpcpp/support/status.h>     // for Status
 
 namespace caosdb::transaction {
 
diff --git a/src/caosdb/file_transmission/download_request_handler.cpp b/src/caosdb/file_transmission/download_request_handler.cpp
index e079d28390b59cd439efa7476c5df672a63c1ecc..821ed79477045f4e3bf49c061cfac622b814700d 100644
--- a/src/caosdb/file_transmission/download_request_handler.cpp
+++ b/src/caosdb/file_transmission/download_request_handler.cpp
@@ -47,23 +47,23 @@
  * > DEALINGS IN THE SOFTWARE.
  */
 #include "caosdb/file_transmission/download_request_handler.h"
-#include "caosdb/logging.h"            // for CAOSDB_LOG_TRACE
-#include "caosdb/protobuf_helper.h"    // for get_arena
-#include "caosdb/status_code.h"        // for GENERIC_RPC_E...
-#include "caosdb/transaction_status.h" // for TransactionStatus
-#include <exception>                   // IWYU pragma: keep
+#include "caosdb/logging.h"                  // for CAOSDB_LOG_TRACE
+#include "caosdb/protobuf_helper.h"          // for get_arena
+#include "caosdb/status_code.h"              // for GENERIC_RPC_E...
+#include "caosdb/transaction_status.h"       // for TransactionStatus
+#include <exception>                         // IWYU pragma: keep
+#include <filesystem>                        // for operator<<, path
+#include <google/protobuf/arena.h>           // for Arena
+#include <grpcpp/client_context.h>           // for ClientContext
+#include <grpcpp/completion_queue.h>         // for CompletionQueue
+#include <grpcpp/support/async_stream.h>     // for ClientAsyncReader
+#include <grpcpp/support/status.h>           // for Status
+#include <grpcpp/support/status_code_enum.h> // for OK
+#include <stdexcept>                         // for runtime_error
+#include <string>                            // for string, opera...
+#include <utility>                           // for move
 // IWYU pragma: no_include <bits/exception.h>
-#include <filesystem>                             // for operator<<, path
-#include <google/protobuf/arena.h>                // for Arena
-#include <grpcpp/impl/codegen/async_stream.h>     // for ClientAsyncRe...
-#include <grpcpp/impl/codegen/client_context.h>   // for ClientContext
-#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue
-#include <grpcpp/impl/codegen/status.h>           // for Status
-#include <grpcpp/impl/codegen/status_code_enum.h> // for OK, UNAUTHENT...
-#include <stdexcept>                              // for runtime_error
-#include <string>                                 // for string, opera...
-#include <utility>                                // for move
-
+//
 namespace caosdb::transaction {
 using caosdb::StatusCode;
 using caosdb::utility::get_arena;
diff --git a/src/caosdb/file_transmission/register_file_upload_handler.cpp b/src/caosdb/file_transmission/register_file_upload_handler.cpp
index 9460d187e883d843dae21c9e4e3ba00376ecbb01..3a47715c75eb797120e1a0116c37743ef6d2b92a 100644
--- a/src/caosdb/file_transmission/register_file_upload_handler.cpp
+++ b/src/caosdb/file_transmission/register_file_upload_handler.cpp
@@ -47,9 +47,7 @@
  * > DEALINGS IN THE SOFTWARE.
  */
 #include "caosdb/file_transmission/register_file_upload_handler.h"
-#include "caosdb/logging.h"                       // for CAOSDB_LOG_TRACE
-#include <grpcpp/impl/codegen/async_unary_call.h> // for ClientAsyncRes...
-#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue
+#include "caosdb/logging.h" // for CAOSDB_LOG_TRACE
 
 namespace caosdb::transaction {
 
diff --git a/src/caosdb/file_transmission/upload_request_handler.cpp b/src/caosdb/file_transmission/upload_request_handler.cpp
index e4fb985b70b73e25869f54e635cb089901bb41a1..32bb8132e0b4a966774c5f8111800151895b6ced 100644
--- a/src/caosdb/file_transmission/upload_request_handler.cpp
+++ b/src/caosdb/file_transmission/upload_request_handler.cpp
@@ -47,24 +47,20 @@
  * > DEALINGS IN THE SOFTWARE.
  */
 #include "caosdb/file_transmission/upload_request_handler.h"
-#include "caosdb/logging.h"            // for CAOSDB_LOG_ERROR
-#include "caosdb/protobuf_helper.h"    // for get_arena
-#include "caosdb/status_code.h"        // for GENERIC_RPC_E...
-#include "caosdb/transaction_status.h" // for TransactionStatus
-#include <algorithm>                   // for min
-#include <cstdint>                     // for uint64_t
-#include <exception>                   // IWYU pragma: keep
+#include "caosdb/logging.h"                  // for CAOSDB_LOG_ERROR
+#include "caosdb/protobuf_helper.h"          // for get_arena
+#include "caosdb/status_code.h"              // for GENERIC_RPC_E...
+#include "caosdb/transaction_status.h"       // for TransactionStatus
+#include <algorithm>                         // for min
+#include <cstdint>                           // for uint64_t
+#include <exception>                         // IWYU pragma: keep
+#include <filesystem>                        // for operator<<, path
+#include <google/protobuf/arena.h>           // for Arena
+#include <grpcpp/impl/codegen/call_op_set.h> // for WriteOptions
+#include <grpcpp/support/status_code_enum.h> // for OK
+#include <string>                            // for basic_string
+#include <utility>                           // for move
 // IWYU pragma: no_include <bits/exception.h>
-#include <filesystem>                             // for operator<<, path
-#include <google/protobuf/arena.h>                // for Arena
-#include <grpcpp/impl/codegen/async_stream.h>     // for ClientAsyncWr...
-#include <grpcpp/impl/codegen/call_op_set.h>      // for WriteOptions
-#include <grpcpp/impl/codegen/client_context.h>   // for ClientContext
-#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue
-#include <grpcpp/impl/codegen/status.h>           // for Status
-#include <grpcpp/impl/codegen/status_code_enum.h> // for OK, UNAUTHENT...
-#include <string>                                 // for basic_string
-#include <utility>                                // for move
 
 namespace caosdb::transaction {
 using caosdb::StatusCode;
diff --git a/src/caosdb/transaction.cpp b/src/caosdb/transaction.cpp
index 8d1897f1bd365fc4031acbc19271608a528c1784..c75fdeb7fcf5b1a5854464dcabf76c11bb5a4262 100644
--- a/src/caosdb/transaction.cpp
+++ b/src/caosdb/transaction.cpp
@@ -28,7 +28,6 @@
 #include "caosdb/status_code.h"                                    // for StatusCode
 #include "caosdb/transaction_handler.h"                            // for EntityTransactionHandler
 #include <algorithm>                                               // for max
-#include <chrono>                                                  // for chrono_literals
 #include <exception>                                               // IWYU pragma: keep
 #include <filesystem>                                              // for operator<<, path
 #include <future>                                                  // for async, future
@@ -38,7 +37,6 @@
 #include <memory>                                                  // for unique_ptr
 #include <random>                                                  // for mt19937, rand...
 #include <system_error>                                            // for std::system_error
-#include <thread>                                                  // for sleep
 #include <utility>                                                 // for move, pair
 // IWYU pragma: no_include <bits/exception.h>
 // IWYU pragma: no_include <cxxabi.h>
@@ -423,14 +421,17 @@ auto Transaction::WaitForIt() const noexcept -> TransactionStatus {
   return this->status;
 }
 
-// NOLINTNEXTLINE
 auto Transaction::ProcessCalls() -> TransactionStatus {
-  CAOSDB_LOG_TRACE_ENTER_AND_LEAVE(logger_name, "Transaction::ProcessCalls()")
-  if (this->status.GetCode() != StatusCode::EXECUTING) {
-    CAOSDB_LOG_ERROR(logger_name)
-      << "Transaction::ProcessCalls() was called, TransactionStatus was: "
-      << std::to_string(this->status.GetCode()) << " - " << this->status.GetDescription();
-    return status;
+  CAOSDB_LOG_TRACE_ENTER_AND_LEAVE(logger_name, "Transaction::ProcessCalls()") {
+    TRANSACTION_SYNCRONIZED_BLOCK
+    if (this->status.GetCode() != StatusCode::EXECUTING) {
+      CAOSDB_LOG_ERROR(logger_name)
+        << "Transaction::ProcessCalls() was called, TransactionStatus was: "
+        << std::to_string(this->status.GetCode()) << " - " << this->status.GetDescription();
+      return status;
+    }
+
+    handler_->Start();
   }
 
   gpr_timespec deadline;
@@ -439,7 +440,6 @@ auto Transaction::ProcessCalls() -> TransactionStatus {
   deadline.clock_type = gpr_clock_type::GPR_TIMESPAN;
 
   TransactionStatus result = TransactionStatus::EXECUTING();
-  handler_->Start();
 
   void *tag = nullptr;
   bool ok = false;
@@ -486,29 +486,28 @@ Transaction::~Transaction() {
 void Transaction::Cancel() {
   CAOSDB_LOG_TRACE_ENTER_AND_LEAVE(logger_name, "Transaction::Cancel()")
 
-  TRANSACTION_SYNCRONIZED_BLOCK
-
-  if (this->status.GetCode() > 0) {
-    // Prevent canceling before the queue even started.
-    // Temporary fix for a bug in GRPC.
-    // Fix is in the making:
-    // https://github.com/grpc/grpc/pull/30004
-    using namespace std::chrono_literals;
-    std::this_thread::sleep_for(5ms);
+  if (this->status.GetCode() == StatusCode::CANCELLED) {
+    return;
   }
 
-  this->status = TransactionStatus::CANCELLED();
-  if (handler_ != nullptr) {
-    handler_->Cancel();
-  }
+  {
 
-  completion_queue.Shutdown();
+    TRANSACTION_SYNCRONIZED_BLOCK
 
-  // drain the queue
-  void *ignoredTag = nullptr;
-  bool ok = false;
-  while (completion_queue.Next(&ignoredTag, &ok)) {
-    ;
+    if (handler_ != nullptr) {
+      handler_->Cancel();
+    }
+
+    this->status = TransactionStatus::CANCELLED();
+
+    completion_queue.Shutdown();
+
+    // drain the queue
+    void *ignoredTag = nullptr;
+    bool ok = false;
+    while (completion_queue.Next(&ignoredTag, &ok)) {
+      ;
+    }
   }
 
   if (transaction_future.valid()) {
diff --git a/src/caosdb/transaction_handler.cpp b/src/caosdb/transaction_handler.cpp
index cbcbf76332f437712ea3883be72c347370f75924..ef4897d1392f46b374fbdf5831c3a9e74ebf9d63 100644
--- a/src/caosdb/transaction_handler.cpp
+++ b/src/caosdb/transaction_handler.cpp
@@ -2,8 +2,6 @@
 #include "caosdb/logging.h" // for CAOSDB_LOG_TRACE
 #include <exception>        // IWYU pragma: keep
 // IWYU pragma: no_include <bits/exception.h>
-#include <grpcpp/impl/codegen/async_unary_call.h> // for ClientAsyncRes...
-#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue
 
 namespace caosdb::transaction {
 
diff --git a/src/caosdb/unary_rpc_handler.cpp b/src/caosdb/unary_rpc_handler.cpp
index 6770cae1981fa193105d5af9af4934d90a6b0aca..06afc127cecea22b1b805d20a68eab177841e981 100644
--- a/src/caosdb/unary_rpc_handler.cpp
+++ b/src/caosdb/unary_rpc_handler.cpp
@@ -47,14 +47,12 @@
  * > DEALINGS IN THE SOFTWARE.
  */
 #include "caosdb/unary_rpc_handler.h"
-#include "caosdb/logging.h"     // for CAOSDB_LOG_TRACE
-#include "caosdb/status_code.h" // for GENERIC_RPC_E...
+#include "caosdb/logging.h"                  // for CAOSDB_LOG_TRACE
+#include "caosdb/status_code.h"              // for GENERIC_RPC_E...
+#include <exception>                         // IWYU pragma: keep
+#include <grpcpp/support/status_code_enum.h> // for OK
+#include <string>                            // for string, opera...
 // IWYU pragma: no_include <bits/exception.h>
-#include <exception>                              // IWYU pragma: keep
-#include <grpcpp/impl/codegen/client_context.h>   // for ClientContext
-#include <grpcpp/impl/codegen/status.h>           // for Status
-#include <grpcpp/impl/codegen/status_code_enum.h> // for OK, UNAUTHENT...
-#include <string>                                 // for string, opera...
 
 namespace caosdb::transaction {