diff --git a/CMakeLists.txt b/CMakeLists.txt
index d9aff70d73c8ee56b12475c4d131dbe69a655c9d..70cae6f2b55e414a4dc0ae867d715a4eaef740fc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -46,6 +46,11 @@ IF (WIN32)
     set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
 ENDIF()
 
+IF (BUILD_ACM)
+    message(STATUS "BUILD_ACM")
+    add_compile_definitions("BUILD_ACM")
+ENDIF()
+
 ###########################################
 ### DEPENDENCY MANAGEMENT with CONAN
 ###########################################
@@ -81,9 +86,14 @@ add_subdirectory(doc)
 set(PROTO_FILES
     ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/info/v1/main.proto
     ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/entity/v1/main.proto
-    ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/acm/v1alpha1/main.proto
 )
 
+IF (BUILD_ACM)
+    list(APPEND PROTO_FILES
+         ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/acm/v1alpha1/main.proto
+         )
+ENDIF()
+
 set(PROTO_PATH ${PROJECT_SOURCE_DIR}/proto/proto)
 
 # compiler binaries
@@ -233,12 +243,6 @@ target_link_libraries(cxxcaosdbcli
 ### LINTING with CLANG-TIDY and INCLUDE-WHAT-YOU-USE
 #######################################################
 
-###########################################
-### PARANOID COMPILER SETTINGS
-###########################################
-option(PARANOID_COMPILER_SETTINGS "Enable extra-paranoid compiler settings
-(which may even flag errors for code in the dependencies. These only apply in
-Debug BUILD_TYPE with SKIP_LINTING=Off or when LINTING=On." OFF)
 include(CheckCXXCompilerFlag)
 include(CheckCCompilerFlag)
 
diff --git a/conanfile.py b/conanfile.py
index c91038d2d9ab6e2f23c21696bd62d19c0421ca78..cda65824eb827c331d33ae1e57e8430b6ff972ee 100644
--- a/conanfile.py
+++ b/conanfile.py
@@ -10,8 +10,16 @@ class CaosdbConan(ConanFile):
     description = "C++ library for the CaosDB project"
     topics = ("data management", "caosdb")
     settings = "os", "compiler", "build_type", "arch"
-    options = {"shared": [True, False], "fPIC": [True, False]}
-    default_options = {"shared": False, "fPIC": True}
+    options = {
+        "shared": [True, False],
+        "fPIC": [True, False],
+        "build_acm": [True, False],
+    }
+    default_options = {
+        "shared": False,
+        "fPIC": True,
+        "build_acm": False,
+    }
     generators = "cmake"
     requires = [
         ("grpc/1.45.2"),
@@ -41,14 +49,12 @@ class CaosdbConan(ConanFile):
 
     def build(self):
         cmake = CMake(self)
+        if self.options.build_acm:
+            cmake.definitions["BUILD_ACM"] = "On"
+
         cmake.configure(source_folder="")
         cmake.build()
 
-        # Explicit way:
-        # self.run('cmake %s/hello %s'
-        #          % (self.source_folder, cmake.command_line))
-        # self.run("cmake --build . %s" % cmake.build_config)
-
     def package(self):
         self.copy("*.h", dst="include", src="include")
         self.copy("*.dll", dst="bin", keep_path=False)
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
index d060c096a5398f396cc3026f0c7e93874e5f7a4f..a913c6906d61b4a171fe9955c9c2f81e17f60433 100644
--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -20,8 +20,6 @@
 
 # add all header files to this list
 set(libcaosdb_INCL
-    ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/role.h
-    ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/user.h
     ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/authentication.h
     ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/certificate_provider.h
     ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/configuration.h
@@ -52,6 +50,14 @@ set(libcaosdb_INCL
     ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/file_transmission/file_error.h
     )
 
+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()
+
 # pass variable to parent scope
 set(libcaosdb_INCL ${libcaosdb_INCL} PARENT_SCOPE)
 
diff --git a/include/caosdb/acm/permission_rule.h b/include/caosdb/acm/permission_rule.h
index 00d8e2a6c0073d4e4dff18ce0db6a9c812348fbf..017a33039b1dee350855f399187c871e01b074e7 100644
--- a/include/caosdb/acm/permission_rule.h
+++ b/include/caosdb/acm/permission_rule.h
@@ -26,6 +26,7 @@
  * @author Timm Fitchen
  * @date 2022-02-11
  */
+#ifdef BUILD_ACM
 #ifndef CAOSDB_ACM_PERMISSION_RULE_H
 #define CAOSDB_ACM_PERMISSION_RULE_H
 
@@ -65,3 +66,4 @@ 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
index cf1a90bafe32f4eedd791fe5ae0832c7bf2c9a51..560449b12762206680d9445cbc7bbe6942d5b896 100644
--- a/include/caosdb/acm/role.h
+++ b/include/caosdb/acm/role.h
@@ -27,6 +27,7 @@
  * @author Timm Fitchen
  * @date 2022-02-11
  */
+#ifdef BUILD_ACM
 #ifndef CAOSDB_ACM_ROLES_H
 #define CAOSDB_ACM_ROLES_H
 
@@ -73,3 +74,4 @@ private:
 
 } // namespace caosdb::acm
 #endif
+#endif
diff --git a/include/caosdb/acm/user.h b/include/caosdb/acm/user.h
index 57794bc331c1290dfd73943bec1cc5bea56c5d90..2310bd2195186cf1237d59593b26369d01f2baa7 100644
--- a/include/caosdb/acm/user.h
+++ b/include/caosdb/acm/user.h
@@ -27,6 +27,7 @@
  * @author Timm Fitchen
  * @date 2022-06-29
  */
+#ifdef BUILD_ACM
 #ifndef CAOSDB_ACM_USER_H
 #define CAOSDB_ACM_USER_H
 
@@ -68,3 +69,4 @@ private:
 
 } // namespace caosdb::acm
 #endif
+#endif
diff --git a/include/caosdb/connection.h b/include/caosdb/connection.h
index d065c01cad56c2f8e8a6b22063b1619ae4cdc5e0..fd0627bc3295b1fd01b8999466b273b91dd281d4 100644
--- a/include/caosdb/connection.h
+++ b/include/caosdb/connection.h
@@ -27,27 +27,31 @@
  * @date 2021-05-18
  * @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...
-#include "caosdb/authentication.h"            // for Authenticator
-#include "caosdb/configuration.h"             // for ConnectionConfigura...
-#include "caosdb/entity/v1/main.grpc.pb.h"    // for EntityTransactionSe...
-#include "caosdb/info.h"                      // for VersionInfo
-#include "caosdb/info/v1/main.grpc.pb.h"      // for GeneralInfoService:...
-#include "caosdb/transaction.h"               // for Transaction
-#include "caosdb/transaction_status.h"        // for TransactionStatus
-#include <filesystem>                         // for path
-#include <grpcpp/channel.h>                   // for Channel
-#include <map>                                // for map
-#include <memory>                             // for shared_ptr, unique_ptr
-#include <string>                             // for string, basic_string
-#include <vector>                             // for vector
+#endif
+#include "caosdb/authentication.h"         // for Authenticator
+#include "caosdb/configuration.h"          // for ConnectionConfigura...
+#include "caosdb/entity/v1/main.grpc.pb.h" // for EntityTransactionSe...
+#include "caosdb/info.h"                   // for VersionInfo
+#include "caosdb/info/v1/main.grpc.pb.h"   // for GeneralInfoService:...
+#include "caosdb/transaction.h"            // for Transaction
+#include "caosdb/transaction_status.h"     // for TransactionStatus
+#include <filesystem>                      // for path
+#include <grpcpp/channel.h>                // for Channel
+#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
 using caosdb::authentication::Authenticator;
 using caosdb::configuration::ConnectionConfiguration;
 using caosdb::entity::v1::EntityTransactionService;
@@ -101,6 +105,7 @@ public:
    */
   [[nodiscard]] auto CreateTransaction() const -> std::unique_ptr<Transaction>;
 
+#ifdef BUILD_ACM
   /**
    * List all known roles.
    */
@@ -130,6 +135,7 @@ public:
   // TODO(tf) find a way to deal with this:
   // NOLINTNEXTLINE(bugprone-easily-swappable-parameters)
   auto DeleteSingleUser(std::string realm, std::string name) const -> void;
+#endif
 
 private:
   /// GRPC-Channel (HTTP/2 Connection plus Authentication). We use a shared
@@ -147,10 +153,12 @@ private:
   /// Service for file transmission (download and upload). We use a shared
   /// pointer because Transaction instances also own this service stub.
   std::shared_ptr<FileTransmissionService::Stub> file_transmission_service;
+#ifdef BUILD_ACM
   /// Service for Access Controll Management (Role, Useraccounts, Permissions).
   /// We use a unique pointer because only this connection owns and uses this
   /// service.
   std::unique_ptr<AccessControlManagementService::Stub> access_controll_management_service;
+#endif
 };
 
 /**
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1de41ebb757b2444f94fe013f617d6461e4e4398..f2917635ea619755e50bd2291b436d66820e226f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -21,11 +21,6 @@
 
 # add all source files to this list
 set(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
     ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/authentication.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/entity.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/logging.cpp
@@ -44,5 +39,15 @@ set(libcaosdb_SRC
     ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/status_code_description.cpp
     )
 
+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
+         )
+ENDIF()
+
 # pass variable to parent scope
 set(libcaosdb_SRC ${libcaosdb_SRC}  PARENT_SCOPE)
diff --git a/src/caosdb/connection.cpp b/src/caosdb/connection.cpp
index 04ee57499d8d173d1c9b6bc4d33313111e37099e..25524b88f67f899a757419a7a74b1185898e78b6 100644
--- a/src/caosdb/connection.cpp
+++ b/src/caosdb/connection.cpp
@@ -20,25 +20,28 @@
  *
  */
 #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/configuration.h"             // for ConnectionConfigur...
-#include "caosdb/exceptions.h"                // for ConfigurationError
-#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/transaction.h"               // for Transaction
-#include "caosdb/transaction_status.h"        // for TransactionStatus
-#include <grpcpp/client_context.h>            // for ClientContext
-#include <grpcpp/create_channel.h>            // for CreateChannel
-#include <grpcpp/support/status.h>            // for Status
-#include <grpcpp/support/status_code_enum.h>  // for StatusCode, UNAUTHENTIC...
-#include <string>                             // for string, operator+
+#endif
+#include "caosdb/configuration.h"            // for ConnectionConfigur...
+#include "caosdb/exceptions.h"               // for ConfigurationError
+#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/transaction.h"              // for Transaction
+#include "caosdb/transaction_status.h"       // for TransactionStatus
+#include <grpcpp/client_context.h>           // for ClientContext
+#include <grpcpp/create_channel.h>           // for CreateChannel
+#include <grpcpp/support/status.h>           // for Status
+#include <grpcpp/support/status_code_enum.h> // for StatusCode, UNAUTHENTIC...
+#include <string>                            // for string, operator+
 // IWYU pragma: no_include "net/proto2/public/repeated_field.h"
 
 namespace caosdb::connection {
+#ifdef BUILD_ACM
 using caosdb::acm::RoleImpl;
 using caosdb::acm::UserImpl;
 using caosdb::acm::v1alpha1::AccessControlManagementService;
@@ -56,6 +59,7 @@ using caosdb::acm::v1alpha1::RetrieveSingleRoleRequest;
 using caosdb::acm::v1alpha1::RetrieveSingleRoleResponse;
 using caosdb::acm::v1alpha1::RetrieveSingleUserRequest;
 using caosdb::acm::v1alpha1::RetrieveSingleUserResponse;
+#endif
 using caosdb::configuration::ConfigurationManager;
 using caosdb::configuration::ConnectionConfiguration;
 using caosdb::entity::v1::EntityTransactionService;
@@ -75,8 +79,10 @@ Connection::Connection(const ConnectionConfiguration &configuration) {
   this->entity_transaction_service =
     std::make_shared<EntityTransactionService::Stub>(this->channel);
   this->file_transmission_service = std::make_shared<FileTransmissionService::Stub>(this->channel);
+#ifdef BUILD_ACM
   this->access_controll_management_service =
     std::make_unique<AccessControlManagementService::Stub>(this->channel);
+#endif
 }
 
 auto Connection::RetrieveVersionInfoNoExceptions() const noexcept -> TransactionStatus {
@@ -121,6 +127,7 @@ auto Connection::RetrieveVersionInfo() const -> const VersionInfo & {
   return std::make_unique<Transaction>(entity_service, file_service);
 }
 
+#ifdef BUILD_ACM
 [[nodiscard]] auto Connection::RetrieveSingleRole(std::string name) const -> Role {
   RetrieveSingleRoleRequest request;
   request.set_name(name);
@@ -323,6 +330,8 @@ auto Connection::CreateSingleUser(const User &user) const -> void {
   return result;
 }
 
+#endif
+
 auto ConnectionManager::mHasConnection(const std::string &name) const -> bool {
   auto it = connections.find(name);
   return it != connections.end();
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index beb5499ea2ba0e32a88c3da077bf822859b80e47..ab517063ccc31828d251e93c55ceafa0a2ed5e78 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -29,14 +29,19 @@ set(test_cases
     test_issues
     test_list_properties
     test_protobuf
-    test_role
     test_transaction
     test_utility
-    test_user
     test_value
     test_ccaosdb
     )
 
+IF(BUILD_ACM)
+    list(APPEND test_cases
+         test_role
+         test_user
+         )
+ENDIF()
+
 ###################################################
 ### Set up tests using GoogleTest (GTest)
 ###################################################
diff --git a/test/test_connection.cpp b/test/test_connection.cpp
index 57c4c294e6344bc240bf52514c840bc3aa7062e4..0426c35d675bc7ddfe20e7d0edeb069e6277f40e 100644
--- a/test/test_connection.cpp
+++ b/test/test_connection.cpp
@@ -19,7 +19,9 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  *
  */
-#include "caosdb/acm/user.h"             // for User
+#ifdef BUILD_ACM
+#include "caosdb/acm/user.h" // for User
+#endif
 #include "caosdb/certificate_provider.h" // for PemCertificateProvider
 #include "caosdb/configuration.h"        // for InsecureConnectionConfigura...
 #include "caosdb/connection.h"           // for ConnectionManager
@@ -32,7 +34,9 @@
 #include <string>                        // for operator+, string
 
 namespace caosdb::connection {
+#ifdef BUILD_ACM
 using caosdb::acm::User;
+#endif
 using caosdb::configuration::ConfigurationManager;
 using caosdb::configuration::InsecureConnectionConfiguration;
 using caosdb::configuration::PemCertificateProvider;
@@ -89,6 +93,7 @@ TEST_F(test_connection, connection_manager_get_connection) {
   EXPECT_TRUE(ConnectionManager::GetConnection("local-caosdb-admin"));
 }
 
+#ifdef BUILD_ACM
 TEST_F(test_connection, test_create_single_user) {
   auto connection = ConnectionManager::GetDefaultConnection();
   User user;
@@ -119,5 +124,6 @@ TEST_F(test_connection, test_list_roles) {
                        "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_package/CMakeLists.txt b/test_package/CMakeLists.txt
deleted file mode 100644
index 6e0db0446b0d4a2e1767f1ecdf2156ffb5dbb295..0000000000000000000000000000000000000000
--- a/test_package/CMakeLists.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-cmake_minimum_required(VERSION 3.1)
-project(PackageTest CXX)
-
-#######################################################################
-### append test cases here (file name without the ".cpp" suffix)
-#######################################################################
-set(test_cases
-    test_info
-    )
-
-###################################################
-### Set up tests using GoogleTest (GTest)
-###################################################
-
-# dependencies
-include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
-conan_basic_setup(KEEP_RPATHS)
-
-# supress warnings during build of gtest
-cmake_policy(SET CMP0054 NEW)
-enable_testing()
-
-# add special cmake functions for gtest
-include(GoogleTest REQUIRED)
-
-# loop over all test cases and add them to the test runner
-list(LENGTH test_cases len_test_cases)
-math(EXPR len_test_cases "${len_test_cases} - 1")
-foreach (i RANGE "${len_test_cases}")
-    list(GET test_cases ${i} test_case_name)
-    add_executable(${test_case_name} ${test_case_name}.cpp)
-    target_link_libraries(${test_case_name} PRIVATE ${CONAN_LIBS_CAOSDB}
-        ${CONAN_LIBS_GTEST} ${CONAN_LIBS_GRPC} ${CONAN_LIBS_ABSEIL}
-        ${CONAN_LIBS_OPENSSL} ${CONAN_LIBS_C-ARES} ${CONAN_LIBS_BZIP2}
-        ${CONAN_LIBS_PROTOBUF} ${CONAN_LIBS_ZLIB})
-    if("${CMAKE_BUILD_TYPE}" MATCHES "Debug")
-        target_link_libraries(${test_case_name} PRIVATE caosdb_grpc)
-    endif()
-    target_include_directories(${test_case_name} PUBLIC ${CONAN_INCLUDE_DIRS})
-    set_target_properties(${test_case_name}
-        PROPERTIES
-        CXX_CLANG_TIDY "${_CMAKE_CXX_CLANG_TIDY}"
-        CXX_INCLUDE_WHAT_YOU_USE "${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}")
-    gtest_discover_tests(${test_case_name}
-        PROPERTIES
-            LABELS "caosdb-cpplib-int-tests")
-endforeach ()
diff --git a/test_package/conanfile.py b/test_package/conanfile.py
deleted file mode 100644
index 541113405bfca3b1222de81124a13586fe4bbda5..0000000000000000000000000000000000000000
--- a/test_package/conanfile.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import os
-
-from conans import ConanFile, CMake, tools
-
-
-class LibcaosdbTestConan(ConanFile):
-    settings = "os", "compiler", "build_type", "arch"
-    generators = "cmake"
-    build_requires = [
-        ("gtest/1.11.0"),
-    ]
-
-    def build(self):
-        cmake = CMake(self)
-        # Current dir is "test_package/build/<build_id>" and CMakeLists.txt is
-        # in "test_package"
-        cmake.configure()
-        cmake.build()
-
-    def imports(self):
-        self.copy("*.dll", dst="bin", src="bin")
-        self.copy("*.dylib*", dst="bin", src="lib")
-        self.copy('*.so*', dst='bin', src='lib')
-
-    def test(self):
-        if not tools.cross_building(self):
-            cmake = CMake(self)
-            cmake.test()
diff --git a/test_package/test_info.cpp b/test_package/test_info.cpp
deleted file mode 120000
index e0e5ee2ff361ddf40cdf3f8d2cf2d03f89d49cbb..0000000000000000000000000000000000000000
--- a/test_package/test_info.cpp
+++ /dev/null
@@ -1 +0,0 @@
-../test/test_info.cpp
\ No newline at end of file