diff --git a/include/caosdb/transaction.h b/include/caosdb/transaction.h
index ddf7133492f182d53de372e80420799cbf285ccf..7be9d18ebf117942507ad33e26b13370bd56138a 100644
--- a/include/caosdb/transaction.h
+++ b/include/caosdb/transaction.h
@@ -208,7 +208,7 @@ private:
 class MultiResultSet : public ResultSet {
 public:
   ~MultiResultSet() = default;
-  explicit MultiResultSet(MultiTransactionResponse *response);
+  explicit MultiResultSet(std::vector<std::unique_ptr<Entity>> result_set);
   [[nodiscard]] inline auto Size() const noexcept -> int override {
     return this->entities.size();
   }
diff --git a/src/caosdb/transaction.cpp b/src/caosdb/transaction.cpp
index 334d8f77ad88f3d4cf39e22fd048a534e7524087..698218a820c403a60eb322fedf8cf58228a6c11b 100644
--- a/src/caosdb/transaction.cpp
+++ b/src/caosdb/transaction.cpp
@@ -131,28 +131,8 @@ auto ResultSet::end() const -> ResultSet::iterator {
   return ResultSet::iterator(this, Size());
 }
 
-MultiResultSet::MultiResultSet(MultiTransactionResponse *response) {
-  auto *responses = response->mutable_responses();
-  for (auto sub_response : *responses) {
-    switch (sub_response.wrapped_response_case()) {
-    case WrappedResponseCase::kRetrieveResponse:
-      this->entities.push_back(std::make_unique<Entity>(
-        sub_response.mutable_retrieve_response()->release_entity()));
-      break;
-    case WrappedResponseCase::kInsertResponse:
-      this->entities.push_back(
-        std::make_unique<Entity>(sub_response.release_insert_response()));
-      break;
-    case WrappedResponseCase::kDeleteResponse:
-      this->entities.push_back(
-        std::make_unique<Entity>(sub_response.release_insert_response()));
-      break;
-    default:
-      // TODO(tf) Updates
-      break;
-    }
-  }
-}
+MultiResultSet::MultiResultSet(std::vector<std::unique_ptr<Entity>> result_set)
+  : entities(std::move(result_set)) {}
 
 [[nodiscard]] auto UniqueResult::GetEntity() const -> const Entity & {
   const Entity *result = this->entity.get();
@@ -338,7 +318,28 @@ auto Transaction::WaitForIt() const noexcept -> TransactionStatus {
       break;
     }
   } else {
-    this->result_set = std::make_unique<MultiResultSet>(this->response);
+    auto *responses = this->response->mutable_responses();
+    std::vector<std::unique_ptr<Entity>> entities;
+    for (auto sub_response : *responses) {
+      switch (sub_response.wrapped_response_case()) {
+      case WrappedResponseCase::kRetrieveResponse:
+        entities.push_back(std::make_unique<Entity>(
+          sub_response.mutable_retrieve_response()->release_entity()));
+        break;
+      case WrappedResponseCase::kInsertResponse:
+        entities.push_back(
+          std::make_unique<Entity>(sub_response.release_insert_response()));
+        break;
+      case WrappedResponseCase::kDeleteResponse:
+        entities.push_back(
+          std::make_unique<Entity>(sub_response.release_insert_response()));
+        break;
+      default:
+        // TODO(tf) Updates
+        break;
+      }
+    }
+    this->result_set = std::make_unique<MultiResultSet>(std::move(entities));
   }
 
   return this->status;
diff --git a/test/test_transaction.cpp b/test/test_transaction.cpp
index 557ded7b87fe9947391bb47f6c37b49ee1824cfb..86d3294e13166867ef7a409f9ceb7513753d6bae 100644
--- a/test/test_transaction.cpp
+++ b/test/test_transaction.cpp
@@ -31,6 +31,7 @@
 #include "gtest/gtest_pred_impl.h"     // for Test, TestInfo, TEST
 #include <memory>                      // for allocator, unique_ptr
 #include <string>                      // for string, basic_string
+#include <utility>                     // for move
 #include <vector>                      // for vector
 
 namespace caosdb::transaction {
@@ -39,6 +40,7 @@ using caosdb::connection::Connection;
 using caosdb::exceptions::ConnectionError;
 using caosdb::transaction::UniqueResult;
 using ProtoEntity = caosdb::entity::v1alpha1::Entity;
+using caosdb::entity::v1alpha1::RetrieveResponse;
 
 TEST(test_transaction, create_transaction) {
   const auto *host = "localhost";
@@ -92,21 +94,18 @@ TEST(test_transaction, test_retrieve_by_ids) {
 }
 
 TEST(test_transaction, test_multi_result_set_empty) {
-  MultiTransactionResponse response;
-
-  MultiResultSet rs(&response);
+  std::vector<std::unique_ptr<Entity>> empty;
+  MultiResultSet rs(std::move(empty));
   EXPECT_EQ(rs.Size(), 0);
 }
 
 TEST(test_transaction, test_multi_result_iterator) {
-  MultiTransactionResponse response;
-
-  response.add_responses()
-    ->mutable_retrieve_response()
-    ->mutable_entity()
-    ->set_id("100");
+  std::vector<std::unique_ptr<Entity>> one_elem;
+  RetrieveResponse response;
+  response.mutable_entity()->set_id("100");
+  one_elem.push_back(std::make_unique<Entity>(response.release_entity()));
 
-  MultiResultSet rs(&response);
+  MultiResultSet rs(std::move(one_elem));
   EXPECT_EQ(rs.Size(), 1);
 
   for (const Entity &entity : rs) {
@@ -126,18 +125,19 @@ TEST(test_transaction, test_unique_result_iterator) {
 }
 
 TEST(test_transaction, test_multi_result_set_one) {
-  MultiTransactionResponse response;
-  response.add_responses()
-    ->mutable_retrieve_response()
-    ->mutable_entity()
-    ->set_id("100");
+  std::vector<std::unique_ptr<Entity>> one_elem;
+  RetrieveResponse response;
+  response.mutable_entity()->set_id("100");
+  one_elem.push_back(std::make_unique<Entity>(response.release_entity()));
 
-  MultiResultSet rs(&response);
+  MultiResultSet rs(std::move(one_elem));
   EXPECT_EQ(rs.Size(), 1);
   EXPECT_EQ(rs.At(0).GetId(), "100");
 }
 
 TEST(test_transaction, test_multi_result_set_three) {
+  std::vector<std::unique_ptr<Entity>> three_elem;
+
   MultiTransactionResponse response;
   response.add_responses()
     ->mutable_retrieve_response()
@@ -152,7 +152,14 @@ TEST(test_transaction, test_multi_result_set_three) {
     ->mutable_entity()
     ->set_id("102");
 
-  MultiResultSet rs(&response);
+  auto *responses = response.mutable_responses();
+  std::vector<std::unique_ptr<Entity>> entities;
+  for (auto sub_response : *responses) {
+    three_elem.push_back(std::make_unique<Entity>(
+      sub_response.mutable_retrieve_response()->release_entity()));
+  }
+
+  MultiResultSet rs(std::move(three_elem));
   EXPECT_EQ(rs.Size(), 3);
   EXPECT_TRUE(rs.At(1).HasErrors());
 }