diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
index a913c6906d61b4a171fe9955c9c2f81e17f60433..29c27eaf536434d2f870fc111ca00f5febec1327 100644
--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -52,9 +52,7 @@ set(libcaosdb_INCL
 
 IF(BUILD_ACM)
     list(APPEND libcaosdb_INCL
-         ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/role.h
          ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/user.h
-         ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/permission_rule.h
          )
 ENDIF()
 
diff --git a/include/caosdb/acm/permission_rule.h b/include/caosdb/acm/permission_rule.h
deleted file mode 100644
index 017a33039b1dee350855f399187c871e01b074e7..0000000000000000000000000000000000000000
--- a/include/caosdb/acm/permission_rule.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * This file is a part of the CaosDB Project.
- *
- * Copyright (C) 2022 Timm Fitschen <t.fitschen@indiscale.com>
- * Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
-/**
- * @brief PermissionRules grant or deny permissions to roles.
- *
- * @file caosdb/acm/permission_rule.h
- * @author Timm Fitchen
- * @date 2022-02-11
- */
-#ifdef BUILD_ACM
-#ifndef CAOSDB_ACM_PERMISSION_RULE_H
-#define CAOSDB_ACM_PERMISSION_RULE_H
-
-#include <stddef.h>      // for size_t
-#include <unordered_set> // for unordered_set
-#include <string>        // for string
-
-namespace caosdb::acm {
-
-class PermissionRuleImpl;
-
-class PermissionRule {
-public:
-  PermissionRule(std::string permission, bool isGrant, bool isPriority);
-  explicit PermissionRule(PermissionRuleImpl *wrapped);
-  PermissionRule(const PermissionRule &rule);
-  auto operator=(const PermissionRule &rule) -> PermissionRule &;
-  ~PermissionRule();
-  auto ToString() const -> std::string;
-  [[nodiscard]] auto IsGrant() const -> bool;
-  auto SetGrant(bool isGrant) -> void;
-  [[nodiscard]] auto IsPriority() const -> bool;
-  auto SetPriority(bool isPriority) -> void;
-  [[nodiscard]] auto GetPermission() const -> const std::string &;
-
-  auto operator==(const PermissionRule &other) const -> bool;
-
-private:
-  PermissionRuleImpl *impl;
-};
-
-struct HashPermissionRule {
-  auto operator()(const PermissionRule &rule) const -> size_t;
-};
-
-using PermissionRules = std::unordered_set<PermissionRule, HashPermissionRule>;
-
-} // namespace caosdb::acm
-#endif
-#endif
diff --git a/include/caosdb/acm/role.h b/include/caosdb/acm/role.h
deleted file mode 100644
index 560449b12762206680d9445cbc7bbe6942d5b896..0000000000000000000000000000000000000000
--- a/include/caosdb/acm/role.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * This file is a part of the CaosDB Project.
- *
- * Copyright (C) 2022 Timm Fitschen <t.fitschen@indiscale.com>
- * Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
-/**
- * @brief Roles, together with users, and permissions are a fundamental concept
- * of the access controll management of CaosDB.
- *
- * @file caosdb/acm/role.h
- * @author Timm Fitchen
- * @date 2022-02-11
- */
-#ifdef BUILD_ACM
-#ifndef CAOSDB_ACM_ROLES_H
-#define CAOSDB_ACM_ROLES_H
-
-#include "caosdb/acm/permission_rule.h" // for PermissionRule
-#include <memory>                       // for unique_ptr
-#include <string>                       // for string
-
-namespace caosdb::connection {
-class Connection;
-}
-
-namespace caosdb::acm {
-
-class RoleImpl;
-
-class Role {
-public:
-  explicit Role(const std::string &name);
-  explicit Role(std::unique_ptr<RoleImpl> wrapped);
-  Role(const std::string &name, const std::string &description);
-  Role(const Role &role);
-  auto operator=(const Role &role) -> Role &;
-  ~Role();
-  auto ToString() const -> std::string;
-  [[nodiscard]] auto GetName() const -> const std::string &;
-  auto SetName(const std::string &name) -> void;
-  [[nodiscard]] auto GetDescription() const -> const std::string &;
-  auto SetDescription(const std::string &description) -> void;
-  [[nodiscard]] auto GetPermissionRules() const -> const PermissionRules &;
-  // auto SetPermissionRules(PermissionRules rules) -> void;
-  auto ClearPermissionRules() -> void;
-  auto Grant(const std::string &permission, bool isPriority) -> void;
-  auto Deny(const std::string &permission, bool isPriority) -> void;
-  auto RevokeGrant(const std::string &permission, bool isPriority) -> void;
-  auto RevokeDenial(const std::string &permission, bool isPriority) -> void;
-  auto AddPermissionRule(const std::string &permission, bool isGrant, bool isPriority) -> void;
-  auto RemovePermissionRule(const std::string &permission, bool isGrant, bool isPriority) -> void;
-
-  friend class caosdb::connection::Connection;
-
-private:
-  std::unique_ptr<RoleImpl> wrapped;
-};
-
-} // namespace caosdb::acm
-#endif
-#endif
diff --git a/include/caosdb/connection.h b/include/caosdb/connection.h
index 1f47cc045baf3f0217c315e5d9e9b4e826007d54..d0414f2e84f81fe9e86a50f2e6411788cf0befeb 100644
--- a/include/caosdb/connection.h
+++ b/include/caosdb/connection.h
@@ -28,7 +28,6 @@
  * @brief Configuration and setup of the connection.
  */
 #ifdef BUILD_ACM
-#include "caosdb/acm/role.h"                  // for Role
 #include "caosdb/acm/user.h"                  // for User
 #include "caosdb/acm/v1alpha1/main.grpc.pb.h" // for AccessControlMan...
 #endif
@@ -44,11 +43,9 @@
 #include <map>                             // for map
 #include <memory>                          // for shared_ptr, unique_ptr
 #include <string>                          // for string, basic_string
-#include <vector>                          // for vector
 
 namespace caosdb::connection {
 #ifdef BUILD_ACM
-using caosdb::acm::Role;
 using caosdb::acm::User;
 using caosdb::acm::v1alpha1::AccessControlManagementService;
 #endif
@@ -106,17 +103,6 @@ public:
   [[nodiscard]] auto CreateTransaction() const -> std::unique_ptr<Transaction>;
 
 #ifdef BUILD_ACM
-  /**
-   * List all known roles.
-   */
-  [[nodiscard]] auto ListRoles() const -> std::vector<Role>;
-
-  [[nodiscard]] auto RetrieveSingleRole(const std::string &name) const -> Role;
-
-  auto CreateSingleRole(const Role &role) const -> void;
-
-  auto DeleteSingleRole(const std::string &name) const -> void;
-
   /**
    * Retrieve a single user.
    */
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f2917635ea619755e50bd2291b436d66820e226f..f64bc7671cbe142390ca5439916dfbddd3660294 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -41,9 +41,6 @@ set(libcaosdb_SRC
 
 IF(BUILD_ACM)
     list(APPEND libcaosdb_SRC
-         ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/permission_rule.cpp
-         ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/role.cpp
-         ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/role_impl.h
          ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/user.cpp
          ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/user_impl.h
          )
diff --git a/src/caosdb/acm/permission_rule.cpp b/src/caosdb/acm/permission_rule.cpp
deleted file mode 100644
index bc4cb2f09478051165002d26abb60c23683dc1b3..0000000000000000000000000000000000000000
--- a/src/caosdb/acm/permission_rule.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * This file is a part of the CaosDB Project.
- *
- * Copyright (C) 2022 Timm Fitschen <t.fitschen@indiscale.com>
- * Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-#include "caosdb/acm/permission_rule.h"
-#include "caosdb/acm/permission_rule_impl.h" // for PermissionRuleImpl
-#include "caosdb/acm/v1alpha1/main.pb.h"     // for ListPermissionRulesRequest
-#include "caosdb/protobuf_helper.h"          // for ProtoMessageWrapper
-#include <type_traits>                       // for remove_reference<>::type
-#include <utility>                           // for move
-
-namespace caosdb::acm {
-using caosdb::utility::ScalarProtoMessageWrapper;
-using ProtoPermissionRule = caosdb::acm::v1alpha1::PermissionRule;
-
-PermissionRuleImpl::PermissionRuleImpl() = default;
-
-PermissionRuleImpl::PermissionRuleImpl(ProtoPermissionRule *rule)
-  : ScalarProtoMessageWrapper<ProtoPermissionRule>(rule) {}
-
-PermissionRuleImpl::PermissionRuleImpl(std::string permission, bool isGrant, bool isPriority) {
-  this->wrapped->set_permission(std::move(permission));
-  this->wrapped->set_grant(isGrant);
-  this->wrapped->set_priority(isPriority);
-}
-
-PermissionRule::PermissionRule(std::string permission, bool isGrant, bool isPriority)
-  : impl(new PermissionRuleImpl(std::move(permission), isGrant, isPriority)) {}
-
-PermissionRule::PermissionRule(const PermissionRule &rule) : impl(new PermissionRuleImpl()) {
-  this->impl->wrapped->CopyFrom(*(rule.impl->wrapped));
-}
-
-auto PermissionRule::operator=(const PermissionRule &rule) -> PermissionRule & {
-  if (this == &rule) {
-    return *this;
-  }
-  this->impl->wrapped->CopyFrom(*(rule.impl->wrapped));
-
-  return *this;
-}
-
-PermissionRule::~PermissionRule() { delete this->impl; }
-
-auto PermissionRule::ToString() const -> std::string { return this->impl->ToString(); }
-
-[[nodiscard]] auto PermissionRule::IsGrant() const -> bool { return this->impl->wrapped->grant(); }
-
-auto PermissionRule::SetGrant(bool isGrant) -> void { this->impl->wrapped->set_grant(isGrant); }
-
-[[nodiscard]] auto PermissionRule::IsPriority() const -> bool {
-  return this->impl->wrapped->priority();
-}
-
-auto PermissionRule::SetPriority(bool isPriority) -> void {
-  this->impl->wrapped->set_priority(isPriority);
-}
-
-auto PermissionRule::operator==(const PermissionRule &other) const -> bool {
-  if (this == &other) {
-    return true;
-  }
-  return this->GetPermission() == other.GetPermission() &&
-         this->IsPriority() == other.IsPriority() && this->IsGrant() == other.IsGrant();
-}
-
-auto HashPermissionRule::operator()(const PermissionRule &rule) const -> size_t {
-  return std::hash<std::string>()(rule.GetPermission());
-}
-
-auto PermissionRule::GetPermission() const -> const std::string & {
-  return this->impl->wrapped->permission();
-}
-
-} // namespace caosdb::acm
diff --git a/src/caosdb/acm/permission_rule_impl.h b/src/caosdb/acm/permission_rule_impl.h
deleted file mode 100644
index b8e99f5efdce5c68081ec196ab2afbe67ad970a4..0000000000000000000000000000000000000000
--- a/src/caosdb/acm/permission_rule_impl.h
+++ /dev/null
@@ -1,51 +0,0 @@
-
-/*
- * This file is a part of the CaosDB Project.
- *
- * Copyright (C) 2022 Timm Fitschen <t.fitschen@indiscale.com>
- * Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-#ifndef CAOSDB_ACM_PERMISSION_RULE_IMPL_H
-#define CAOSDB_ACM_PERMISSION_RULE_IMPL_H
-
-#include "caosdb/acm/role.h"
-#include "caosdb/acm/v1alpha1/main.pb.h" // for ListRolesRequest
-#include "caosdb/protobuf_helper.h"      // for ProtoMessageWrapper
-#include <utility>                       // for move
-
-namespace caosdb::acm {
-using caosdb::utility::ScalarProtoMessageWrapper;
-using ProtoPermissionRule = caosdb::acm::v1alpha1::PermissionRule;
-
-/**
- * PermissionRuleImpl class is designed to hide the implementation which makes direct use
- * of the protobuf objects underneath from the clients of the caosdb library.
- */
-class PermissionRuleImpl : public ScalarProtoMessageWrapper<ProtoPermissionRule> {
-public:
-  /**
-   * Constructor. Instanciate a role from the server's responces.
-   */
-  PermissionRuleImpl(ProtoPermissionRule *rule);
-  PermissionRuleImpl();
-  PermissionRuleImpl(std::string permission, bool isGrant, bool isPriority);
-
-  friend class PermissionRule;
-};
-
-} // namespace caosdb::acm
-#endif
diff --git a/src/caosdb/acm/role.cpp b/src/caosdb/acm/role.cpp
deleted file mode 100644
index 23b919f6249feaa5066f28f85a52d0e937b69d90..0000000000000000000000000000000000000000
--- a/src/caosdb/acm/role.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * This file is a part of the CaosDB Project.
- *
- * Copyright (C) 2022 Timm Fitschen <t.fitschen@indiscale.com>
- * Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-#include "caosdb/acm/role.h"
-#include "caosdb/acm/permission_rule.h"  // for PermissionRule
-#include "caosdb/acm/role_impl.h"        // for RoleImpl
-#include "caosdb/acm/v1alpha1/main.pb.h" // for ListRolesRequest
-#include "caosdb/protobuf_helper.h"      // for ProtoMessageWrapper
-#include <unordered_set>                 // for _Node_iterator, operator!=
-#include <utility>                       // for move
-// IWYU pragma: no_include "net/proto2/public/repeated_field.h"
-
-namespace caosdb::acm {
-using caosdb::utility::ScalarProtoMessageWrapper;
-using ProtoRole = caosdb::acm::v1alpha1::Role;
-using ProtoRolePermissions = caosdb::acm::v1alpha1::RolePermissions;
-using ProtoRoleCapabilities = caosdb::acm::v1alpha1::RoleCapabilities;
-using ProtoListRoleItem = caosdb::acm::v1alpha1::ListRoleItem;
-
-RoleImpl::RoleImpl(const std::string &name, const std::string &description) {
-  if (!name.empty()) {
-    this->wrapped->set_name(name);
-  }
-  if (!description.empty()) {
-    this->wrapped->set_description(description);
-  }
-}
-
-RoleImpl::RoleImpl(ProtoRole *role) : ScalarProtoMessageWrapper<ProtoRole>(role) {}
-
-RoleImpl::RoleImpl(ProtoListRoleItem &role_item)
-  : ScalarProtoMessageWrapper<ProtoRole>(role_item.release_role()) {}
-
-RoleImpl::RoleImpl(const std::string &name) : RoleImpl(name, "") {}
-
-[[nodiscard]] auto RoleImpl::GeneratePermissionRulesSet() -> std::unique_ptr<PermissionRules> {
-  auto result = std::make_unique<PermissionRules>();
-  for (auto const &rule : this->wrapped->permission_rules()) {
-    result->emplace(rule.permission(), rule.grant(), rule.priority());
-  }
-  return result;
-}
-
-Role::Role(std::unique_ptr<RoleImpl> wrapped) : wrapped(std::move(wrapped)) {}
-
-Role::Role(const std::string &name, const std::string &description)
-  : wrapped(std::make_unique<RoleImpl>(name, description)) {}
-
-Role::Role(const std::string &name) : Role(name, {""}) {}
-
-Role::Role(const Role &role) : Role(role.GetName(), role.GetDescription()) {}
-
-auto Role::operator=(const Role &role) -> Role & {
-  if (this == &role) {
-    return *this;
-  }
-  this->wrapped->wrapped->CopyFrom(*(role.wrapped->wrapped));
-
-  return *this;
-}
-
-Role::~Role() = default;
-
-auto Role::GetName() const -> const std::string & { return this->wrapped->wrapped->name(); }
-
-auto Role::SetName(const std::string &name) -> void {
-  if (!name.empty()) {
-    this->wrapped->wrapped->set_name(name);
-  } else {
-    this->wrapped->wrapped->clear_name();
-  }
-}
-
-auto Role::GetDescription() const -> const std::string & {
-  return this->wrapped->wrapped->description();
-}
-
-auto Role::SetDescription(const std::string &description) -> void {
-  if (!description.empty()) {
-    this->wrapped->wrapped->set_description(description);
-  } else {
-    this->wrapped->wrapped->clear_description();
-  }
-}
-
-auto Role::ToString() const -> std::string { return this->wrapped->ToString(); }
-
-[[nodiscard]] auto Role::GetPermissionRules() const -> const PermissionRules & {
-  if (this->wrapped->rules == nullptr) {
-    this->wrapped->rules = this->wrapped->GeneratePermissionRulesSet();
-  }
-  return *(this->wrapped->rules);
-}
-
-auto Role::Grant(const std::string &permission, bool isPriority) -> void {
-  this->AddPermissionRule(permission, true, isPriority);
-}
-
-auto Role::RevokeGrant(const std::string &permission, bool isPriority) -> void {
-  this->RemovePermissionRule(permission, true, isPriority);
-}
-
-auto Role::Deny(const std::string &permission, bool isPriority) -> void {
-  this->AddPermissionRule(permission, false, isPriority);
-}
-
-auto Role::RevokeDenial(const std::string &permission, bool isPriority) -> void {
-  this->RemovePermissionRule(permission, false, isPriority);
-}
-
-auto Role::AddPermissionRule(const std::string &permission, bool isGrant, bool isPriority) -> void {
-  this->RemovePermissionRule(permission, isGrant, isPriority);
-  auto *new_rule = this->wrapped->wrapped->add_permission_rules();
-  new_rule->set_permission(permission);
-  new_rule->set_priority(isPriority);
-  new_rule->set_grant(isGrant);
-}
-
-auto Role::RemovePermissionRule(const std::string &permission, bool isGrant, bool isPriority)
-  -> void {
-  this->wrapped->rules.reset();
-  auto rule = this->wrapped->wrapped->mutable_permission_rules()->begin();
-  while (rule != this->wrapped->wrapped->mutable_permission_rules()->end()) {
-    if (rule->grant() == isGrant && rule->priority() == isPriority &&
-        rule->permission() == permission) {
-      this->wrapped->wrapped->mutable_permission_rules()->erase(rule);
-      rule = this->wrapped->wrapped->mutable_permission_rules()->begin();
-    } else {
-      rule++;
-    }
-  }
-}
-
-auto Role::ClearPermissionRules() -> void {
-  this->wrapped->rules.reset();
-  this->wrapped->wrapped->clear_permission_rules();
-}
-
-} // namespace caosdb::acm
diff --git a/src/caosdb/acm/role_impl.h b/src/caosdb/acm/role_impl.h
deleted file mode 100644
index 090de2255599c1cba2463e860a94e75cb54e5875..0000000000000000000000000000000000000000
--- a/src/caosdb/acm/role_impl.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * This file is a part of the CaosDB Project.
- *
- * Copyright (C) 2022 Timm Fitschen <t.fitschen@indiscale.com>
- * Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-#include "caosdb/acm/role.h"
-#include "caosdb/acm/v1alpha1/main.pb.h" // for ListRolesRequest
-#include "caosdb/protobuf_helper.h"      // for ProtoMessageWrapper
-#include <memory>                        // for unique_ptr
-#include <utility>                       // for move
-
-namespace caosdb::acm {
-using caosdb::utility::ScalarProtoMessageWrapper;
-using ProtoRole = caosdb::acm::v1alpha1::Role;
-using ProtoRolePermissions = caosdb::acm::v1alpha1::RolePermissions;
-using ProtoRoleCapabilities = caosdb::acm::v1alpha1::RoleCapabilities;
-using ProtoListRoleItem = caosdb::acm::v1alpha1::ListRoleItem;
-
-/**
- * RoleImpl class is designed to hide the implementation which makes direct use
- * of the protobuf objects underneath from the clients of the caosdb library.
- */
-class RoleImpl : public ScalarProtoMessageWrapper<ProtoRole> {
-public:
-  /**
-   * Constructor. Instanciate a role with the given name.
-   */
-  explicit RoleImpl(const std::string &name);
-  /**
-   * Constructor. Instanciate a role with the given name and description.
-   */
-  RoleImpl(const std::string &name, const std::string &description);
-  /**
-   * Constructor. Instanciate a role from the server's responces.
-   */
-  RoleImpl(ProtoRole *role);
-
-  /**
-   * Constructor. Instanciate a role from a listRoles RPC.
-   */
-  RoleImpl(ProtoListRoleItem &role);
-
-  friend class Role;
-  friend class caosdb::connection::Connection;
-
-private:
-  std::unique_ptr<PermissionRules> rules;
-  [[nodiscard]] auto GeneratePermissionRulesSet() -> std::unique_ptr<PermissionRules>;
-};
-
-} // namespace caosdb::acm
diff --git a/src/caosdb/connection.cpp b/src/caosdb/connection.cpp
index b81eff3017ab53c1c13c3245f54a64a14ef6d843..abc87dacb054a570540eff7e896eb1058b7b267b 100644
--- a/src/caosdb/connection.cpp
+++ b/src/caosdb/connection.cpp
@@ -21,10 +21,9 @@
  */
 #include "caosdb/connection.h"
 #ifdef BUILD_ACM
-#include "caosdb/acm/role_impl.h"             // for RoleImpl
 #include "caosdb/acm/user_impl.h"             // for UserImpl
 #include "caosdb/acm/v1alpha1/main.grpc.pb.h" // for AccessControlMan...
-#include "caosdb/acm/v1alpha1/main.pb.h"      // for ListRolesRequest
+#include "caosdb/acm/v1alpha1/main.pb.h"      // for CreateSingleUser...
 #endif
 #include "caosdb/configuration.h"            // for ConnectionConfigur...
 #include "caosdb/exceptions.h"               // for ConfigurationError
@@ -42,21 +41,12 @@
 
 namespace caosdb::connection {
 #ifdef BUILD_ACM
-using caosdb::acm::RoleImpl;
 using caosdb::acm::UserImpl;
 using caosdb::acm::v1alpha1::AccessControlManagementService;
-using caosdb::acm::v1alpha1::CreateSingleRoleRequest;
-using caosdb::acm::v1alpha1::CreateSingleRoleResponse;
 using caosdb::acm::v1alpha1::CreateSingleUserRequest;
 using caosdb::acm::v1alpha1::CreateSingleUserResponse;
-using caosdb::acm::v1alpha1::DeleteSingleRoleRequest;
-using caosdb::acm::v1alpha1::DeleteSingleRoleResponse;
 using caosdb::acm::v1alpha1::DeleteSingleUserRequest;
 using caosdb::acm::v1alpha1::DeleteSingleUserResponse;
-using caosdb::acm::v1alpha1::ListRolesRequest;
-using caosdb::acm::v1alpha1::ListRolesResponse;
-using caosdb::acm::v1alpha1::RetrieveSingleRoleRequest;
-using caosdb::acm::v1alpha1::RetrieveSingleRoleResponse;
 using caosdb::acm::v1alpha1::RetrieveSingleUserRequest;
 using caosdb::acm::v1alpha1::RetrieveSingleUserResponse;
 #endif
@@ -128,87 +118,6 @@ auto Connection::RetrieveVersionInfo() const -> const VersionInfo & {
 }
 
 #ifdef BUILD_ACM
-[[nodiscard]] auto Connection::RetrieveSingleRole(const std::string &name) const -> Role {
-  RetrieveSingleRoleRequest request;
-  request.set_name(name);
-  RetrieveSingleRoleResponse response;
-  grpc::ClientContext context;
-  const grpc::Status grpc_status =
-    this->access_controll_management_service->RetrieveSingleRole(&context, request, &response);
-
-  auto status = TransactionStatus::SUCCESS();
-  if (!grpc_status.ok()) {
-    switch (grpc_status.error_code()) {
-    case grpc::StatusCode::UNAUTHENTICATED:
-      status = TransactionStatus::AUTHENTICATION_ERROR(grpc_status.error_message());
-      break;
-    case grpc::StatusCode::UNAVAILABLE:
-      status = TransactionStatus::CONNECTION_ERROR();
-      break;
-    default:
-      auto error_message = grpc_status.error_message();
-      status = TransactionStatus::RPC_ERROR(std::to_string(grpc_status.error_code()) + " - " +
-                                            error_message);
-    }
-  }
-  status.ThrowExceptionIfError();
-  auto *role = response.release_role();
-  return Role(std::make_unique<RoleImpl>(role));
-}
-
-auto Connection::DeleteSingleRole(const std::string &name) const -> void {
-  DeleteSingleRoleRequest request;
-  request.set_name(name);
-  DeleteSingleRoleResponse response;
-  grpc::ClientContext context;
-  const grpc::Status grpc_status =
-    this->access_controll_management_service->DeleteSingleRole(&context, request, &response);
-
-  auto status = TransactionStatus::SUCCESS();
-  std::vector<Role> result;
-  if (!grpc_status.ok()) {
-    switch (grpc_status.error_code()) {
-    case grpc::StatusCode::UNAUTHENTICATED:
-      status = TransactionStatus::AUTHENTICATION_ERROR(grpc_status.error_message());
-      break;
-    case grpc::StatusCode::UNAVAILABLE:
-      status = TransactionStatus::CONNECTION_ERROR();
-      break;
-    default:
-      auto error_message = grpc_status.error_message();
-      status = TransactionStatus::RPC_ERROR(std::to_string(grpc_status.error_code()) + " - " +
-                                            error_message);
-    }
-  }
-  status.ThrowExceptionIfError();
-}
-
-auto Connection::CreateSingleRole(const Role &role) const -> void {
-  CreateSingleRoleRequest request;
-  request.set_allocated_role(role.wrapped->wrapped);
-  CreateSingleRoleResponse response;
-  grpc::ClientContext context;
-  const grpc::Status grpc_status =
-    this->access_controll_management_service->CreateSingleRole(&context, request, &response);
-
-  auto status = TransactionStatus::SUCCESS();
-  if (!grpc_status.ok()) {
-    switch (grpc_status.error_code()) {
-    case grpc::StatusCode::UNAUTHENTICATED:
-      status = TransactionStatus::AUTHENTICATION_ERROR(grpc_status.error_message());
-      break;
-    case grpc::StatusCode::UNAVAILABLE:
-      status = TransactionStatus::CONNECTION_ERROR();
-      break;
-    default:
-      auto error_message = grpc_status.error_message();
-      status = TransactionStatus::RPC_ERROR(std::to_string(grpc_status.error_code()) + " - " +
-                                            error_message);
-    }
-  }
-  status.ThrowExceptionIfError();
-}
-
 // TODO(tf) find a way to deal with this:
 // NOLINTNEXTLINE(bugprone-easily-swappable-parameters)
 [[nodiscard]] auto Connection::RetrieveSingleUser(const std::string &realm,
@@ -280,33 +189,6 @@ auto Connection::CreateSingleUser(const User &user) const -> void {
     this->access_controll_management_service->CreateSingleUser(&context, request, &response);
 
   auto status = TransactionStatus::SUCCESS();
-  std::vector<Role> result;
-  if (!grpc_status.ok()) {
-    switch (grpc_status.error_code()) {
-    case grpc::StatusCode::UNAUTHENTICATED:
-      status = TransactionStatus::AUTHENTICATION_ERROR(grpc_status.error_message());
-      break;
-    case grpc::StatusCode::UNAVAILABLE:
-      status = TransactionStatus::CONNECTION_ERROR();
-      break;
-    default:
-      auto error_message = grpc_status.error_message();
-      status = TransactionStatus::RPC_ERROR(std::to_string(grpc_status.error_code()) + " - " +
-                                            error_message);
-    }
-  }
-  status.ThrowExceptionIfError();
-}
-
-[[nodiscard]] auto Connection::ListRoles() const -> std::vector<Role> {
-  const ListRolesRequest request;
-  ListRolesResponse response;
-  grpc::ClientContext context;
-  const grpc::Status grpc_status =
-    this->access_controll_management_service->ListRoles(&context, request, &response);
-
-  auto status = TransactionStatus::SUCCESS();
-  std::vector<Role> result;
   if (!grpc_status.ok()) {
     switch (grpc_status.error_code()) {
     case grpc::StatusCode::UNAUTHENTICATED:
@@ -322,14 +204,7 @@ auto Connection::CreateSingleUser(const User &user) const -> void {
     }
   }
   status.ThrowExceptionIfError();
-
-  auto *roles = response.mutable_roles();
-  for (auto &role_item : *roles) {
-    result.emplace_back(std::make_unique<RoleImpl>(role_item));
-  }
-  return result;
 }
-
 #endif
 
 auto ConnectionManager::mHasConnection(const std::string &name) const -> bool {
diff --git a/src/cxxcaosdbcli.cpp b/src/cxxcaosdbcli.cpp
index 8047050bc2480344db39cf5961228a221562542a..e6e5cee66e6c90ab7719434d7667cd6ad20ccbb8 100644
--- a/src/cxxcaosdbcli.cpp
+++ b/src/cxxcaosdbcli.cpp
@@ -21,9 +21,6 @@
  */
 
 // A simple caosdb client
-#ifdef BUILD_ACM
-#include "caosdb/acm/role.h" // for Role
-#endif
 #include "caosdb/connection.h"         // for Connection, ConnectionManager
 #include "caosdb/constants.h"          // for LIBCAOSDB_VERSION_MINOR, LIBCAOSDB_V...
 #include "caosdb/entity.h"             // for Entity
@@ -32,153 +29,59 @@
 #include "caosdb/logging.h"            // for CAOSDB_LOG_TRACE
 #include "caosdb/transaction.h"        // for Transaction, ResultSet
 #include "caosdb/transaction_status.h" // for TransactionSt...
-#include <boost/program_options.hpp>   // for options_description
-#include <exception>                   // for exception
-#include <iostream>                    // for operator<<, basic_ostream, basic_ost...
-#include <memory>                      // for unique_ptr, allocator, __shared_ptr_...
-#include <string>                      // for operator<<, char_traits
-#include <vector>                      // for vector
-const auto logger_name = "libcaosdb";
-
-using boost::program_options::bool_switch;
-using boost::program_options::command_line_parser;
-using boost::program_options::notify;
-using boost::program_options::options_description;
-using boost::program_options::store;
-using boost::program_options::value;
-using boost::program_options::variables_map;
-#ifdef BUILD_ACM
-using caosdb::acm::Role;
-#endif
+#include <boost/log/core/record.hpp>   // for record
+#include <boost/log/detail/attachable_sstream_buf.hpp> // for basic_ostring...
+#include <boost/log/sources/record_ostream.hpp>        // for operator<<
+#include <boost/preprocessor/seq/limits/enum_256.hpp>  // for BOOST_PP_SEQ_...
+#include <boost/preprocessor/seq/limits/size_256.hpp>  // for BOOST_PP_SEQ_...
+#include <exception>                                   // for exception
+#include <iostream> // for operator<<, basic_ostream, basic_ost...
+#include <memory>   // for unique_ptr, allocator, __shared_ptr_...
+#include <string>   // for operator<<, char_traits
 
-auto print_version(bool print) -> void {
-  if (print) {
-    std::cout << "CaosDB C++ client (libcaosdb " << caosdb::LIBCAOSDB_VERSION_MAJOR << "."
-              << caosdb::LIBCAOSDB_VERSION_MINOR << "." << caosdb::LIBCAOSDB_VERSION_PATCH << ")\n"
-              << "We don't miss the H of caos.\n"
-              << std::endl;
-  }
-}
+const auto logger_name = "libcaosdb";
 
-auto test_connection() -> void {
-  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+auto main() -> int {
 
-  connection->RetrieveVersionInfoNoExceptions();
-  // get version info of the server
-  const auto &v_info = connection->GetVersionInfo();
-  std::cout << "Server Version: " << v_info->GetMajor() << "." << v_info->GetMinor() << "."
-            << v_info->GetPatch() << "-" << v_info->GetPreRelease() << "-" << v_info->GetBuild()
+  std::cout << "CaosDB C++ client (libcaosdb " << caosdb::LIBCAOSDB_VERSION_MINOR << "."
+            << caosdb::LIBCAOSDB_VERSION_MINOR << "." << caosdb::LIBCAOSDB_VERSION_PATCH << ")\n"
+            << "We don't miss the H of caos.\n"
             << std::endl;
-}
-
-auto retrieve_entity_by_id(const std::string &id) -> void {
-  std::cout << "Retrieve entity " << id << std::endl;
-  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
-  auto transaction(connection->CreateTransaction());
-  transaction->RetrieveById(id);
-  transaction->ExecuteAsynchronously();
-  auto t_stat = transaction->WaitForIt();
-  CAOSDB_LOG_INFO(logger_name) << "status: " << t_stat.GetCode() << " // "
-                               << t_stat.GetDescription();
-  const auto &result_set = transaction->GetResultSet();
-  for (const auto &entity : result_set) {
-    std::cout << entity.ToString() << std::endl;
-  }
-}
-
-auto execute_query(const std::string &query) -> void {
-  std::cout << "Execute query:\n" << query << std::endl;
-  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
-  auto q_transaction(connection->CreateTransaction());
-  q_transaction->Query(query);
-  q_transaction->ExecuteAsynchronously();
-  auto t_stat = q_transaction->WaitForIt();
-  CAOSDB_LOG_INFO(logger_name) << "status: " << t_stat.GetCode() << " // "
-                               << t_stat.GetDescription();
-  const auto &result_set_2 = q_transaction->GetResultSet();
-  for (const auto &entity : result_set_2) {
-    std::cout << entity.ToString() << std::endl;
-  }
-}
 
-#ifdef BUILD_ACM
-auto list_roles() -> void {
-  std::cout << "Known roles:" << std::endl;
-  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
-  auto roles = connection->ListRoles();
-  for (const auto &role : roles) {
-    std::cout << role.ToString() << std::endl;
-  }
-}
-
-auto retrieve_role(const std::string &name) {
-  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
-  auto role = connection->RetrieveSingleRole(name);
-  std::cout << role.ToString() << std::endl;
-}
-
-auto create_role(const std::string &name) {
-  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
-  Role role(name);
-  connection->CreateSingleRole(role);
-  std::cout << "OK" << std::endl;
-}
-
-auto delete_role(const std::string &name) {
-  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
-  connection->DeleteSingleRole(name);
-  std::cout << "OK" << std::endl;
-}
-#endif
-
-auto main(int argc, const char *argv[]) -> int {
   try {
-    command_line_parser parser(argc, argv);
-
-    options_description desc{"Options"};
-    desc.add_options()("help,h", "Show help.")("version,V", bool_switch()->notifier(print_version),
-                                               "Print version of libcaosdb.")(
-      "test-connection,t", "Test the connection to the caosdb server.")(
-      "retrieve", value<std::string>()->notifier(retrieve_entity_by_id),
-      "Retrieve an entity by id and print its JSON representation.")(
-      "execute-query", value<std::string>()->notifier(execute_query),
-      "Execute a query and print the results")
-#ifdef BUILD_ACM
-      ("list-roles", "List all known roles")(
-        "retrieve-role", value<std::string>()->notifier(retrieve_role), "Retrieve a role by name")(
-        "create-role", value<std::string>()->notifier(create_role), "Create a new role")(
-        "delete-role", value<std::string>()->notifier(delete_role), "Create a new role")
-#endif
-      ;
+    const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
 
-    parser.options(desc);
-
-    // TODO(tf) add positional parameters
-    // positional_options_description pos_desc;
-    // pos_desc.add("phone", 1);
-    // parser.positional(pos_desc);
+    connection->RetrieveVersionInfoNoExceptions();
+    // get version info of the server
+    const auto &v_info = connection->GetVersionInfo();
+    std::cout << "Server Version: " << v_info->GetMajor() << "." << v_info->GetMinor() << "."
+              << v_info->GetPatch() << "-" << v_info->GetPreRelease() << "-" << v_info->GetBuild()
+              << std::endl;
 
-    variables_map vm;
-    store(parser.run(), vm);
-    notify(vm);
+    // retrieve an entity
+    auto transaction(connection->CreateTransaction());
+    transaction->RetrieveById("21");
+    transaction->ExecuteAsynchronously();
+    auto t_stat = transaction->WaitForIt();
+    CAOSDB_LOG_INFO(logger_name) << "status: " << t_stat.GetCode() << " // "
+                                 << t_stat.GetDescription();
+    const auto &result_set = transaction->GetResultSet();
+    for (const auto &entity : result_set) {
+      std::cout << entity.ToString() << std::endl;
+    }
 
-    if (vm.count("help") != 0U) {
-      std::cout << desc << std::endl;
-    } else if (vm["version"].as<bool>()) {
-    } else if (vm.count("test-connection") != 0U) {
-      test_connection();
-#ifdef BUILD_ACM
-    } else if (vm.count("list-roles") != 0U) {
-      list_roles();
-    } else if (vm.count("retrieve-role") != 0U) {
-    } else if (vm.count("retrieve") != 0U) {
-    } else if (vm.count("create-role") != 0U) {
-    } else if (vm.count("delete-role") != 0U) {
-    } else if (vm.count("execute-query") != 0U) {
-#endif
-    } else {
-      print_version(true);
-      test_connection();
+    // execute a query
+    std::string query("FIND Property \"Prop *\"");
+    std::cout << "Trying to execute a query:\n" << query << std::endl;
+    auto q_transaction(connection->CreateTransaction());
+    q_transaction->Query(query);
+    q_transaction->ExecuteAsynchronously();
+    t_stat = q_transaction->WaitForIt();
+    CAOSDB_LOG_INFO(logger_name) << "status: " << t_stat.GetCode() << " // "
+                                 << t_stat.GetDescription();
+    const auto &result_set_2 = q_transaction->GetResultSet();
+    for (const auto &entity : result_set_2) {
+      std::cout << entity.ToString() << std::endl;
     }
 
     return 0;
@@ -189,7 +92,7 @@ auto main(int argc, const char *argv[]) -> int {
     std::cout << "Exception: " << exc.what() << std::endl;
     return 1;
   } catch (...) {
-    std::cout << "Unknown error." << std::endl;
+    std::cout << "Some other exception." << std::endl;
     return 2;
   }
 }
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index ab517063ccc31828d251e93c55ceafa0a2ed5e78..659254bf1e215c6c203eb82c0d2bca030a12a0b9 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -37,7 +37,6 @@ set(test_cases
 
 IF(BUILD_ACM)
     list(APPEND test_cases
-         test_role
          test_user
          )
 ENDIF()
diff --git a/test/test_connection.cpp b/test/test_connection.cpp
index 0426c35d675bc7ddfe20e7d0edeb069e6277f40e..9b8783a0ae88f6669de4e5ec4e5a43dea26447c5 100644
--- a/test/test_connection.cpp
+++ b/test/test_connection.cpp
@@ -117,13 +117,6 @@ TEST_F(test_connection, test_retrieve_single_user) {
                        "The attempt to execute this transaction was not successful because the "
                        "connection to the server could not be established.");
 }
-
-TEST_F(test_connection, test_list_roles) {
-  auto connection = ConnectionManager::GetDefaultConnection();
-  EXPECT_THROW_MESSAGE(auto results = connection->ListRoles(), caosdb::exceptions::ConnectionError,
-                       "The attempt to execute this transaction was not successful because the "
-                       "connection to the server could not be established.");
-}
 #endif
 
 } // namespace caosdb::connection
diff --git a/test/test_role.cpp b/test/test_role.cpp
deleted file mode 100644
index dc9a8b825e08a991eb220dd07b589a454cfddb03..0000000000000000000000000000000000000000
--- a/test/test_role.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * This file is a part of the CaosDB Project.
- *
- * Copyright (C) 2022 Timm Fitschen <t.fitschen@indiscale.com>
- * Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
-#include "caosdb/acm/role.h"            // for Role
-#include "caosdb/acm/permission_rule.h" // for PermissionRules, PermissionRule
-#include <gtest/gtest-message.h>        // for Message
-#include <gtest/gtest-test-part.h>      // for TestPartResult, SuiteApiRe...
-#include <gtest/gtest_pred_impl.h>      // for Test, EXPECT_EQ, TEST
-#include <string>                       // for allocator, string
-#include <unordered_set>                // for _Node_const_iterator, operat...
-
-namespace caosdb::acm {
-
-TEST(test_role, role_name) {
-  auto role = Role("role1");
-  EXPECT_EQ(role.GetName(), "role1");
-  role.SetName("role2");
-  EXPECT_EQ(role.GetName(), "role2");
-}
-
-TEST(test_role, role_description) {
-  auto role1 = Role("role1", "description1");
-  EXPECT_EQ(role1.GetName(), "role1");
-  EXPECT_EQ(role1.GetDescription(), "description1");
-  role1.SetName("role3");
-  EXPECT_EQ(role1.GetDescription(), "description1");
-
-  auto role2 = Role("role2", "description1");
-  EXPECT_EQ(role2.GetDescription(), "description1");
-  EXPECT_EQ(role2.GetName(), "role2");
-  role2.SetDescription("description2");
-  EXPECT_EQ(role2.GetDescription(), "description2");
-  EXPECT_EQ(role2.GetName(), "role2");
-}
-
-TEST(test_role, grant_revoke) {
-  auto role1 = Role("role1", "description1");
-  EXPECT_TRUE(role1.GetPermissionRules().empty());
-  EXPECT_EQ(role1.ToString(), "{\n \"name\": \"role1\",\n \"description\": \"description1\"\n}\n");
-
-  role1.Grant("SOME_PERMISSION", false);
-  EXPECT_FALSE(role1.GetPermissionRules().empty());
-
-  EXPECT_EQ(role1.ToString(),
-            "{\n \"name\": \"role1\",\n \"description\": \"description1\",\n \"permissionRules\": "
-            "[\n  {\n   \"permission\": \"SOME_PERMISSION\",\n   \"grant\": true\n  }\n ]\n}\n");
-
-  role1.Grant("SOME_OTHER_PERMISSION", true);
-  EXPECT_EQ(role1.GetPermissionRules().size(), 2);
-
-  role1.Grant("SOME_OTHER_PERMISSION", true);
-  // is a set
-  EXPECT_EQ(role1.GetPermissionRules().size(), 2);
-
-  role1.RevokeGrant("SOME_PERMISSION", false);
-  EXPECT_FALSE(role1.GetPermissionRules().empty());
-  role1.RevokeGrant("NOT_EXISTING_PERMISSION", true);
-
-  // is immutable
-  for (const auto &rule : role1.GetPermissionRules()) {
-    EXPECT_EQ(rule.GetPermission(), "SOME_OTHER_PERMISSION");
-  }
-
-  role1.RevokeGrant("SOME_OTHER_PERMISSION", true);
-  EXPECT_TRUE(role1.GetPermissionRules().empty());
-
-  EXPECT_EQ(role1.ToString(), "{\n \"name\": \"role1\",\n \"description\": \"description1\"\n}\n");
-}
-
-TEST(test_role, deny_revoke) {
-  auto role1 = Role("role1", "description1");
-  EXPECT_TRUE(role1.GetPermissionRules().empty());
-  EXPECT_EQ(role1.ToString(), "{\n \"name\": \"role1\",\n \"description\": \"description1\"\n}\n");
-
-  role1.Deny("SOME_PERMISSION", false);
-  EXPECT_FALSE(role1.GetPermissionRules().empty());
-
-  EXPECT_EQ(role1.ToString(),
-            "{\n \"name\": \"role1\",\n \"description\": \"description1\",\n \"permissionRules\": "
-            "[\n  {\n   \"permission\": \"SOME_PERMISSION\"\n  }\n ]\n}\n");
-
-  role1.Deny("SOME_OTHER_PERMISSION", true);
-  EXPECT_EQ(role1.GetPermissionRules().size(), 2);
-
-  role1.Deny("SOME_OTHER_PERMISSION", true);
-  // is a set
-  EXPECT_EQ(role1.GetPermissionRules().size(), 2);
-
-  role1.RevokeDenial("SOME_PERMISSION", false);
-  EXPECT_FALSE(role1.GetPermissionRules().empty());
-  role1.RevokeDenial("NOT_EXISTING_PERMISSION", true);
-
-  // is immutable
-  for (const auto &rule : role1.GetPermissionRules()) {
-    EXPECT_EQ(rule.GetPermission(), "SOME_OTHER_PERMISSION");
-  }
-
-  role1.ClearPermissionRules();
-  EXPECT_TRUE(role1.GetPermissionRules().empty());
-
-  EXPECT_EQ(role1.ToString(), "{\n \"name\": \"role1\",\n \"description\": \"description1\"\n}\n");
-}
-
-TEST(test_role, permission_rule) {
-  auto rule = PermissionRule("SOME_PERMISSION", true, false);
-  EXPECT_EQ(rule.GetPermission(), "SOME_PERMISSION");
-  EXPECT_TRUE(rule.IsGrant());
-  EXPECT_FALSE(rule.IsPriority());
-  EXPECT_EQ(rule.ToString(), "{\n \"permission\": \"SOME_PERMISSION\",\n \"grant\": true\n}\n");
-}
-
-} // namespace caosdb::acm