diff --git a/include/caosdb/configuration.h b/include/caosdb/configuration.h
index 5f254844c1972cc4400856a2470ef2d0dddf1c91..649495f9a3722c9009edcb6b383f5c02941ade28 100644
--- a/include/caosdb/configuration.h
+++ b/include/caosdb/configuration.h
@@ -22,22 +22,22 @@
 #ifndef CAOSDB_CONFIGURATION_H
 #define CAOSDB_CONFIGURATION_H
 
-#include "caosdb/authentication.h"          // for Authenticator, PlainPassw...
-#include "caosdb/certificate_provider.h"    // for CertificateProvider, path
-#include "caosdb/exceptions.h"              // for ConfigurationError
-#include "caosdb/logging.h"                 // for SinkConfiguration, Loggin...
-#include "caosdb/utility.h"                 // for load_json_file
-#include <google/protobuf/arena.h>          // for Arena
-#include <google/protobuf/extension_set.h>  // for Arena
-#include <grpcpp/security/credentials.h>    // for ChannelCredentials
-#include <boost/json/object.hpp>            // for object
-#include <boost/json/value.hpp>             // for value
-#include <boost/json/value_ref.hpp>         // for array, object
+#include "caosdb/authentication.h"         // for Authenticator, PlainPassw...
+#include "caosdb/certificate_provider.h"   // for CertificateProvider, path
+#include "caosdb/exceptions.h"             // for ConfigurationError
+#include "caosdb/logging.h"                // for SinkConfiguration, Loggin...
+#include "caosdb/utility.h"                // for load_json_file
+#include <google/protobuf/arena.h>         // for Arena
+#include <google/protobuf/extension_set.h> // for Arena
+#include <grpcpp/security/credentials.h>   // for ChannelCredentials
+#include <boost/json/object.hpp>           // for object
+#include <boost/json/value.hpp>            // for value
+#include <boost/json/value_ref.hpp>        // for array, object
 // IWYU pragma: no_include "boost/json/fwd.hpp"
-#include <filesystem>                       // for path, exists
-#include <iosfwd>                           // for ostream
-#include <memory>                           // for shared_ptr, unique_ptr
-#include <string>                           // for string
+#include <filesystem> // for path, exists
+#include <iosfwd>     // for ostream
+#include <memory>     // for shared_ptr, unique_ptr
+#include <string>     // for string
 
 namespace caosdb::configuration {
 using boost::json::array;
diff --git a/include/caosdb/entity.h b/include/caosdb/entity.h
index 11955fc91330c435bdc348f2bb5c6ed15aef37b0..155d4ff6f5b12ac9ece29b4fa5f08fdccde29053 100644
--- a/include/caosdb/entity.h
+++ b/include/caosdb/entity.h
@@ -48,7 +48,6 @@
 #include <iosfwd>                                      // for streamsize
 #include <iterator>                                    // for iterator, output_iterato...
 #include <map>                                         // for map
-#include <random>                                      // for mt19937, rand...
 #include <stdexcept>                                   // for out_of_range
 #include <string>                                      // for string, basic...
 #include <utility>                                     // for move
@@ -862,9 +861,7 @@ public:
 
   auto SetFilePath(const std::string &path) -> void;
   inline auto HasFile() const -> bool { return !this->file_descriptor.local_path.empty(); }
-  auto SetFileTransmissionRegistrationId(const std::string &registration_id) -> void;
   inline auto SetFileTransmissionId(FileTransmissionId *file_transmission_id) -> void {
-    file_transmission_id->set_file_id(GetNextFileId());
     file_descriptor.file_transmission_id = file_transmission_id;
   }
 
@@ -911,17 +908,6 @@ public:
   }
 
 private:
-  inline auto GetNextFileId() -> std::string {
-    std::string str = "0123456789abcdef";
-    std::mt19937 generator(std::random_device{}());
-    std::uniform_int_distribution<int> distribution(0, str.size() - 1);
-    std::string result(10, '\0');
-
-    for (auto &dis : result) {
-      dis = str[distribution(generator)];
-    }
-    return result;
-  }
   static auto CreateMessagesField() -> RepeatedPtrField<ProtoMessage> *;
   auto SetId(const std::string &id) -> void;
   auto SetVersionId(const std::string &id) -> void;
diff --git a/include/caosdb/info.h b/include/caosdb/info.h
index 6be1d7221a7d73abc82f13e7eecd9aa2f208a2d4..0c4132f770d7bd68f10a74743246c0c037364f01 100644
--- a/include/caosdb/info.h
+++ b/include/caosdb/info.h
@@ -53,12 +53,7 @@ public:
    * CaosDBConnection::GetVersionInfo() instead to get the version of the
    * server behind the given connection.
    */
-  explicit inline VersionInfo(ProtoVersionInfo *info)
-    : info(info){
-        // if (this->info->GetArena() == nullptr) {
-        // caosdb::utility::get_arena()->Own(this->info);
-        //}
-      };
+  explicit inline VersionInfo(ProtoVersionInfo *info) : info(info){};
   [[nodiscard]] inline auto GetMajor() const -> int32_t { return this->info->major(); }
   [[nodiscard]] inline auto GetMinor() const -> int32_t { return this->info->minor(); }
   [[nodiscard]] inline auto GetPatch() const -> int32_t { return this->info->patch(); }
@@ -68,7 +63,8 @@ public:
   [[nodiscard]] inline auto GetBuild() const -> const std::string & { return this->info->build(); }
 
 private:
-  ProtoVersionInfo *info;
+  /// This object is the owner of the Protobuf VersionInfo message.
+  std::unique_ptr<ProtoVersionInfo> info;
 };
 
 } // namespace caosdb::info
diff --git a/include/caosdb/transaction.h b/include/caosdb/transaction.h
index 6fc429ad0cb10c9df88c705e2874834da628ff6f..0e11d3f1a5d9145795b2bdcd4e1c82c31e360aa2 100644
--- a/include/caosdb/transaction.h
+++ b/include/caosdb/transaction.h
@@ -517,11 +517,6 @@ private:
   std::vector<FileDescriptor> upload_files;
   std::map<std::string, FileDescriptor> download_files;
 
-  // auto RegisterUploadFile(RegisterFileUploadResponse *response) -> void;
-  auto UploadFile(FileUploadResponse *response, const FileDescriptor &file_descriptor,
-                  const std::string &registration_id) -> void;
-  auto DownloadFile(FileDownloadResponse *response, const FileTransmissionId &file_transmission_id)
-    -> void;
   bool has_query = false;
   TransactionType transaction_type = TransactionType::NONE;
   mutable std::unique_ptr<ResultSet> result_set;
diff --git a/src/caosdb/connection.cpp b/src/caosdb/connection.cpp
index 80209f9bb9d2c1806d6a9966c2af59226dfe4529..02c190ee1beff00fc3cbffa950628a67b5ffa32d 100644
--- a/src/caosdb/connection.cpp
+++ b/src/caosdb/connection.cpp
@@ -25,14 +25,12 @@
 #include "caosdb/info.h"                          // for VersionInfo
 #include "caosdb/info/v1/main.grpc.pb.h"          // for GeneralInfoService
 #include "caosdb/info/v1/main.pb.h"               // for GetVersionInfoRequest
-#include "caosdb/protobuf_helper.h"               // for get_arena
 #include "caosdb/transaction.h"                   // for Transaction
 #include "caosdb/transaction_status.h"            // for TransactionStatus
-#include <google/protobuf/arena.h>                // for Arena
+#include "grpcpp/impl/codegen/status_code_enum.h" // for StatusCode, UNAUTH...
 #include <grpcpp/create_channel.h>                // for CreateChannel
 #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 StatusCode, UNAUTH...
 #include <string>                                 // for string, operator+
 
 namespace caosdb::connection {
@@ -46,8 +44,6 @@ using caosdb::info::v1::GetVersionInfoRequest;
 using caosdb::info::v1::GetVersionInfoResponse;
 using caosdb::transaction::Transaction;
 using caosdb::transaction::TransactionStatus;
-using caosdb::utility::get_arena;
-using google::protobuf::Arena;
 
 Connection::Connection(const ConnectionConfiguration &configuration) {
   const std::string target =
@@ -61,11 +57,11 @@ Connection::Connection(const ConnectionConfiguration &configuration) {
 
 auto Connection::RetrieveVersionInfoNoExceptions() const noexcept -> TransactionStatus {
 
-  const auto *request = Arena::CreateMessage<GetVersionInfoRequest>(get_arena());
-  auto *response = Arena::CreateMessage<GetVersionInfoResponse>(get_arena());
+  const GetVersionInfoRequest request;
+  GetVersionInfoResponse response;
   grpc::ClientContext context;
   const grpc::Status grpc_status =
-    this->general_info_service->GetVersionInfo(&context, *request, response);
+    this->general_info_service->GetVersionInfo(&context, request, &response);
 
   auto status = TransactionStatus::SUCCESS();
   if (!grpc_status.ok()) {
@@ -82,7 +78,7 @@ auto Connection::RetrieveVersionInfoNoExceptions() const noexcept -> Transaction
                                             error_message);
     }
   } else {
-    this->version_info = std::make_unique<VersionInfo>(response->mutable_version_info());
+    this->version_info = std::make_unique<VersionInfo>(response.release_version_info());
   }
 
   return status;
diff --git a/src/caosdb/transaction.cpp b/src/caosdb/transaction.cpp
index 5ed366ac4285511fc1907b8b1db06628fd35359f..6c96b8c71ee98aa399e2c7ba1d11d645c0c6801c 100644
--- a/src/caosdb/transaction.cpp
+++ b/src/caosdb/transaction.cpp
@@ -41,6 +41,7 @@
 #include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue
 #include <map>                                    // for map, operator!=
 #include <memory>                                 // for unique_ptr
+#include <random>  // for mt19937, rand...
 #include <sstream>
 #include <utility> // for move, pair
 
@@ -52,6 +53,7 @@ using caosdb::entity::v1::MultiTransactionResponse;
 using TransactionResponseCase = caosdb::entity::v1::TransactionResponse::TransactionResponseCase;
 using RetrieveResponseCase = caosdb::entity::v1::RetrieveResponse::RetrieveResponseCase;
 using ProtoEntity = caosdb::entity::v1::Entity;
+using caosdb::entity::v1::EntityRequest;
 using google::protobuf::Arena;
 using NextStatus = grpc::CompletionQueue::NextStatus;
 using RegistrationStatus = caosdb::entity::v1::RegistrationStatus;
@@ -142,20 +144,39 @@ auto Transaction::DeleteById(const std::string &id) noexcept -> StatusCode {
   return this->status.GetCode();
 }
 
-auto Transaction::InsertEntity(Entity *entity) noexcept -> StatusCode {
-  ASSERT_CAN_ADD_INSERTION
+auto get_next_file_id() -> std::string {
+  const std::string str = "0123456789abcdef";
+  std::mt19937 generator(std::random_device{}());
+  std::uniform_int_distribution<int> distribution(0, 15); // NOLINT
+  std::string result(10, '\0'); // NOLINT
 
-  auto *entity_request =
-    this->request->add_requests()->mutable_insert_request()->mutable_entity_request();
-  auto *proto_entity = entity_request->mutable_entity();
+  for (auto &dis : result) {
+    dis = str[distribution(generator)];
+  }
+  return result;
+}
 
-  // copy the original entity for the transaction
+// only used in the next two functions.
+auto add_entity_to_request(Entity *entity, EntityRequest *entity_request,
+                           std::vector<FileDescriptor> *upload_files) -> void {
+  auto *proto_entity = entity_request->mutable_entity();
   entity->CopyTo(proto_entity);
   if (entity->HasFile()) {
     auto *file_transmission_id = entity_request->mutable_upload_id();
+    file_transmission_id->set_file_id(get_next_file_id());
     entity->SetFileTransmissionId(file_transmission_id);
-    upload_files.push_back(entity->GetFileDescriptor());
+    upload_files->push_back(entity->GetFileDescriptor());
   }
+}
+
+auto Transaction::InsertEntity(Entity *entity) noexcept -> StatusCode {
+  ASSERT_CAN_ADD_INSERTION
+
+  auto *entity_request =
+    this->request->add_requests()->mutable_insert_request()->mutable_entity_request();
+
+  add_entity_to_request(entity, entity_request, &upload_files);
+
   this->status = TransactionStatus::GO_ON();
   return this->status.GetCode();
 }
@@ -165,14 +186,9 @@ auto Transaction::UpdateEntity(Entity *entity) noexcept -> StatusCode {
 
   auto *entity_request =
     this->request->add_requests()->mutable_update_request()->mutable_entity_request();
-  auto *proto_entity = entity_request->mutable_entity();
 
-  entity->CopyTo(proto_entity);
-  if (entity->HasFile()) {
-    auto *file_transmission_id = entity_request->mutable_upload_id();
-    entity->SetFileTransmissionId(file_transmission_id);
-    upload_files.push_back(entity->GetFileDescriptor());
-  }
+  add_entity_to_request(entity, entity_request, &upload_files);
+
   this->status = TransactionStatus::GO_ON();
   return this->status.GetCode();
 }
@@ -251,8 +267,8 @@ auto Transaction::ExecuteAsynchronously() noexcept -> StatusCode { // NOLINT
             sub_response.mutable_retrieve_response()->mutable_entity_response();
           auto entity_id = entity_response->entity().id();
           download_files[entity_id].file_transmission_id =
-            entity_response->unsafe_arena_release_download_id();
-          // TODO(tf) handle error
+            Arena::CreateMessage<FileTransmissionId>(GetArena());
+          download_files[entity_id].file_transmission_id->CopyFrom(entity_response->download_id());
         }
       }
     }