From 1879c121813033477a21713351c3fb42d098fbbe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Thu, 28 Sep 2023 08:57:18 +0200
Subject: [PATCH] MAINT: linkahead rename

---
 .gitlab-ci.yml                                |   8 +-
 CHANGELOG.md                                  |   2 +
 Makefile                                      |   4 +-
 README.md                                     |   2 +-
 README_SETUP.md                               |   3 +
 RELEASE_GUIDELINES.md                         |   2 +-
 create_slim_linkahead_wrapper.py              |  51 ++
 examples/pycaosdb_example.py                  |   2 +-
 examples/{pycaosdb.ini => pylinkahead.ini}    |   4 +-
 examples/server_side_script.py                |   2 +-
 examples/set_permissions.py                   |   4 +-
 setup.py                                      |  33 +-
 src/caosdb/__init__.py                        |  46 +-
 src/caosdb/apiutils.py                        |  31 +-
 src/caosdb/cached.py                          |   8 +-
 src/caosdb/common/__init__.py                 |   2 +-
 src/caosdb/common/administration.py           |  18 +-
 src/caosdb/common/datatype.py                 |   4 +-
 src/caosdb/common/models.py                   |  93 ++-
 src/caosdb/common/state.py                    |   2 +-
 src/caosdb/common/utils.py                    |   2 +-
 src/caosdb/common/versioning.py               |   4 +-
 src/caosdb/configuration.py                   |  46 +-
 .../connection/authentication/auth_token.py   |  10 +-
 .../external_credentials_provider.py          |   6 +-
 src/caosdb/connection/authentication/input.py |   2 +-
 .../connection/authentication/interface.py    |  18 +-
 .../connection/authentication/keyring.py      |   6 +-
 src/caosdb/connection/authentication/pass.py  |   6 +-
 src/caosdb/connection/authentication/plain.py |   2 +-
 .../authentication/unauthenticated.py         |   9 +-
 src/caosdb/connection/connection.py           |  82 ++-
 src/caosdb/connection/encode.py               |   2 +-
 src/caosdb/connection/interface.py            |   9 +-
 src/caosdb/connection/mockup.py               |   6 +-
 src/caosdb/connection/utils.py                |   2 +-
 src/caosdb/exceptions.py                      |  58 +-
 src/caosdb/high_level_api.py                  | 238 ++++---
 src/caosdb/schema-pycaosdb-ini.yml            |  10 +-
 src/caosdb/utils/caosdb_admin.py              | 658 +-----------------
 .../utils/checkFileSystemConsistency.py       |   7 +-
 src/caosdb/utils/create_revision.py           |   6 +-
 src/caosdb/utils/get_entity.py                |   2 +-
 src/caosdb/utils/linkahead_admin.py           | 657 +++++++++++++++++
 src/caosdb/utils/plantuml.py                  |  10 +-
 src/caosdb/utils/register_tests.py            |  26 +-
 src/caosdb/utils/server_side_scripting.py     |  10 +-
 src/caosdb/yamlapi.py                         |  26 +-
 src/doc/Makefile                              |   4 +-
 src/doc/administration.rst                    |  14 +-
 src/doc/concepts.rst                          |   6 +-
 src/doc/conf.py                               |  18 +-
 src/doc/configuration.md                      |  18 +-
 .../{future_caosdb.md => future_linkahead.md} |  26 +-
 src/doc/gallery/Makefile                      |   2 +-
 src/doc/gallery/curator-permissions.rst       |  20 +-
 src/doc/gallery/curator_permissions.py        |   6 +-
 src/doc/gallery/index.rst                     |   8 +-
 src/doc/gallery/simulation.py                 |  16 +-
 src/doc/gallery/simulation.rst                |   2 +-
 src/doc/high_level_api.org                    |  62 +-
 src/doc/high_level_api.rst                    |  59 +-
 src/doc/index.rst                             |   8 +-
 src/doc/tutorials/Data-Insertion.rst          |  22 +-
 src/doc/tutorials/Entity-Getters.rst          |   2 +-
 src/doc/tutorials/basic_analysis.rst          |   4 +-
 src/doc/tutorials/caching.rst                 |   6 +-
 src/doc/tutorials/complex_data_models.rst     |   4 +-
 src/doc/tutorials/data-model-interface.md     |   6 +-
 src/doc/tutorials/errors.rst                  |  28 +-
 src/doc/tutorials/first_steps.rst             |  16 +-
 src/doc/tutorials/index.rst                   |   4 +-
 src/doc/tutorials/serverside.rst              |  12 +-
 .../{pycaosdb1.ini => pylinkahead1.ini}       |   0
 .../{pycaosdb2.ini => pylinkahead2.ini}       |   0
 .../{pycaosdb3.ini => pylinkahead3.ini}       |   0
 .../{pycaosdb4.ini => pylinkahead4.ini}       |   0
 unittests/docker/Dockerfile                   |   5 +-
 unittests/test_acl.py                         |   4 +-
 unittests/test_add_property.py                |   4 +-
 unittests/test_administraction.py             |   6 +-
 unittests/test_apiutils.py                    |  20 +-
 unittests/test_authentication_auth_token.py   |  14 +-
 unittests/test_authentication_external.py     |   4 +-
 unittests/test_authentication_keyring.py      |   6 +-
 unittests/test_authentication_pass.py         |   6 +-
 unittests/test_authentication_plain.py        |   8 +-
 .../test_authentication_unauthenticated.py    |  14 +-
 unittests/test_cached.py                      |  22 +-
 unittests/test_concrete_property.py           |   8 +-
 .../pycaosdb-server-side-scripting.ini        |   9 -
 ...s.ini => pylinkahead-IntegrationTests.ini} |  12 +-
 ...caosdb-empty.ini => pylinkahead-empty.ini} |   0
 ...emo.ini => pylinkahead-indiscale-demo.ini} |   0
 ...rld-1.ini => pylinkahead-real-world-1.ini} |   4 +-
 ...rld-2.ini => pylinkahead-real-world-2.ini} |   2 +-
 .../pylinkahead-server-side-scripting.ini     |   9 +
 .../{pycaosdb1.ini => pylinkahead1.ini}       |   2 +-
 .../{pycaosdb2.ini => pylinkahead2.ini}       |   0
 .../{pycaosdb3.ini => pylinkahead3.ini}       |   0
 .../{pycaosdb4.ini => pylinkahead4.ini}       |   0
 .../{pycaosdb5.ini => pylinkahead5.ini}       |   0
 .../{pycaosdb6.ini => pylinkahead6.ini}       |   0
 unittests/test_configuration.py               |  26 +-
 unittests/test_connection.py                  |  34 +-
 unittests/test_connection_utils.py            |  20 +-
 unittests/test_container.py                   |   4 +-
 unittests/test_datatype.py                    |   8 +-
 unittests/test_entity.py                      |   8 +-
 unittests/test_error_handling.py              |  18 +-
 unittests/test_exception.py                   |  60 ++
 unittests/test_file.py                        |   6 +-
 unittests/test_high_level_api.py              | 127 ++--
 unittests/test_issues.py                      |   4 +-
 unittests/test_message.py                     |   8 +-
 unittests/test_plantuml.py                    |   6 +-
 unittests/test_property.py                    |   6 +-
 unittests/test_query.py                       |   4 +-
 unittests/test_record.py                      |   4 +-
 unittests/test_record_type.py                 |   6 +-
 unittests/test_schema.py                      |   4 +-
 unittests/test_server_side_scripting.py       |   8 +-
 unittests/test_state.py                       |   6 +-
 unittests/test_utils.py                       |   6 +-
 unittests/test_versioning.py                  |  12 +-
 unittests/test_yamlapi.py                     |   8 +-
 126 files changed, 1666 insertions(+), 1500 deletions(-)
 create mode 100644 create_slim_linkahead_wrapper.py
 rename examples/{pycaosdb.ini => pylinkahead.ini} (97%)
 mode change 100755 => 120000 src/caosdb/utils/caosdb_admin.py
 create mode 100755 src/caosdb/utils/linkahead_admin.py
 rename src/doc/{future_caosdb.md => future_linkahead.md} (87%)
 rename unittests/broken_configs/{pycaosdb1.ini => pylinkahead1.ini} (100%)
 rename unittests/broken_configs/{pycaosdb2.ini => pylinkahead2.ini} (100%)
 rename unittests/broken_configs/{pycaosdb3.ini => pylinkahead3.ini} (100%)
 rename unittests/broken_configs/{pycaosdb4.ini => pylinkahead4.ini} (100%)
 delete mode 100644 unittests/test_configs/pycaosdb-server-side-scripting.ini
 rename unittests/test_configs/{pycaosdb-IntegrationTests.ini => pylinkahead-IntegrationTests.ini} (70%)
 rename unittests/test_configs/{pycaosdb-empty.ini => pylinkahead-empty.ini} (100%)
 rename unittests/test_configs/{pycaosdb-indiscale-demo.ini => pylinkahead-indiscale-demo.ini} (100%)
 rename unittests/test_configs/{pycaosdb-real-world-1.ini => pylinkahead-real-world-1.ini} (77%)
 rename unittests/test_configs/{pycaosdb-real-world-2.ini => pylinkahead-real-world-2.ini} (89%)
 create mode 100644 unittests/test_configs/pylinkahead-server-side-scripting.ini
 rename unittests/test_configs/{pycaosdb1.ini => pylinkahead1.ini} (79%)
 rename unittests/test_configs/{pycaosdb2.ini => pylinkahead2.ini} (100%)
 rename unittests/test_configs/{pycaosdb3.ini => pylinkahead3.ini} (100%)
 rename unittests/test_configs/{pycaosdb4.ini => pylinkahead4.ini} (100%)
 rename unittests/test_configs/{pycaosdb5.ini => pylinkahead5.ini} (100%)
 rename unittests/test_configs/{pycaosdb6.ini => pylinkahead6.ini} (100%)
 create mode 100644 unittests/test_exception.py

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0430a4f6..dfe61ff4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,5 @@
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -44,7 +44,7 @@ code_style:
     - make style
   allow_failure: true
 
-# pylint tests for pycaosdb
+# pylint tests for pylinkahead
 pylint:
   tags: [ docker ]
   stage: linting
@@ -61,7 +61,7 @@ unittest_py3.7:
   image: python:3.7
   script: &python_test_script
     # Python docker has problems with tox and pip so use plain pytest here
-    - touch ~/.pycaosdb.ini
+    - touch ~/.pylinkahead.ini
     - pip install nose pytest pytest-cov python-dateutil jsonschema>=4.4.0
     - pip install .
     - python -m pytest unittests
@@ -82,7 +82,7 @@ unittest_py3.9:
   script:
     # verify that this actually is Python 3.9
     - python3 -c "import sys; assert sys.version.startswith('3.9')"
-    - touch ~/.pycaosdb.ini
+    - touch ~/.pylinkahead.ini
     - make unittest
 
 
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ebdfab4b..82b2454c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,6 +18,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 * `Message.__init__` signature changed and `type` defaults to "Info" now.
 * `Message.__eq__` changed. Equality is equality of `type`, `code`, and
   `description` now.
+* Rename from CaosDB to LinkAhead.  For proper migration, follow the instructions
+  in `migration_to_linkahead.md` and check the documentation at [docs.indiscale.com](https://docs.indiscale.com/caosdb-pylib/README_SETUP.html#migration).
 
 ### Deprecated ###
 
diff --git a/Makefile b/Makefile
index 0a0888ad..d15c830d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Daniel Hornung <d.hornung@indiscale.com>
@@ -40,7 +40,7 @@ style:
 .PHONY: style
 
 lint:
-	pylint --unsafe-load-any-extension=y -d all -e E,F src/caosdb/common
+	pylint --unsafe-load-any-extension=y -d all -e E,F src/linkahead/common
 .PHONY: lint
 
 unittest:
diff --git a/README.md b/README.md
index 7215591a..193cb8f0 100644
--- a/README.md
+++ b/README.md
@@ -41,7 +41,7 @@ the preferred way is also a merge request as describe above (the documentation r
 However, you can also create an issue for it. 
 * You can also contact us at **info (AT) caosdb.org** and join the
   CaosDB community on
-  [#caosdb:matrix.org](https://matrix.to/#/!unwwlTfOznjEnMMXxf:matrix.org).
+  [#linkahead:matrix.org](https://matrix.to/#/!unwwlTfOznjEnMMXxf:matrix.org).
 
 ## License
 
diff --git a/README_SETUP.md b/README_SETUP.md
index 01eea851..b05eff87 100644
--- a/README_SETUP.md
+++ b/README_SETUP.md
@@ -128,3 +128,6 @@ Build documentation in `build/` with `make doc`.
 
 ### Troubleshooting ###
 If the client is to be executed directly from the `/src` folder, an initial `.\setup.py install --user` must be called.
+
+## Migration ##
+TODO
diff --git a/RELEASE_GUIDELINES.md b/RELEASE_GUIDELINES.md
index 95ee8e31..b3025f00 100644
--- a/RELEASE_GUIDELINES.md
+++ b/RELEASE_GUIDELINES.md
@@ -1,7 +1,7 @@
 # Release Guidelines for the CaosDB Python Client Library
 
 This document specifies release guidelines in addition to the general release
-guidelines of the CaosDB Project
+guidelines of the LinkAhead Project
 ([RELEASE_GUIDELINES.md](https://gitlab.com/caosdb/caosdb/blob/dev/RELEASE_GUIDELINES.md))
 
 ## General Prerequisites
diff --git a/create_slim_linkahead_wrapper.py b/create_slim_linkahead_wrapper.py
new file mode 100644
index 00000000..bb2162ee
--- /dev/null
+++ b/create_slim_linkahead_wrapper.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+# encoding: utf-8
+#
+# ** header v3.0
+# This file is a part of the CaosDB Project.
+#
+# Copyright (C) 2021 Indiscale GmbH <info@indiscale.com>
+# Copyright (C) 2021 Henrik tom Wörden <h.tomwoerden@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/>.
+#
+# ** end header
+#
+import os
+base_root = "src/linkahead/"
+
+initcontent = """
+from {module} import *
+from warnings import warn
+
+warn(("CaosDB was renamed to LinkAhead. Please import this library as `import {module}`. Using the"
+      " old name, starting with caosdb, is deprecated."), DeprecationWarning)
+"""
+
+for root, dirs, files in os.walk(base_root, topdown=False):
+    if root.endswith("__pycache__"):
+        continue
+    cdir = os.path.join("src/caosdb", root[len(base_root):])
+    os.makedirs(cdir, exist_ok=True)
+    for fi in files:
+        if not fi.endswith(".py"):
+            continue
+        path = os.path.join(cdir, fi)
+        with open(path, 'w') as cur:
+            if fi == "__init__.py":
+                cur.write(initcontent.format(module=".".join(
+                    os.path.join(root, fi[:-3]).split('/')[1:-1])))
+            else:
+                cur.write(initcontent.format(module=".".join(
+                    os.path.join(root, fi[:-3]).split('/')[1:])))
diff --git a/examples/pycaosdb_example.py b/examples/pycaosdb_example.py
index c7eab4a6..9a3d7667 100755
--- a/examples/pycaosdb_example.py
+++ b/examples/pycaosdb_example.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 """A small example to get started with caosdb-pylib.
 
-Make sure that a `pycaosdb.ini` is readable at one of the expected locations.
+Make sure that a `pylinkahead.ini` is readable at one of the expected locations.
 """
 
 import random
diff --git a/examples/pycaosdb.ini b/examples/pylinkahead.ini
similarity index 97%
rename from examples/pycaosdb.ini
rename to examples/pylinkahead.ini
index 8cf74e43..f37e24e0 100644
--- a/examples/pycaosdb.ini
+++ b/examples/pylinkahead.ini
@@ -1,6 +1,6 @@
 # To be found be the caosdb package, the INI file must be located either in
-# - $CWD/pycaosdb.ini
-# - $HOME/.pycaosdb.ini
+# - $CWD/pylinkahead.ini
+# - $HOME/.pylinkahead.ini
 # - the location given in the env variable PYCAOSDBINI
 
 [Connection]
diff --git a/examples/server_side_script.py b/examples/server_side_script.py
index 71bd9c05..0c5013eb 100755
--- a/examples/server_side_script.py
+++ b/examples/server_side_script.py
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
diff --git a/examples/set_permissions.py b/examples/set_permissions.py
index 8162b11b..a558bde7 100755
--- a/examples/set_permissions.py
+++ b/examples/set_permissions.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (c) 2019 IndiScale GmbH
 # Copyright (c) 2019 Daniel Hornung <d.hornung@indiscale.com>
@@ -25,7 +25,7 @@
 
 As a result, only a specific user or group may access it.
 
-This script assumes that the user specified in the pycaosdb.ini
+This script assumes that the user specified in the pylinkahead.ini
 configuration can create new entities.
 
 """
diff --git a/setup.py b/setup.py
index 8fdf3b1c..f5bc6afc 100755
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@
 # -*- encoding: utf-8 -*-
 #
 #
-"""caosdb"""
+"""linkahead"""
 import os
 import subprocess
 import sys
@@ -53,7 +53,7 @@ MICRO = 1
 # https://github.com/pypa/packaging/pull/515
 # has made it into a release. Probably we should wait for pypa/packaging>=21.4
 # https://github.com/pypa/packaging/releases
-PRE = "" # "dev"  # e.g. rc0, alpha.1, 0.beta-23
+PRE = ""  # "dev"  # e.g. rc0, alpha.1, 0.beta-23
 
 if PRE:
     VERSION = "{}.{}.{}-{}".format(MAJOR, MINOR, MICRO, PRE)
@@ -91,22 +91,23 @@ def git_version():
 
 def get_version_info():
     # Adding the git rev number needs to be done inside write_version_py(),
-    # otherwise the import of caosdb.version messes up the build under
+    # otherwise the import of linkahead.version messes up the build under
     # Python 3.
     FULLVERSION = VERSION
 
+    # Magic which is only really needed in the pipelines. Therefore: a lot of dark pipeline magic.
     if os.path.exists('.git'):
         GIT_REVISION = git_version()
-    elif os.path.exists('caosdb_pylib_commit'):
-        with open('caosdb_pylib_commit', 'r') as f:
+    elif os.path.exists('linkahead_pylib_commit'):
+        with open('linkahead_pylib_commit', 'r') as f:
             GIT_REVISION = f.read().strip()
-    elif os.path.exists('src/caosdb/version.py'):
+    elif os.path.exists('src/linkahead/version.py'):
         # must be a source distribution, use existing version file
         try:
-            from caosdb.version import git_revision as GIT_REVISION
+            from linkahead.version import git_revision as GIT_REVISION
         except ImportError:
             raise ImportError("Unable to import git_revision. Try removing "
-                              "src/caosdb/version.py and the build directory "
+                              "src/linkahead/version.py and the build directory "
                               "before building.")
     else:
         GIT_REVISION = "Unknown"
@@ -117,9 +118,9 @@ def get_version_info():
     return FULLVERSION, GIT_REVISION
 
 
-def write_version_py(filename='src/caosdb/version.py'):
+def write_version_py(filename='src/linkahead/version.py'):
     cnt = """
-# THIS FILE IS GENERATED FROM caosdb SETUP.PY
+# THIS FILE IS GENERATED FROM linkahead SETUP.PY
 #
 short_version = '%(version)s'
 version = '%(version)s'
@@ -154,14 +155,14 @@ def setup_package():
     write_version_py()
 
     metadata = dict(
-        name='caosdb',
+        name='linkahead',
         version=get_version_info()[0],
-        description='Python Interface for CaosDB',
+        description='Python Interface for LinkAhead',
         long_description=long_description,
         long_description_content_type="text/markdown",
         author='Timm Fitschen',
         author_email='t.fitschen@indiscale.com',
-        url='https://www.caosdb.org',
+        url='https://www.linkahead.org',
         license="AGPLv3+",
         classifiers=[
             "Programming Language :: Python :: 3",
@@ -178,16 +179,16 @@ def setup_package():
                           "python-dateutil>=2.8.2",
                           'PyYAML>=5.4.1',
                           'future',
-                         ],
+                          ],
         extras_require={'keyring': ['keyring>=13.0.0'],
                         'jsonschema': ['jsonschema>=4.4.0']},
         setup_requires=["pytest-runner>=2.0,<3dev"],
         tests_require=["pytest", "pytest-cov", "coverage>=4.4.2",
                        "jsonschema>=4.4.0"],
         package_data={
-            'caosdb': ['cert/indiscale.ca.crt', 'schema-pycaosdb-ini.yml'],
+            'linkahead': ['cert/indiscale.ca.crt', 'schema-pycaosdb-ini.yml'],
         },
-        scripts=["src/caosdb/utils/caosdb_admin.py"]
+        scripts=["src/linkahead/utils/linkahead_admin.py"]
     )
     try:
         setup(**metadata)
diff --git a/src/caosdb/__init__.py b/src/caosdb/__init__.py
index acf323e8..3a8c5ba3 100644
--- a/src/caosdb/__init__.py
+++ b/src/caosdb/__init__.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -22,36 +22,40 @@
 # ** end header
 #
 
-"""CaosDB Python bindings.
+"""LinkAhead Python bindings.
+
+Tries to read from the inifile specified in the environment variable `PYCAOSDBINI` or
+alternatively in `~/.pylinkahead.ini` upon import.  After that, the ini file `pylinkahead.ini` in
+the current working directory will be read additionally, if it exists.
 
-Tries to read from the inifile specified in the environment variable `PYCAOSDBINI` or alternatively
-in `~/.pycaosdb.ini` upon import.  After that, the ini file `pycaosdb.ini` in the current working
-directory will be read additionally, if it exists.
 """
 
 from os import environ, getcwd
 # Import of the connection function (which is used to connect to the DB):
 from os.path import expanduser, join
+from warnings import warn
 
 # Import of convenience methods:
-import caosdb.apiutils
-from caosdb.common import administration
-from caosdb.common.datatype import (BOOLEAN, DATETIME, DOUBLE, FILE, INTEGER,
-                                    LIST, REFERENCE, TEXT)
-from caosdb.common.state import State, Transition
+from . import apiutils
+from .common import administration
+from .common.datatype import (BOOLEAN, DATETIME, DOUBLE, FILE, INTEGER, LIST,
+                              REFERENCE, TEXT)
 # Import of the basic  API classes:
-from caosdb.common.models import (ACL, ALL, FIX, NONE, OBLIGATORY, RECOMMENDED,
-                                  SUGGESTED, Container, DropOffBox, Entity,
-                                  File, Info, Message, Permissions, Property,
-                                  Query, QueryTemplate, Record, RecordType,
-                                  delete, execute_query, get_global_acl,
-                                  get_known_permissions, raise_errors)
-from caosdb.utils.get_entity import get_entity_by_name, get_entity_by_path, get_entity_by_id
-from caosdb.configuration import _read_config_files, configure, get_config
-from caosdb.connection.connection import configure_connection, get_connection
-from caosdb.exceptions import *
+from .common.models import (ACL, ALL, FIX, NONE, OBLIGATORY, RECOMMENDED,
+                            SUGGESTED, Container, DropOffBox, Entity, File,
+                            Info, Message, Permissions, Property, Query,
+                            QueryTemplate, Record, RecordType, delete,
+                            execute_query, get_global_acl,
+                            get_known_permissions, raise_errors)
+from .common.state import State, Transition
+from .configuration import _read_config_files, configure, get_config
+from .connection.connection import configure_connection, get_connection
+from .exceptions import *
+from .utils.get_entity import (get_entity_by_id, get_entity_by_name,
+                               get_entity_by_path)
+
 try:
-    from caosdb.version import version as __version__
+    from .version import version as __version__
 except ModuleNotFoundError:
     version = "uninstalled"
     __version__ = version
diff --git a/src/caosdb/apiutils.py b/src/caosdb/apiutils.py
index a46e3037..ca6ef7eb 100644
--- a/src/caosdb/apiutils.py
+++ b/src/caosdb/apiutils.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -28,23 +28,20 @@
 
 import logging
 import warnings
-
 from collections.abc import Iterable
 from typing import Any, Dict, List
 
-from caosdb.common.datatype import is_reference
-from caosdb.common.models import (Container, Entity, File, Property,
-                                  Record, RecordType, execute_query,
-                                  SPECIAL_ATTRIBUTES)
-from caosdb.exceptions import CaosDBException
-
-from caosdb.utils.git_utils import (get_origin_url_in, get_diff_in,
-                                    get_branch_in, get_commit_in)
+from .common.datatype import is_reference
+from .common.models import (SPECIAL_ATTRIBUTES, Container, Entity, File,
+                            Property, Record, RecordType, execute_query)
+from .exceptions import LinkAheadException
+from .utils.git_utils import (get_branch_in, get_commit_in, get_diff_in,
+                              get_origin_url_in)
 
 logger = logging.getLogger(__name__)
 
 
-class EntityMergeConflictError(CaosDBException):
+class EntityMergeConflictError(LinkAheadException):
     """An error that is raised in case of an unresolvable conflict when merging
     two entities.
     """
@@ -115,7 +112,7 @@ def get_type_of_entity_with(id_):
 
     if len(objs) > 1:
         raise RuntimeError(
-            "ID {} is not unique. This is probably a bug in the CaosDB server." .format(id_))
+            "ID {} is not unique. This is probably a bug in the LinkAhead server." .format(id_))
     obj = objs[0]
 
     if isinstance(obj, Record):
@@ -149,7 +146,7 @@ def retrieve_entities_with_ids(entities):
 def getOriginUrlIn(folder):
     warnings.warn("""
                   This function is deprecated and will be removed with the next release.
-                  Please use the caosdb.utils.git_utils.get_origin_url_in instead.""",
+                  Please use the linkahead.utils.git_utils.get_origin_url_in instead.""",
                   DeprecationWarning)
     return get_origin_url_in(folder)
 
@@ -157,7 +154,7 @@ def getOriginUrlIn(folder):
 def getDiffIn(folder, save_dir=None):
     warnings.warn("""
                   This function is deprecated and will be removed with the next release.
-                  Please use the caosdb.utils.git_utils.get_diff_in instead.""",
+                  Please use the linkahead.utils.git_utils.get_diff_in instead.""",
                   DeprecationWarning)
     return get_diff_in(folder, save_dir)
 
@@ -165,7 +162,7 @@ def getDiffIn(folder, save_dir=None):
 def getBranchIn(folder):
     warnings.warn("""
                   This function is deprecated and will be removed with the next release.
-                  Please use the caosdb.utils.git_utils.get_branch_in instead.""",
+                  Please use the linkahead.utils.git_utils.get_branch_in instead.""",
                   DeprecationWarning)
     return get_branch_in(folder)
 
@@ -173,7 +170,7 @@ def getBranchIn(folder):
 def getCommitIn(folder):
     warnings.warn("""
                   This function is deprecated and will be removed with the next release.
-                  Please use the caosdb.utils.git_utils.get_commit_in instead.""",
+                  Please use the linkahead.utils.git_utils.get_commit_in instead.""",
                   DeprecationWarning)
     return get_commit_in(folder)
 
@@ -439,7 +436,7 @@ def merge_entities(entity_a: Entity, entity_b: Entity, merge_references_with_emp
                             f"{diff_r1['properties'][key][attribute]}")
         else:
             # TODO: This is a temporary FIX for
-            #       https://gitlab.indiscale.com/caosdb/src/caosdb-pylib/-/issues/105
+            #       https://gitlab.indiscale.com/caosdb/src/linkahead-pylib/-/issues/105
             entity_a.add_property(id=entity_b.get_property(key).id,
                                   name=entity_b.get_property(key).name,
                                   datatype=entity_b.get_property(key).datatype,
diff --git a/src/caosdb/cached.py b/src/caosdb/cached.py
index 13152667..2eff5b1b 100644
--- a/src/caosdb/cached.py
+++ b/src/caosdb/cached.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2023 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2023 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -93,7 +93,7 @@ If a query phrase is given, the result must be unique.  If this is not what you
 
 
 def cached_query(query_string) -> Container:
-    """A cached version of :func:`caosdb.execute_query<caosdb.common.models.execute_query>`.
+    """A cached version of :func:`linkahead.execute_query<linkahead.common.models.execute_query>`.
 
 All additional arguments are at their default values.
 
@@ -168,8 +168,8 @@ kind: AccessType, optional
 
 unique: bool, optional
   If True, fills the cache for :func:`cached_get_entity_by`, presumably with
-  :class:`caosdb.Entity<caosdb.common.models.Entity>` objects.  If False, the cache should be filled
-  with :class:`caosdb.Container<caosdb.common.models.Container>` objects, for use with
+  :class:`linkahead.Entity<linkahead.common.models.Entity>` objects.  If False, the cache should be
+  filled with :class:`linkahead.Container<linkahead.common.models.Container>` objects, for use with
   :func:`cached_query`.
 
     """
diff --git a/src/caosdb/common/__init__.py b/src/caosdb/common/__init__.py
index 436281df..f74e0da1 100644
--- a/src/caosdb/common/__init__.py
+++ b/src/caosdb/common/__init__.py
@@ -1 +1 @@
-"""Commonly used classes for CaosDB."""
+"""Commonly used classes for LinkAhead."""
diff --git a/src/caosdb/common/administration.py b/src/caosdb/common/administration.py
index a27aaf04..417081b0 100644
--- a/src/caosdb/common/administration.py
+++ b/src/caosdb/common/administration.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -26,16 +26,18 @@
 
 """missing docstring."""
 
+import random
 import re
 import string
-import random
-from caosdb.common.utils import xml2str
-from caosdb.connection.connection import get_connection
-from caosdb.exceptions import (EntityDoesNotExistError, HTTPClientError,
-                               HTTPForbiddenError, HTTPResourceNotFoundError,
-                               ServerConfigurationException)
+
 from lxml import etree
 
+from ..connection.connection import get_connection
+from ..exceptions import (EntityDoesNotExistError, HTTPClientError,
+                          HTTPForbiddenError, HTTPResourceNotFoundError,
+                          ServerConfigurationException)
+from .utils import xml2str
+
 
 def set_server_property(key, value):
     """set_server_property.
@@ -134,7 +136,7 @@ def generate_password(length: int):
     """
     minimum_password_length = 8
     if length < minimum_password_length:
-        raise ValueError("CaosDB passwords have to be at least {} characters.".format(
+        raise ValueError("LinkAhead passwords have to be at least {} characters.".format(
             minimum_password_length))
     sample_letters = string.ascii_letters + string.digits + "!#$%*+-/:;?_"
     password = ''.join((random.choice(sample_letters) for i in range(length)))
diff --git a/src/caosdb/common/datatype.py b/src/caosdb/common/datatype.py
index 03ff6d02..83284456 100644
--- a/src/caosdb/common/datatype.py
+++ b/src/caosdb/common/datatype.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 IndiScale GmbH
 # Copyright (C) 2020 Henrik tom Wörden, IndiScale GmbH
@@ -148,8 +148,8 @@ def get_id_of_datatype(datatype):
     EmptyUniqueQueryError
         If there is no entity with the name of the datatype.
     """
-    from caosdb import execute_query
 
+    from .models import execute_query
     if is_list_datatype(datatype):
         datatype = get_list_datatype(datatype)
     q = "FIND RECORDTYPE {}".format(datatype)
diff --git a/src/caosdb/common/models.py b/src/caosdb/common/models.py
index df77bb73..be9c9c6a 100644
--- a/src/caosdb/common/models.py
+++ b/src/caosdb/common/models.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -24,7 +24,7 @@
 #
 
 """
-Collection of the central classes of the CaosDB client, namely the Entity class
+Collection of the central classes of the LinkAhead client, namely the Entity class
 and all of its subclasses and the Container class which is used to carry out
 transactions.
 
@@ -48,26 +48,25 @@ from tempfile import NamedTemporaryFile
 from typing import Any, Optional
 from warnings import warn
 
-from caosdb.common.datatype import (BOOLEAN, DATETIME, DOUBLE, INTEGER, TEXT,
-                                    is_list_datatype, is_reference)
-from caosdb.common.state import State
-from caosdb.common.timezone import TimeZone
-from caosdb.common.utils import uuid, xml2str
-from caosdb.common.versioning import Version
-from caosdb.configuration import get_config
-from caosdb.connection.connection import get_connection
-from caosdb.connection.encode import MultipartParam, multipart_encode
-from caosdb.exceptions import (AmbiguousEntityError, AuthorizationError,
-                               CaosDBConnectionError, CaosDBException,
-                               ConsistencyError, EmptyUniqueQueryError,
-                               EntityDoesNotExistError, EntityError,
-                               EntityHasNoDatatypeError, HTTPURITooLongError,
-                               MismatchingEntitiesError, QueryNotUniqueError,
-                               TransactionError, UniqueNamesError,
-                               UnqualifiedParentsError,
-                               UnqualifiedPropertiesError)
 from lxml import etree
 
+from ..configuration import get_config
+from ..connection.connection import get_connection
+from ..connection.encode import MultipartParam, multipart_encode
+from ..exceptions import (AmbiguousEntityError, AuthorizationError,
+                          ConsistencyError, EmptyUniqueQueryError,
+                          EntityDoesNotExistError, EntityError,
+                          EntityHasNoDatatypeError, HTTPURITooLongError,
+                          LinkAheadConnectionError, LinkAheadException,
+                          MismatchingEntitiesError, QueryNotUniqueError,
+                          TransactionError, UniqueNamesError,
+                          UnqualifiedParentsError, UnqualifiedPropertiesError)
+from .datatype import BOOLEAN, DATETIME, DOUBLE, INTEGER, TEXT, is_reference, is_list_datatype
+from .state import State
+from .timezone import TimeZone
+from .utils import uuid, xml2str
+from .versioning import Version
+
 _ENTITY_URI_SEGMENT = "Entity"
 
 # importances/inheritance
@@ -85,7 +84,7 @@ SPECIAL_ATTRIBUTES = ["name", "role", "datatype", "description",
 
 class Entity:
 
-    """Entity is a generic CaosDB object.
+    """Entity is a generic LinkAhead object.
 
     The majority of all methods of the derived classes (e.g. Record,
     RecordType, Property ...) are defined here, e.g. add_property,
@@ -588,7 +587,7 @@ class Entity:
         Add a simple integer property with the name ``TestProp`` and the value
         27 to a Record:
 
-        >>> import caosdb as db
+        >>> import linkahead as db
         >>> rec = db.Record(name="TestRec").add_parent(name="TestType")
         >>> rec.add_property("TestProp", value=27)  # specified by name, you could equally use the property's id if it is known
 
@@ -1365,7 +1364,7 @@ out: List[Entity]
         returns a Container containing the this entity.
 
         Note: If only a name is given this could lead to ambiguities. Usually
-        this would raise a CaosDBException. Set the flag 'unique' to False if
+        this would raise a LinkAheadException. Set the flag 'unique' to False if
         this Exception should be suppressed.  If unique is False this method
         returns a Container object which carries the returned entities. They are
         distinct from this one. This entity will no be changed somehow.
@@ -1394,12 +1393,12 @@ out: List[Entity]
 
     def insert(self, raise_exception_on_error=True, unique=True,
                sync=True, strict=False, flags=None):
-        """Insert this entity into a CaosDB server. A successful insertion will
+        """Insert this entity into a LinkAhead server. A successful insertion will
         generate a new persistent ID for this entity. This entity can be
         identified, retrieved, updated, and deleted via this ID until it has
         been deleted.
 
-        If the insertion fails, a CaosDBException will be raised. The server will have returned at
+        If the insertion fails, a LinkAheadException will be raised. The server will have returned at
         least one error-message describing the reason why it failed in that case (call
         <this_entity>.get_all_messages() in order to get these error-messages).
 
@@ -1451,7 +1450,7 @@ Second:
         and attributes, which is not possible via the second one for internal reasons (which are reasons
         of definiteness).
 
-        If the update fails, a CaosDBException will be raised. The server will have returned at
+        If the update fails, a LinkAheadException will be raised. The server will have returned at
         least one error message describing the reason why it failed in that case (call
         <this_entity>.get_all_messages() in order to get these error-messages).
 
@@ -1775,7 +1774,7 @@ class _ConcreteProperty(_EntityWrapper):
 
 class Property(Entity):
 
-    """CaosDB's Property object."""
+    """LinkAhead's Property object."""
 
     def add_property(self, property=None, value=None, id=None, name=None, description=None, datatype=None,
                      unit=None, importance=FIX, inheritance=FIX):  # @ReservedAssignment
@@ -1909,7 +1908,7 @@ class Message(object):
 
 class RecordType(Entity):
 
-    """This class represents CaosDB's RecordType entities."""
+    """This class represents LinkAhead's RecordType entities."""
 
     def add_property(self, property=None, value=None, id=None, name=None, description=None, datatype=None,
                      unit=None, importance=RECOMMENDED, inheritance=FIX):  # @ReservedAssignment
@@ -1965,7 +1964,7 @@ class RecordType(Entity):
 
 class Record(Entity):
 
-    """This class represents CaosDB's Record entities."""
+    """This class represents LinkAhead's Record entities."""
 
     def add_property(self, property=None, value=None, id=None, name=None, description=None, datatype=None,
                      unit=None, importance=FIX, inheritance=FIX):  # @ReservedAssignment
@@ -1988,7 +1987,7 @@ class Record(Entity):
 
 class File(Record):
 
-    """This class represents CaosDB's file entities.
+    """This class represents LinkAhead's file entities.
 
     For inserting a new file to the server, `path` gives the new location, and
     (exactly?) one of `file` and `pickup` should (must?) be given to specify the
@@ -2155,7 +2154,7 @@ class _Properties(list):
             self._importance[property] = importance
 
     def get_by_name(self, name):
-        """Get a property of this list via it's name. Raises a CaosDBException
+        """Get a property of this list via it's name. Raises a LinkAheadException
         if not exactly one property has this name.
 
         @param name: the name of the property to be returned.
@@ -3053,7 +3052,7 @@ class Container(list):
 
             return c
         else:
-            raise CaosDBException(
+            raise LinkAheadException(
                 "The server's response didn't contain the expected elements. The configuration of this client might be invalid (especially the url).")
 
     def _sync(self, container, unique, raise_exception_on_error,
@@ -3253,7 +3252,7 @@ class Container(list):
         """This function returns those elements of a given container that are a dependency of another element of the same container.
 
         Args:
-            container (Container): a caosdb container
+            container (Container): a linkahead container
 
         Returns:
             [set]: a set of unique elements that are a dependency of another element of `container`
@@ -3421,7 +3420,7 @@ class Container(list):
         properties and parents will be synchronized as well. They will not be
         overridden. This method returns a Container containing the this entity.
 
-        If any entity has no id and no name a CaosDBException will be raised.
+        If any entity has no id and no name a LinkAheadException will be raised.
 
         Note: If only a name is given this could lead to ambiguities. All entities with the name in question
         will be returned. Therefore, the container could contain more elements after the retrieval than
@@ -3506,12 +3505,12 @@ class Container(list):
                 uri1, uri2 = Container._split_uri_string(entities)
             except ValueError as val_e:
                 raise uri_e from val_e
-        c1 = self._retrieve(entities=uri1, flags=flags)
-        c2 = self._retrieve(entities=uri2, flags=flags)
-        c1.extend(c2)
-        c1.messages.extend(c2.messages)
+            c1 = self._retrieve(entities=uri1, flags=flags)
+            c2 = self._retrieve(entities=uri2, flags=flags)
+            c1.extend(c2)
+            c1.messages.extend(c2.messages)
 
-        return c1
+            return c1
 
     def clear_server_messages(self):
         self.messages.clear_server_messages()
@@ -3668,12 +3667,12 @@ class Container(list):
 
     def insert(self, strict=False, raise_exception_on_error=True,
                unique=True, sync=True, flags=None):
-        """Insert this file entity into CaosDB. A successful insertion will
+        """Insert this file entity into LinkAhead. A successful insertion will
         generate a new persistent ID for this entity. This entity can be
         identified, retrieved, updated, and deleted via this ID until it has
         been deleted.
 
-        If the insertion fails, a CaosDBException will be raised. The server will have returned at
+        If the insertion fails, a LinkAheadException will be raised. The server will have returned at
         least one error-message describing the reason why it failed in that case (call
         <this_entity>.get_all_messages() in order to get these error-messages).
 
@@ -3904,7 +3903,7 @@ def sync_global_acl():
                     if pelem.tag == "EntityACL":
                         ACL.global_acl = ACL(xml=pelem)
     else:
-        raise CaosDBException(
+        raise LinkAheadException(
             "The server's response didn't contain the expected elements. The configuration of this client might be invalid (especially the url).")
 
 
@@ -4506,7 +4505,7 @@ class Info():
         c = get_connection()
         try:
             http_response = c.retrieve(["Info"])
-        except CaosDBConnectionError as conn_e:
+        except LinkAheadConnectionError as conn_e:
             print(conn_e)
 
             return
@@ -4525,14 +4524,14 @@ class Info():
 
     def __str__(self):
         if "counts" not in self.messages:
-            return "caosdb.Info"
+            return "linkahead.Info"
 
         if int(self.messages["counts"]["records"]) > 0:
-            return "Connection to CaosDB with {} Records." .format(
+            return "Connection to LinkAhead with {} Records." .format(
                 self.messages["counts"]["records"]
             )
         else:
-            return "Connection to CaosDB without Records."
+            return "Connection to LinkAhead without Records."
 
     def __repr__(self):
         return self.__str__()
@@ -4773,7 +4772,7 @@ def raise_errors(arg0):
     Parameters:
     -----------
     arg0 : Entity, QueryTemplate, or Container
-        CaosDB object whose messages are evaluated according to their
+        LinkAhead object whose messages are evaluated according to their
         error codes
 
     """
diff --git a/src/caosdb/common/state.py b/src/caosdb/common/state.py
index cb74022b..82f314e8 100644
--- a/src/caosdb/common/state.py
+++ b/src/caosdb/common/state.py
@@ -1,5 +1,5 @@
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
diff --git a/src/caosdb/common/utils.py b/src/caosdb/common/utils.py
index f0ce740d..b333e3e0 100644
--- a/src/caosdb/common/utils.py
+++ b/src/caosdb/common/utils.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
diff --git a/src/caosdb/common/versioning.py b/src/caosdb/common/versioning.py
index 2875486a..facfbc48 100644
--- a/src/caosdb/common/versioning.py
+++ b/src/caosdb/common/versioning.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
@@ -27,7 +27,7 @@ Currently this module defines nothing but a single class, `Version`.
 """
 
 from __future__ import absolute_import
-from caosdb.common.utils import xml2str
+from .utils import xml2str
 from lxml import etree
 
 
diff --git a/src/caosdb/configuration.py b/src/caosdb/configuration.py
index 1c108ac1..1327e17a 100644
--- a/src/caosdb/configuration.py
+++ b/src/caosdb/configuration.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -23,8 +23,10 @@
 #
 
 import os
-import yaml
 import warnings
+
+import yaml
+
 try:
     optional_jsonschema_validate = None
     from jsonschema import validate as optional_jsonschema_validate
@@ -32,9 +34,8 @@ except ImportError:
     pass
 
 from configparser import ConfigParser
-
 from os import environ, getcwd
-from os.path import expanduser, join, isfile
+from os.path import expanduser, isfile, join
 
 
 def _reset_config():
@@ -95,24 +96,45 @@ def validate_yaml_schema(valobj):
 
 
 def _read_config_files():
-    """Function to read config files from different paths.
+    """Read config files from different paths.
 
-    Checks for path either in ``$PYCAOSDBINI`` or home directory (``.pycaosdb.ini``), and
-    additionally in the current working directory (``pycaosdb.ini``).
+    Read the config from either ``$PYCAOSDBINI`` or home directory (``~/.pylinkahead.ini``), and
+    additionally adds config from a config file in the current working directory
+    (``pylinkahead.ini``).  All of these are optional.
 
     Returns
     -------
 
     ini files: list
-      The successfully parsed ini-files. Order: env_var or home directory, cwd. Used for testing the function.
+      The successfully parsed ini-files. Order: environment variable or home directory, then cwd.
+      Used for testing the function.
 
     """
     return_var = []
+    ini_user = expanduser('~/.pylinkahead.ini')
+    ini_cwd = join(getcwd(), "pylinkahead.ini")
+    # LinkAhead rename block ##################################################
+    ini_user_caosdb = expanduser('~/.pycaosdb.ini')
+    ini_cwd_caosdb = join(getcwd(), "pycaosdb.ini")
+    if os.path.exists(ini_user_caosdb):
+        warnings.warn("\n\nYou have a config file with the old naming scheme (pycaosdb.ini). "
+                      f"Please use the new version and rename\n"
+                      f"    {ini_user_caosdb}\nto\n    {ini_user}", DeprecationWarning)
+    if os.path.exists(ini_cwd_caosdb):
+        warnings.warn("\n\nYou have a config file with the old naming scheme (pycaosdb.ini). "
+                      f"Please use the new version and rename\n"
+                      f"    {ini_cwd_caosdb}\nto\n    {ini_cwd}", DeprecationWarning)
+    # End: LinkAhead rename block ##################################################
+
     if "PYCAOSDBINI" in environ:
         return_var.extend(configure(expanduser(environ["PYCAOSDBINI"])))
     else:
-        return_var.extend(configure(expanduser('~/.pycaosdb.ini')))
-
-    if isfile(join(getcwd(), "pycaosdb.ini")):
-        return_var.extend(configure(join(getcwd(), "pycaosdb.ini")))
+        if isfile(ini_user_caosdb):
+            return_var.extend(configure(ini_user_caosdb))
+        if isfile(ini_user):
+            return_var.extend(configure(ini_user))
+    if isfile(ini_cwd):
+        return_var.extend(configure(ini_cwd))
+    if isfile(ini_cwd_caosdb):
+        return_var.extend(configure(ini_cwd_caosdb))
     return return_var
diff --git a/src/caosdb/connection/authentication/auth_token.py b/src/caosdb/connection/authentication/auth_token.py
index 68812386..bf2b7634 100644
--- a/src/caosdb/connection/authentication/auth_token.py
+++ b/src/caosdb/connection/authentication/auth_token.py
@@ -1,7 +1,7 @@
 #! -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -29,8 +29,8 @@ An Authentictor which only uses only a pre-supplied authentication token.
 """
 from __future__ import absolute_import, unicode_literals, print_function
 from .interface import AbstractAuthenticator, CaosDBServerConnection
-from caosdb.connection.utils import auth_token_to_cookie
-from caosdb.exceptions import LoginFailedError
+from ..utils import auth_token_to_cookie
+from ...exceptions import LoginFailedError
 
 
 def get_authentication_provider():
@@ -91,6 +91,6 @@ class AuthTokenAuthenticator(AbstractAuthenticator):
         if "connection" in config:
             self._connection = config["connection"]
             if not isinstance(self._connection, CaosDBServerConnection):
-                raise Exception("""Bad configuration of the caosdb connection.
+                raise Exception("""Bad configuration of the LinkAhead connection.
                                 The `connection` must be an instance of
-                                `CaosDBConnection`.""")
+                                `LinkAheadConnection`.""")
diff --git a/src/caosdb/connection/authentication/external_credentials_provider.py b/src/caosdb/connection/authentication/external_credentials_provider.py
index 1cf4cefc..3d1b8afa 100644
--- a/src/caosdb/connection/authentication/external_credentials_provider.py
+++ b/src/caosdb/connection/authentication/external_credentials_provider.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -78,11 +78,11 @@ class ExternalCredentialsProvider(PlainTextCredentialsProvider, ABC):
             else:
                 authm = "an external credentials provider"
             self.logger.log(logging.WARNING,
-                            ("`password` defined. You configured caosdb to "
+                            ("`password` defined. You configured LinkAhead to "
                              "use %s as authentication method and yet "
                              "provided a password yourself. This indicates "
                              "a misconfiguration (e.g. in your "
-                             "pycaosdb.ini) and should be avoided."),
+                             "pylinkahead.ini) and should be avoided."),
                             authm)
         self._config = dict(config)
         super(ExternalCredentialsProvider, self).configure(**config)
diff --git a/src/caosdb/connection/authentication/input.py b/src/caosdb/connection/authentication/input.py
index 7edec7c8..27992073 100644
--- a/src/caosdb/connection/authentication/input.py
+++ b/src/caosdb/connection/authentication/input.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
diff --git a/src/caosdb/connection/authentication/interface.py b/src/caosdb/connection/authentication/interface.py
index f2cc5001..6de43b81 100644
--- a/src/caosdb/connection/authentication/interface.py
+++ b/src/caosdb/connection/authentication/interface.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -22,16 +22,16 @@
 # ** end header
 #
 """This module provides the interfaces for authenticating requests to the
-caosdb server.
+LinkAhead server.
 
 Implementing modules muts provide a `get_authentication_provider()` method.
 """
 from abc import ABCMeta, abstractmethod, abstractproperty
 import logging
-from caosdb.connection.utils import urlencode
-from caosdb.connection.interface import CaosDBServerConnection
-from caosdb.connection.utils import parse_auth_token, auth_token_to_cookie
-from caosdb.exceptions import LoginFailedError
+from ..utils import urlencode
+from ..interface import CaosDBServerConnection
+from ..utils import parse_auth_token, auth_token_to_cookie
+from ...exceptions import LoginFailedError
 
 # meta class compatible with Python 2 *and* 3:
 ABC = ABCMeta('ABC', (object, ), {'__slots__': ()})
@@ -51,7 +51,7 @@ class AbstractAuthenticator(ABC):
         A logger which should be used for all logging which has to do with
         authentication.
     auth_token : str
-        A string representation of a CaosDB Auth Token.
+        A string representation of a LinkAhead Auth Token.
 
     Methods
     -------
@@ -219,9 +219,9 @@ class CredentialsAuthenticator(AbstractAuthenticator):
         if "connection" in config:
             self._connection = config["connection"]
             if not isinstance(self._connection, CaosDBServerConnection):
-                raise Exception("""Bad configuration of the caosdb connection.
+                raise Exception("""Bad configuration of the LinkAhead connection.
                                 The `connection` must be an instance of
-                                `CaosDBConnection`.""")
+                                `LinkAheadConnection`.""")
 
 
 class CredentialsProvider(ABC):
diff --git a/src/caosdb/connection/authentication/keyring.py b/src/caosdb/connection/authentication/keyring.py
index 99d18413..202520bb 100644
--- a/src/caosdb/connection/authentication/keyring.py
+++ b/src/caosdb/connection/authentication/keyring.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -30,7 +30,7 @@ retrieve the password.
 import sys
 import importlib
 from getpass import getpass
-from caosdb.exceptions import ConfigurationError
+from ...exceptions import ConfigurationError
 from .external_credentials_provider import ExternalCredentialsProvider
 from .interface import CredentialsAuthenticator
 
@@ -69,7 +69,7 @@ def _call_keyring(**config):
                                  "password in question.")
     url = config.get("url")
     username = config.get("username")
-    app = "caosdb — {}".format(url)
+    app = "linkahead — {}".format(url)
     external_keyring = _get_external_keyring()
     password = external_keyring.get_password(app, username)
     if password is None:
diff --git a/src/caosdb/connection/authentication/pass.py b/src/caosdb/connection/authentication/pass.py
index 853cdf0e..bec30740 100644
--- a/src/caosdb/connection/authentication/pass.py
+++ b/src/caosdb/connection/authentication/pass.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -28,7 +28,7 @@ password.
 """
 
 from subprocess import check_output, CalledProcessError
-from caosdb.exceptions import ConfigurationError
+from ...exceptions import ConfigurationError
 from .interface import CredentialsAuthenticator
 from .external_credentials_provider import ExternalCredentialsProvider
 
@@ -62,7 +62,7 @@ def _call_pass(**config):
     except CalledProcessError as exc:
         raise RuntimeError(
             "Password manager returned error code {}. This usually "
-            "occurs if the password_identifier in .pycaosdb.ini is "
+            "occurs if the password_identifier in .pylinkahead.ini is "
             "incorrect or missing.".format(exc.returncode))
 
 
diff --git a/src/caosdb/connection/authentication/plain.py b/src/caosdb/connection/authentication/plain.py
index 83dd5929..162cd365 100644
--- a/src/caosdb/connection/authentication/plain.py
+++ b/src/caosdb/connection/authentication/plain.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
diff --git a/src/caosdb/connection/authentication/unauthenticated.py b/src/caosdb/connection/authentication/unauthenticated.py
index 65febae8..590b7914 100644
--- a/src/caosdb/connection/authentication/unauthenticated.py
+++ b/src/caosdb/connection/authentication/unauthenticated.py
@@ -1,7 +1,7 @@
 #! -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -28,9 +28,10 @@
 An Authenticator which suppresses any authentication and also ignores auth_token
 cookies.
 """
-from __future__ import absolute_import, unicode_literals, print_function
+from __future__ import absolute_import, print_function, unicode_literals
+
+from ...exceptions import LoginFailedError
 from .interface import AbstractAuthenticator, CaosDBServerConnection
-from caosdb.exceptions import LoginFailedError
 
 
 def get_authentication_provider():
@@ -70,7 +71,7 @@ class Unauthenticated(AbstractAuthenticator):
         self._login()
 
     def _login(self):
-        raise LoginFailedError("This caosdb client is configured to stay "
+        raise LoginFailedError("This LinkAhead client is configured to stay "
                                "unauthenticated. Change your "
                                "`password_method` and provide an "
                                "`auth_token` or credentials if you want "
diff --git a/src/caosdb/connection/connection.py b/src/caosdb/connection/connection.py
index 46dadea9..d794b313 100644
--- a/src/caosdb/connection/connection.py
+++ b/src/caosdb/connection/connection.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -22,7 +22,7 @@
 #
 # ** end header
 #
-"""Connection to a CaosDB server."""
+"""Connection to a LinkAhead server."""
 from __future__ import absolute_import, print_function, unicode_literals
 
 import logging
@@ -33,30 +33,30 @@ from builtins import str  # pylint: disable=redefined-builtin
 from errno import EPIPE as BrokenPipe
 from socket import error as SocketError
 from urllib.parse import quote, urlparse
+from warnings import warn
+
 from requests import Session as HTTPSession
+from requests.adapters import HTTPAdapter
 from requests.exceptions import ConnectionError as HTTPConnectionError
 from urllib3.poolmanager import PoolManager
-from requests.adapters import HTTPAdapter
 
-from caosdb.configuration import get_config
-from caosdb.exceptions import (CaosDBException, HTTPClientError,
-                               ConfigurationError,
-                               CaosDBConnectionError,
-                               HTTPForbiddenError,
-                               LoginFailedError,
-                               HTTPResourceNotFoundError,
-                               HTTPServerError,
-                               HTTPURITooLongError)
+from ..configuration import get_config
+from ..exceptions import (ConfigurationError, HTTPClientError,
+                          HTTPForbiddenError, HTTPResourceNotFoundError,
+                          HTTPServerError, HTTPURITooLongError,
+                          LinkAheadConnectionError, LinkAheadException,
+                          LoginFailedError)
+
 try:
-    from caosdb.version import version
+    from ..version import version
 except ModuleNotFoundError:
     version = "uninstalled"
 
 from pkg_resources import resource_filename
 
+from .encode import MultipartYielder, ReadableMultiparts
 from .interface import CaosDBHTTPResponse, CaosDBServerConnection
 from .utils import make_uri_path, parse_url, urlencode
-from .encode import MultipartYielder, ReadableMultiparts
 
 _LOGGER = logging.getLogger(__name__)
 
@@ -150,7 +150,7 @@ class _DefaultCaosDBServerConnection(CaosDBServerConnection):
     """
 
     def __init__(self):
-        self._useragent = ("caosdb-pylib/{version} - {implementation}".format(
+        self._useragent = ("linkahead-pylib/{version} - {implementation}".format(
             version=version, implementation=type(self).__name__))
         self._base_path = None
         self._session = None
@@ -200,7 +200,7 @@ class _DefaultCaosDBServerConnection(CaosDBServerConnection):
 
             return _WrappedHTTPResponse(response)
         except HTTPConnectionError as conn_err:
-            raise CaosDBConnectionError(
+            raise LinkAheadConnectionError(
                 "Connection failed. Network or server down? " + str(conn_err)
             )
 
@@ -215,29 +215,29 @@ class _DefaultCaosDBServerConnection(CaosDBServerConnection):
             Path to the CA certificate which will be used to identify the
             server.
         url : str
-            The url of the CaosDB Server, e.g.
+            The url of the LinkAhead Server, e.g.
             `https://example.com:443/rootpath`, including a possible root path.
         **config :
             Any further keyword arguments are being ignored.
 
         Raises
         ------
-        CaosDBConnectionError
+        LinkAheadConnectionError
             If no url has been specified, or if the CA certificate cannot be
             loaded.
         """
 
         if "url" not in config:
-            raise CaosDBConnectionError(
+            raise LinkAheadConnectionError(
                 "No connection url specified. Please "
-                "do so via caosdb.configure_connection(...) or in a config "
+                "do so via linkahead.configure_connection(...) or in a config "
                 "file.")
         if (not config["url"].lower().startswith("https://") and not config["url"].lower().startswith("http://")):
-            raise CaosDBConnectionError("The connection url is expected "
-                                        "to be a http or https url and "
-                                        "must include the url scheme "
-                                        "(i.e. start with https:// or "
-                                        "http://).")
+            raise LinkAheadConnectionError("The connection url is expected "
+                                           "to be a http or https url and "
+                                           "must include the url scheme "
+                                           "(i.e. start with https:// or "
+                                           "http://).")
 
         url = urlparse(config["url"])
         path = url.path.strip("/")
@@ -294,6 +294,14 @@ class _DefaultCaosDBServerConnection(CaosDBServerConnection):
             self._session.verify = verify
 
 
+class _DefaultCaosDBServerConnection(_DefaultCaosDBServerConnection):
+    def __init__(self, *args, **kwargs):
+        warn(("The name _DefaultCaosDBServerConnection is deprecated. Please use "
+              "_DefaultCaosDBServerConnection."),
+             DeprecationWarning)
+        super().__init__(*args, **kwargs)
+
+
 def _make_conf(*conf):
     """_make_conf.
 
@@ -333,7 +341,7 @@ def _get_authenticator(**config):
     Parameters
     ----------
     password_method : str
-        The simple name of a submodule of caosdb.connection.authentication.
+        The simple name of a submodule of linkahead.connection.authentication.
         Currently, there are four valid values for this parameter: 'plain',
         'pass', 'keyring' and 'auth_token'.
     **config :
@@ -349,10 +357,10 @@ def _get_authenticator(**config):
     Raises
     ------
     ConfigurationError
-        If the password_method string cannot be resolved to a CaosAuthenticator
+        If the password_method string cannot be resolved to a LinkaheadAuthenticator
         class.
     """
-    auth_module = ("caosdb.connection.authentication." +
+    auth_module = ("linkahead.connection.authentication." +
                    config["password_method"])
     _LOGGER.debug("import auth_module %s", auth_module)
     try:
@@ -371,10 +379,10 @@ def _get_authenticator(**config):
 
 
 def configure_connection(**kwargs):
-    """Configures the caosdb connection and returns the Connection object.
+    """Configures the LinkAhead connection and returns the Connection object.
 
     The effective configuration is governed by the default values (see
-    'Parameters'), the global configuration (see `caosdb.get_config()`) and the
+    'Parameters'), the global configuration (see `linkahead.get_config()`) and the
     parameters which are passed to this function, with ascending priority.
 
     The parameters which are listed here, are possibly not sufficient for a
@@ -384,7 +392,7 @@ def configure_connection(**kwargs):
     Parameters
     ----------
     url : str
-        The url of the CaosDB Server. HTTP and HTTPS urls are allowed. However,
+        The url of the LinkAhead Server. HTTP and HTTPS urls are allowed. However,
         it is **highly** recommend to avoid HTTP because passwords and
         authentication token are send over the network in plain text.
 
@@ -395,7 +403,7 @@ def configure_connection(**kwargs):
         Password for login if 'plain' is used as password_method.
 
     password_method : str
-        The name of a submodule of caosdb.connection.authentication which
+        The name of a submodule of linkahead.connection.authentication which
         implements the AbstractAuthenticator interface. (Default: 'plain')
         Possible values are, for example:
         - "plain"    Need username and password arguments.
@@ -412,7 +420,7 @@ def configure_connection(**kwargs):
         development purposes! (Default: False)
 
     auth_token : str (optional)
-        An authentication token which has been issued by the CaosDB Server.
+        An authentication token which has been issued by the LinkAhead Server.
         Implies `password_method="auth_token"` if set.  An example token string would be `["O","OneTimeAuthenticationToken","anonymous",["administration"],[],1592995200000,604800000,"3ZZ4WKRB-5I7DG2Q6-ZZE6T64P-VQ","197d0d081615c52dc18fb323c300d7be077beaad4020773bb58920b55023fa6ee49355e35754a4277b9ac525c882bcd3a22e7227ba36dfcbbdbf8f15f19d1ee9",1,30000]`.
 
     https_proxy : str, optional
@@ -423,13 +431,13 @@ def configure_connection(**kwargs):
         using TLS in the tunneled connection nonetheless. Only the connection
         to the proxy is insecure which is why it is not recommended to use HTTP
         proxies when authentication against the proxy is necessary. If
-        unspecified, the https_proxy option of the pycaosdb.ini or the HTTPS_PROXY
+        unspecified, the https_proxy option of the pylinkahead.ini or the HTTPS_PROXY
         environment variable are being used. Use `None` to override these
         options with a no-proxy setting.
 
     http_proxy : str, optional
         Define a proxy for the http connections, e.g. `http://localhost:8888`.
-        If unspecified, the http_proxy option of the pycaosdb.ini or the
+        If unspecified, the http_proxy option of the pylinkahead.ini or the
         HTTP_PROXY environment variable are being used. Use `None` to override
         these options with a no-proxy setting.
 
@@ -514,7 +522,7 @@ def _handle_response_status(http_response):
     elif 399 < status < 500:
         raise HTTPClientError(msg=standard_message, status=status, body=body)
     else:
-        raise CaosDBException(standard_message)
+        raise LinkAheadException(standard_message)
 
 
 class _Connection(object):  # pylint: disable=useless-object-inheritance
@@ -641,7 +649,7 @@ class _Connection(object):  # pylint: disable=useless-object-inheritance
         return http_response
 
     def download_file(self, path):
-        """This function downloads a file via HTTP from the Caosdb file
+        """This function downloads a file via HTTP from the LinkAhead file
         system."""
         try:
             uri_segments = ["FileSystem"]
diff --git a/src/caosdb/connection/encode.py b/src/caosdb/connection/encode.py
index 0b826cc4..6b328285 100644
--- a/src/caosdb/connection/encode.py
+++ b/src/caosdb/connection/encode.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
diff --git a/src/caosdb/connection/interface.py b/src/caosdb/connection/interface.py
index a6f73917..d63dbeb8 100644
--- a/src/caosdb/connection/interface.py
+++ b/src/caosdb/connection/interface.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -23,6 +23,7 @@
 #
 """This module defines the CaosDBServerConnection interface."""
 from abc import ABCMeta, abstractmethod, abstractproperty
+from warnings import warn
 
 # meta class compatible with Python 2 *and* 3:
 ABC = ABCMeta('ABC', (object, ), {'__slots__': ()})
@@ -30,7 +31,7 @@ ABC = ABCMeta('ABC', (object, ), {'__slots__': ()})
 
 class CaosDBHTTPResponse(ABC):
     """An abstract class which defines a minimal interface for responses of the
-    CaosDBServer."""
+    LinkAheadServer."""
 
     @abstractmethod
     def read(self, size=-1):
@@ -74,12 +75,12 @@ class CaosDBHTTPResponse(ABC):
 
 class CaosDBServerConnection(ABC):
     """Abstract class which defines the interface for sending requests to the
-    caosdb server."""
+    LinkAhead server."""
 
     @abstractmethod
     def request(self, method, path, headers=None, body=None, **kwargs):
         """Abstract method. Implement this method for HTTP requests to the
-        caosdb server.
+        LinkAhead server.
 
         Returns
         -------
diff --git a/src/caosdb/connection/mockup.py b/src/caosdb/connection/mockup.py
index b37670b8..9b69971c 100644
--- a/src/caosdb/connection/mockup.py
+++ b/src/caosdb/connection/mockup.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -21,7 +21,7 @@
 #
 # ** end header
 #
-"""Classes and functions to immitate a caosdb server without actually setting
+"""Classes and functions to immitate a LinkAhead server without actually setting
 up a tcp connection."""
 
 from __future__ import unicode_literals, print_function
@@ -72,7 +72,7 @@ class MockUpResponse(CaosDBHTTPResponse):
 
 class MockUpServerConnection(CaosDBServerConnection):
     """The mock-up connection which does not actually connect to anything but
-    just returns predefined responses which mimic the caosdb server."""
+    just returns predefined responses which mimic the LinkAhead server."""
 
     def __init__(self):
         self.resources = [self._login]
diff --git a/src/caosdb/connection/utils.py b/src/caosdb/connection/utils.py
index 095d4703..90ec6b5b 100644
--- a/src/caosdb/connection/utils.py
+++ b/src/caosdb/connection/utils.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
diff --git a/src/caosdb/exceptions.py b/src/caosdb/exceptions.py
index fdd2e11f..cf60f7fb 100644
--- a/src/caosdb/exceptions.py
+++ b/src/caosdb/exceptions.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -28,18 +28,29 @@ HTTP response codes) and for transaction errors (i.e. missing permissions,
 dependencies, non-passing consistency checks etc.).
 """
 
+from warnings import warn
+
 from lxml import etree
 
 
 class CaosDBException(Exception):
-    """Base class of all CaosDB exceptions."""
+    # TODO remove from inheritance change once deprecation period is over
+    def __init__(self, msg):
+        warn(("The name CaosDBException is deprecated. Please use LinkAheadException."),
+             DeprecationWarning)
+        Exception.__init__(self, msg)
+        self.msg = msg
+
+
+class LinkAheadException(CaosDBException):
+    """Base class of all LinkAhead exceptions."""
 
     def __init__(self, msg):
         Exception.__init__(self, msg)
         self.msg = msg
 
 
-class ConfigurationError(CaosDBException):
+class ConfigurationError(LinkAheadException):
     """ConfigurationError.
 
     Indicates a misconfiguration.
@@ -59,27 +70,27 @@ class ConfigurationError(CaosDBException):
     def __init__(self, msg):
         super().__init__(msg + ConfigurationError._INFO)
 
-    _INFO = ("\n\nPlease check your ~/.pycaosdb.ini and your $PWD/"
-             ".pycaosdb.ini. Does at least one of them exist and are they correct?")
+    _INFO = ("\n\nPlease check your ~/.pylinkahead.ini and your $PWD/"
+             ".pylinkahead.ini. Does at least one of them exist and are they correct?")
 
 
-class ServerConfigurationException(CaosDBException):
+class ServerConfigurationException(LinkAheadException):
     """The server is configured in a different way than expected.
 
     This can be for example unexpected flags or settings or missing extensions.
     """
 
 
-class HTTPClientError(CaosDBException):
+class HTTPClientError(LinkAheadException):
     """HTTPClientError represents 4xx HTTP client errors."""
 
     def __init__(self, msg, status, body):
         self.status = status
         self.body = body
-        CaosDBException.__init__(self, msg)
+        LinkAheadException.__init__(self, msg)
 
 
-class HTTPServerError(CaosDBException):
+class HTTPServerError(LinkAheadException):
     """HTTPServerError represents 5xx HTTP server errors."""
 
     def __init__(self, body):
@@ -89,14 +100,23 @@ class HTTPServerError(CaosDBException):
 
         if error.text is not None:
             msg = msg + "\n\n" + error.text
-        CaosDBException.__init__(self, msg)
+        LinkAheadException.__init__(self, msg)
+
+
+class CaosDBConnectionError(LinkAheadException):
+    # TODO remove from inheritance change once deprecation period is over
+    def __init__(self, msg=None):
+        warn(("The name CaosDBConnectionError is deprecated. "
+              "Please use LinkAheadConnectionError."),
+             DeprecationWarning)
+        LinkAheadException.__init__(self, msg)
 
 
-class CaosDBConnectionError(CaosDBException):
+class LinkAheadConnectionError(CaosDBConnectionError):
     """Connection is not configured or the network is down."""
 
     def __init__(self, msg=None):
-        CaosDBException.__init__(self, msg)
+        LinkAheadException.__init__(self, msg)
 
 
 class HTTPURITooLongError(HTTPClientError):
@@ -106,14 +126,14 @@ class HTTPURITooLongError(HTTPClientError):
         HTTPClientError.__init__(self, msg=msg, status=414, body=None)
 
 
-class LoginFailedError(CaosDBException):
+class LoginFailedError(LinkAheadException):
     """Login failed.
 
     Probably, your username/password pair is wrong.
     """
 
     def __init__(self, msg=None):
-        CaosDBException.__init__(self, msg=msg)
+        LinkAheadException.__init__(self, msg=msg)
 
 
 class HTTPForbiddenError(HTTPClientError):
@@ -136,14 +156,14 @@ class HTTPResourceNotFoundError(HTTPClientError):
         HTTPClientError.__init__(self, msg=msg, status=404, body=None)
 
 
-class MismatchingEntitiesError(CaosDBException):
+class MismatchingEntitiesError(LinkAheadException):
     """Mismatching entities were found during container sync."""
 
 
 # ######################### Bad query errors ###########################
 
 
-class BadQueryError(CaosDBException):
+class BadQueryError(LinkAheadException):
     """Base class for query errors that are not transaction errors."""
 
 
@@ -158,9 +178,9 @@ class EmptyUniqueQueryError(BadQueryError):
 # ######################### Transaction errors #########################
 
 
-class TransactionError(CaosDBException):
+class TransactionError(LinkAheadException):
     """An error of this type is raised whenever any transaction fails with
-    one or more entities between client and CaosDB server. More
+    one or more entities between client and LinkAhead server. More
     detailed errors are collected as direct and indirect children in
     the 'errors' list (direct children) and the 'all_errors' set (set
     of all direct and indirect children).
@@ -170,7 +190,7 @@ class TransactionError(CaosDBException):
     def __init__(self, error=None,
                  msg="An error occured during the transaction.",
                  container=None):
-        CaosDBException.__init__(self, msg=msg)
+        LinkAheadException.__init__(self, msg=msg)
         self.errors = []
         self.all_errors = set()
         self.entities = []
diff --git a/src/caosdb/high_level_api.py b/src/caosdb/high_level_api.py
index 3509a7b6..96fc09af 100644
--- a/src/caosdb/high_level_api.py
+++ b/src/caosdb/high_level_api.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -25,58 +25,56 @@
 #
 
 """
-A high level API for accessing CaosDB entities from within python.
+A high level API for accessing LinkAhead entities from within python.
 
 This is refactored from apiutils.
 """
 
-from caosdb.common.datatype import (BOOLEAN, DATETIME, DOUBLE, FILE, INTEGER,
-                                    REFERENCE, TEXT,
-                                    is_list_datatype,
-                                    get_list_datatype,
-                                    is_reference)
-import caosdb as db
-
-from .apiutils import get_type_of_entity_with, create_flat_list
 import warnings
-
-from typing import Any, Optional, List, Union, Dict
-
-import yaml
-
 from dataclasses import dataclass, fields
 from datetime import datetime
+from typing import Any, Dict, List, Optional, Union
+
+import yaml
 from dateutil import parser
 
+import linkahead as db
+from linkahead.common.datatype import (BOOLEAN, DATETIME, DOUBLE, FILE,
+                                       INTEGER, REFERENCE, TEXT,
+                                       get_list_datatype, is_list_datatype,
+                                       is_reference)
+
+from .apiutils import create_flat_list, get_type_of_entity_with
+
 warnings.warn("""EXPERIMENTAL! The high_level_api module is experimental and may be changed or
 removed in the future. Its purpose is to give an impression on how the Python client user interface
 might be changed.""")
 
 
-def standard_type_for_high_level_type(high_level_record: "CaosDBPythonEntity",
+def standard_type_for_high_level_type(high_level_record: "LinkAheadPythonEntity",
                                       return_string: bool = False):
     """
-    For a given CaosDBPythonEntity either return the corresponding
-    class in the standard CaosDB API or - if return_string is True - return
+    For a given LinkAheadPythonEntity either return the corresponding
+    class in the standard LinkAhead API or - if return_string is True - return
     the role as a string.
     """
-    if type(high_level_record) == CaosDBPythonRecord:
+    if type(high_level_record) == LinkAheadPythonRecord:
         if not return_string:
             return db.Record
         return "Record"
-    elif type(high_level_record) == CaosDBPythonFile:
+    elif type(high_level_record) == LinkAheadPythonFile:
         if not return_string:
             return db.File
         return "File"
-    elif type(high_level_record) == CaosDBPythonProperty:
+    elif type(high_level_record) == LinkAheadPythonProperty:
         if not return_string:
             return db.Property
         return "Property"
-    elif type(high_level_record) == CaosDBPythonRecordType:
+    elif type(high_level_record) == LinkAheadPythonRecordType:
         if not return_string:
             return db.RecordType
         return "RecordType"
-    elif type(high_level_record) == CaosDBPythonEntity:
+    elif type(high_level_record) == LinkAheadPythonEntity:
         if not return_string:
             return db.Entity
         return "Entity"
@@ -85,15 +83,15 @@ def standard_type_for_high_level_type(high_level_record: "CaosDBPythonEntity",
 
 def high_level_type_for_role(role: str):
     if role == "Record":
-        return CaosDBPythonRecord
+        return LinkAheadPythonRecord
     if role == "File":
-        return CaosDBPythonFile
+        return LinkAheadPythonFile
     if role == "Property":
-        return CaosDBPythonProperty
+        return LinkAheadPythonProperty
     if role == "RecordType":
-        return CaosDBPythonRecordType
+        return LinkAheadPythonRecordType
     if role == "Entity":
-        return CaosDBPythonEntity
+        return LinkAheadPythonEntity
     raise RuntimeError("Unknown role.")
 
 
@@ -102,20 +100,20 @@ def high_level_type_for_standard_type(standard_record: db.Entity):
         raise ValueError()
     role = standard_record.role
     if role == "Record" or type(standard_record) == db.Record:
-        return CaosDBPythonRecord
+        return LinkAheadPythonRecord
     elif role == "File" or type(standard_record) == db.File:
-        return CaosDBPythonFile
+        return LinkAheadPythonFile
     elif role == "Property" or type(standard_record) == db.Property:
-        return CaosDBPythonProperty
+        return LinkAheadPythonProperty
     elif role == "RecordType" or type(standard_record) == db.RecordType:
-        return CaosDBPythonRecordType
+        return LinkAheadPythonRecordType
     elif role == "Entity" or type(standard_record) == db.Entity:
-        return CaosDBPythonEntity
+        return LinkAheadPythonEntity
     raise RuntimeError("Incompatible type.")
 
 
 @dataclass
-class CaosDBPropertyMetaData:
+class LinkAheadPropertyMetaData:
     # name is already the name of the attribute
     unit: Optional[str] = None
     datatype: Optional[str] = None
@@ -124,12 +122,12 @@ class CaosDBPropertyMetaData:
     importance: Optional[str] = None
 
 
-class CaosDBPythonUnresolved:
+class LinkAheadPythonUnresolved:
     pass
 
 
 @dataclass
-class CaosDBPythonUnresolvedParent(CaosDBPythonUnresolved):
+class LinkAheadPythonUnresolvedParent(LinkAheadPythonUnresolved):
     """
     Parents can be either given by name or by ID.
 
@@ -141,32 +139,32 @@ class CaosDBPythonUnresolvedParent(CaosDBPythonUnresolved):
 
 
 @dataclass
-class CaosDBPythonUnresolvedReference(CaosDBPythonUnresolved):
+class LinkAheadPythonUnresolvedReference(LinkAheadPythonUnresolved):
 
     def __init__(self, id=None):
         self.id = id
 
 
-class CaosDBPythonEntity(object):
+class LinkAheadPythonEntity(object):
 
     def __init__(self):
         """
-        Initialize a new CaosDBPythonEntity for the high level python api.
+        Initialize a new LinkAheadPythonEntity for the high level python api.
 
-        Parents are either unresolved references or CaosDB RecordTypes.
+        Parents are either unresolved references or LinkAhead RecordTypes.
 
         Properties are stored directly as attributes for the object.
         Property metadata is maintained in a dctionary _properties_metadata that should
         never be accessed directly, but only using the get_property_metadata function.
         If property values are references to other objects, they will be stored as
-        CaosDBPythonUnresolvedReference objects that can be resolved later into
-        CaosDBPythonRecords.
+        LinkAheadPythonUnresolvedReference objects that can be resolved later into
+        LinkAheadPythonRecords.
         """
 
-        # Parents are either unresolved references or CaosDB RecordTypes
+        # Parents are either unresolved references or LinkAhead RecordTypes
         self._parents: List[Union[
-            CaosDBPythonUnresolvedParent, CaosDBPythonRecordType]] = []
-        # self._id: int = CaosDBPythonEntity._get_new_id()
+            LinkAheadPythonUnresolvedParent, LinkAheadPythonRecordType]] = []
+        # self._id: int = LinkAheadPythonEntity._get_new_id()
         self._id: Optional[int] = None
         self._name: Optional[str] = None
         self._description: Optional[str] = None
@@ -176,7 +174,7 @@ class CaosDBPythonEntity(object):
         self._path: Optional[str] = None
 
         # name: name of property, value: property metadata
-        self._properties_metadata: Dict[CaosDBPropertyMetaData] = dict()
+        self._properties_metadata: Dict[LinkAheadPropertyMetaData] = dict()
 
         # Store all current attributes as forbidden attributes
         # which must not be changed by the set_property function.
@@ -213,14 +211,14 @@ class CaosDBPythonEntity(object):
         """
         Getter for the file.
         """
-        if type(self) != CaosDBPythonFile:
+        if type(self) != LinkAheadPythonFile:
             raise RuntimeError("Please don't use the file attribute for entities"
                                " that are no files.")
         return self._file
 
     @file.setter
     def file(self, val: str):
-        if val is not None and type(self) != CaosDBPythonFile:
+        if val is not None and type(self) != LinkAheadPythonFile:
             raise RuntimeError("Please don't use the file attribute for entities"
                                " that are no files.")
         self._file = val
@@ -230,14 +228,14 @@ class CaosDBPythonEntity(object):
         """
         Getter for the path.
         """
-        if type(self) != CaosDBPythonFile:
+        if type(self) != LinkAheadPythonFile:
             raise RuntimeError("Please don't use the path attribute for entities"
                                " that are no files.")
         return self._path
 
     @path.setter
     def path(self, val: str):
-        if val is not None and type(self) != CaosDBPythonFile:
+        if val is not None and type(self) != LinkAheadPythonFile:
             raise RuntimeError("Please don't use the path attribute for entities"
                                " that are no files.")
         self._path = val
@@ -266,7 +264,7 @@ class CaosDBPythonEntity(object):
 
     def _set_property_from_entity(self, ent: db.Entity, importance: str,
                                   references: Optional[db.Container],
-                                  visited: Dict[int, "CaosDBPythonEntity"]):
+                                  visited: Dict[int, "LinkAheadPythonEntity"]):
         """
         Set a new property using an entity from the normal python API.
 
@@ -295,7 +293,7 @@ class CaosDBPythonEntity(object):
             else:
                 metadata.__setattr__(k, ent.__getattribute__(k))
 
-    def get_property_metadata(self, prop_name: str) -> CaosDBPropertyMetaData:
+    def get_property_metadata(self, prop_name: str) -> LinkAheadPropertyMetaData:
         """
         Retrieve the property metadata for the property with name prop_name.
 
@@ -313,7 +311,7 @@ class CaosDBPythonEntity(object):
             raise RuntimeError("The property with name {} does not exist.".format(prop_name))
 
         if prop_name not in self._properties_metadata:
-            self._properties_metadata[prop_name] = CaosDBPropertyMetaData()
+            self._properties_metadata[prop_name] = LinkAheadPropertyMetaData()
 
         return self._properties_metadata[prop_name]
 
@@ -384,7 +382,7 @@ class CaosDBPythonEntity(object):
                              val: List,
                              pr: str,
                              references: Optional[db.Container],
-                             visited: Dict[int, "CaosDBPythonEntity"]):
+                             visited: Dict[int, "LinkAheadPythonEntity"]):
         """
         Convert a list to a python list of the correct type.
 
@@ -405,12 +403,12 @@ class CaosDBPythonEntity(object):
                               val: Any,
                               pr: str,
                               references: Optional[db.Container],
-                              visited: Dict[int, "CaosDBPythonEntity"]):
+                              visited: Dict[int, "LinkAheadPythonEntity"]):
         """
         Convert val to the correct type which is indicated by the database
         type string in pr.
 
-        References with ids will be turned into CaosDBPythonUnresolvedReference.
+        References with ids will be turned into LinkAheadPythonUnresolvedReference.
         """
 
         if val is None:
@@ -433,16 +431,16 @@ class CaosDBPythonEntity(object):
         elif pr == TEXT:
             return str(val)
         elif pr == FILE:
-            return CaosDBPythonUnresolvedReference(val)
+            return LinkAheadPythonUnresolvedReference(val)
         elif pr == REFERENCE:
-            return CaosDBPythonUnresolvedReference(val)
+            return LinkAheadPythonUnresolvedReference(val)
         elif pr == DATETIME:
             return self._parse_datetime(val)
         elif is_list_datatype(pr):
             return self._type_converted_list(val, pr, references, visited)
         else:
             # Generic references to entities:
-            return CaosDBPythonUnresolvedReference(val)
+            return LinkAheadPythonUnresolvedReference(val)
 
     def _parse_datetime(self, val: Union[str, datetime]):
         """
@@ -479,7 +477,7 @@ class CaosDBPythonEntity(object):
             return [att]
 
     def add_parent(self, parent: Union[
-            CaosDBPythonUnresolvedParent, "CaosDBPythonRecordType", str]):
+            LinkAheadPythonUnresolvedParent, "LinkAheadPythonRecordType", str]):
         """
         Add a parent to this entity. Either using an unresolved parent or
         using a real record type.
@@ -490,10 +488,10 @@ class CaosDBPythonEntity(object):
         """
 
         if isinstance(parent, str):
-            parent = CaosDBPythonUnresolvedParent(name=parent)
+            parent = LinkAheadPythonUnresolvedParent(name=parent)
 
         if isinstance(parent, int):
-            parent = CaosDBPythonUnresolvedParent(id=parent)
+            parent = LinkAheadPythonUnresolvedParent(id=parent)
 
         if self.has_parent(parent):
             raise RuntimeError("Duplicate parent.")
@@ -509,7 +507,7 @@ class CaosDBPythonEntity(object):
         return self._parents
 
     def has_parent(self, parent: Union[
-            CaosDBPythonUnresolvedParent, "CaosDBPythonRecordType"]):
+            LinkAheadPythonUnresolvedParent, "LinkAheadPythonRecordType"]):
         """
         Check whether this parent already exists for this entity.
 
@@ -519,10 +517,10 @@ class CaosDBPythonEntity(object):
         """
 
         if isinstance(parent, str):
-            parent = CaosDBPythonUnresolvedParent(name=parent)
+            parent = LinkAheadPythonUnresolvedParent(name=parent)
 
         if isinstance(parent, int):
-            parent = CaosDBPythonUnresolvedParent(id=parent)
+            parent = LinkAheadPythonUnresolvedParent(id=parent)
 
         for p in self._parents:
             if p.id is not None and p.id == parent.id:
@@ -531,8 +529,8 @@ class CaosDBPythonEntity(object):
                 return True
         return False
 
-    def _resolve_caosdb_python_unresolved_reference(self, propval, deep,
-                                                    references, visited):
+    def _resolve_linkahead_python_unresolved_reference(self, propval, deep,
+                                                       references, visited):
         # This does not make sense for unset ids:
         if propval.id is None:
             raise RuntimeError("Unresolved property reference without an ID.")
@@ -565,7 +563,7 @@ class CaosDBPythonEntity(object):
 
     def resolve_references(self, deep: bool, references: db.Container,
                            visited: Optional[Dict[Union[str, int],
-                                                  "CaosDBPythonEntity"]] = None):
+                                                  "LinkAheadPythonEntity"]] = None):
         """
         Resolve this entity's references. This affects unresolved properties as well
         as unresolved parents.
@@ -576,7 +574,7 @@ class CaosDBPythonEntity(object):
         references: Optional[db.Container]
                     A container with references that might be resolved.
                     If None is passed as the container, this function tries to resolve entities from a running
-                    CaosDB instance directly.
+                    LinkAhead instance directly.
         """
 
         # This parameter is used in the recursion to keep track of already visited
@@ -586,31 +584,31 @@ class CaosDBPythonEntity(object):
 
         for parent in self.get_parents():
             # TODO
-            if isinstance(parent, CaosDBPythonUnresolvedParent):
+            if isinstance(parent, LinkAheadPythonUnresolvedParent):
                 pass
 
         for prop in self.get_properties():
             propval = self.__getattribute__(prop)
             # Resolve all previously unresolved attributes that are entities:
-            if deep and isinstance(propval, CaosDBPythonEntity):
+            if deep and isinstance(propval, LinkAheadPythonEntity):
                 propval.resolve_references(deep, references)
             elif isinstance(propval, list):
                 resolvedelements = []
                 for element in propval:
-                    if deep and isinstance(element, CaosDBPythonEntity):
+                    if deep and isinstance(element, LinkAheadPythonEntity):
                         element.resolve_references(deep, references)
                         resolvedelements.append(element)
-                    if isinstance(element, CaosDBPythonUnresolvedReference):
+                    if isinstance(element, LinkAheadPythonUnresolvedReference):
                         resolvedelements.append(
-                            self._resolve_caosdb_python_unresolved_reference(element, deep,
-                                                                             references, visited))
+                            self._resolve_linkahead_python_unresolved_reference(element, deep,
+                                                                                references, visited))
                     else:
                         resolvedelements.append(element)
                 self.__setattr__(prop, resolvedelements)
 
-            elif isinstance(propval, CaosDBPythonUnresolvedReference):
-                val = self._resolve_caosdb_python_unresolved_reference(propval, deep,
-                                                                       references, visited)
+            elif isinstance(propval, LinkAheadPythonUnresolvedReference):
+                val = self._resolve_linkahead_python_unresolved_reference(propval, deep,
+                                                                          references, visited)
                 self.__setattr__(prop, val)
 
     def get_properties(self):
@@ -630,7 +628,7 @@ class CaosDBPythonEntity(object):
         if "role" in serialization:
             entity = high_level_type_for_role(serialization["role"])()
         else:
-            entity = CaosDBPythonRecord()
+            entity = LinkAheadPythonRecord()
 
         if "parents" in serialization:
             for parent in serialization["parents"]:
@@ -641,7 +639,7 @@ class CaosDBPythonEntity(object):
                         id = parent["id"]
                     if "name" in parent:
                         name = parent["name"]
-                    entity.add_parent(CaosDBPythonUnresolvedParent(
+                    entity.add_parent(LinkAheadPythonUnresolvedParent(
                         id=id, name=name))
                 else:
                     raise NotImplementedError(
@@ -651,7 +649,7 @@ class CaosDBPythonEntity(object):
             if baseprop in serialization:
                 entity.__setattr__(baseprop, serialization[baseprop])
 
-        if type(entity) == CaosDBPythonFile:
+        if type(entity) == LinkAheadPythonFile:
             entity.file = serialization["file"]
             entity.path = serialization["path"]
 
@@ -661,7 +659,7 @@ class CaosDBPythonEntity(object):
             prop = serialization["properties"][p]
             if isinstance(prop, dict):
                 if "unresolved" in prop:
-                    entity.__setattr__(p, CaosDBPythonUnresolvedReference(
+                    entity.__setattr__(p, LinkAheadPythonUnresolvedReference(
                         id=prop["id"]))
                 else:
                     entity.__setattr__(p,
@@ -706,13 +704,13 @@ class CaosDBPythonEntity(object):
         fulldict = dict()
         visited[self] = fulldict
 
-        # Add CaosDB role:
+        # Add LinkAhead role:
         fulldict["role"] = standard_type_for_high_level_type(self, True)
 
         for parent in self._parents:
-            if isinstance(parent, CaosDBPythonEntity):
+            if isinstance(parent, LinkAheadPythonEntity):
                 parents.append(parent.serialize(without_metadata, visited))
-            elif isinstance(parent, CaosDBPythonUnresolvedParent):
+            elif isinstance(parent, LinkAheadPythonUnresolvedParent):
                 parents.append({"name": parent.name, "id": parent.id,
                                 "unresolved": True})
             else:
@@ -723,7 +721,7 @@ class CaosDBPythonEntity(object):
             if val is not None:
                 fulldict[baseprop] = val
 
-        if type(self) == CaosDBPythonFile:
+        if type(self) == LinkAheadPythonFile:
             fulldict["file"] = self.file
             fulldict["path"] = self.path
 
@@ -736,19 +734,19 @@ class CaosDBPythonEntity(object):
                     metadata[p][f.name] = val
 
             val = self.get_property(p)
-            if isinstance(val, CaosDBPythonUnresolvedReference):
+            if isinstance(val, LinkAheadPythonUnresolvedReference):
                 properties[p] = {"id": val.id, "unresolved": True}
-            elif isinstance(val, CaosDBPythonEntity):
+            elif isinstance(val, LinkAheadPythonEntity):
                 properties[p] = val.serialize(without_metadata, visited)
             elif isinstance(val, list):
                 serializedelements = []
                 for element in val:
-                    if isinstance(element, CaosDBPythonUnresolvedReference):
+                    if isinstance(element, LinkAheadPythonUnresolvedReference):
                         elm = dict()
                         elm["id"] = element.id
                         elm["unresolved"] = True
                         serializedelements.append(elm)
-                    elif isinstance(element, CaosDBPythonEntity):
+                    elif isinstance(element, LinkAheadPythonEntity):
                         serializedelements.append(
                             element.serialize(without_metadata,
                                               visited))
@@ -775,19 +773,19 @@ class CaosDBPythonEntity(object):
     #     return yaml.dump(self.serialize(True))
 
 
-class CaosDBPythonRecord(CaosDBPythonEntity):
+class LinkAheadPythonRecord(LinkAheadPythonEntity):
     pass
 
 
-class CaosDBPythonRecordType(CaosDBPythonEntity):
+class LinkAheadPythonRecordType(LinkAheadPythonEntity):
     pass
 
 
-class CaosDBPythonProperty(CaosDBPythonEntity):
+class LinkAheadPythonProperty(LinkAheadPythonEntity):
     pass
 
 
-class CaosDBMultiProperty:
+class LinkAheadMultiProperty:
     """
     This implements a multi property using a python list.
     """
@@ -796,7 +794,7 @@ class CaosDBMultiProperty:
         raise NotImplementedError()
 
 
-class CaosDBPythonFile(CaosDBPythonEntity):
+class LinkAheadPythonFile(LinkAheadPythonEntity):
     def download(self, target=None):
         if self.id is None:
             raise RuntimeError("Cannot download file when id is missing.")
@@ -808,14 +806,14 @@ BASE_ATTRIBUTES = (
     "id", "name", "description", "version", "path", "file")
 
 
-def _single_convert_to_python_object(robj: CaosDBPythonEntity,
+def _single_convert_to_python_object(robj: LinkAheadPythonEntity,
                                      entity: db.Entity,
                                      references: Optional[db.Container] = None,
                                      visited: Optional[Dict[int,
-                                                            "CaosDBPythonEntity"]] = None):
+                                                            "LinkAheadPythonEntity"]] = None):
     """
     Convert a db.Entity from the standard API to a (previously created)
-    CaosDBPythonEntity from the high level API.
+    LinkAheadPythonEntity from the high level API.
 
     This method will not resolve any unresolved references, so reference properties
     as well as parents will become unresolved references in the first place.
@@ -823,7 +821,7 @@ def _single_convert_to_python_object(robj: CaosDBPythonEntity,
     The optional third parameter can be used
     to resolve references that occur in the converted entities and resolve them
     to their correct representations. (Entities that are not found remain as
-    CaosDBPythonUnresolvedReferences.)
+    LinkAheadPythonUnresolvedReferences.)
 
     Returns the input object robj.
     """
@@ -850,16 +848,16 @@ def _single_convert_to_python_object(robj: CaosDBPythonEntity,
                                        visited)
 
     for parent in entity.parents:
-        robj.add_parent(CaosDBPythonUnresolvedParent(id=parent.id,
-                                                     name=parent.name))
+        robj.add_parent(LinkAheadPythonUnresolvedParent(id=parent.id,
+                                                        name=parent.name))
 
     return robj
 
 
 def _convert_property_value(propval):
-    if isinstance(propval, CaosDBPythonUnresolvedReference):
+    if isinstance(propval, LinkAheadPythonUnresolvedReference):
         propval = propval.id
-    elif isinstance(propval, CaosDBPythonEntity):
+    elif isinstance(propval, LinkAheadPythonEntity):
         propval = _single_convert_to_entity(
             standard_type_for_high_level_type(propval)(), propval)
     elif isinstance(propval, list):
@@ -871,19 +869,19 @@ def _convert_property_value(propval):
 
 
 def _single_convert_to_entity(entity: db.Entity,
-                              robj: CaosDBPythonEntity):
+                              robj: LinkAheadPythonEntity):
     """
-    Convert a CaosDBPythonEntity to an entity in standard pylib format.
+    Convert a LinkAheadPythonEntity to an entity in standard pylib format.
 
     entity: db.Entity
             An empty entity.
 
-    robj: CaosDBPythonEntity
-          The CaosDBPythonEntity that is supposed to be converted to the entity.
+    robj: LinkAheadPythonEntity
+          The LinkAheadPythonEntity that is supposed to be converted to the entity.
     """
 
     for base_attribute in BASE_ATTRIBUTES:
-        if base_attribute in ("file", "path") and not isinstance(robj, CaosDBPythonFile):
+        if base_attribute in ("file", "path") and not isinstance(robj, LinkAheadPythonFile):
             continue
 
         # Skip version:
@@ -896,9 +894,9 @@ def _single_convert_to_entity(entity: db.Entity,
             entity.__setattr__(base_attribute, val)
 
     for parent in robj.get_parents():
-        if isinstance(parent, CaosDBPythonUnresolvedParent):
+        if isinstance(parent, LinkAheadPythonUnresolvedParent):
             entity.add_parent(name=parent.name, id=parent.id)
-        elif isinstance(parent, CaosDBPythonRecordType):
+        elif isinstance(parent, LinkAheadPythonRecordType):
             raise NotImplementedError()
         else:
             raise RuntimeError("Incompatible class used as parent.")
@@ -926,15 +924,15 @@ def convert_to_entity(python_object):
         # Create a list of objects:
 
         return [convert_to_entity(i) for i in python_object]
-    elif isinstance(python_object, CaosDBPythonRecord):
+    elif isinstance(python_object, LinkAheadPythonRecord):
         return _single_convert_to_entity(db.Record(), python_object)
-    elif isinstance(python_object, CaosDBPythonFile):
+    elif isinstance(python_object, LinkAheadPythonFile):
         return _single_convert_to_entity(db.File(), python_object)
-    elif isinstance(python_object, CaosDBPythonRecordType):
+    elif isinstance(python_object, LinkAheadPythonRecordType):
         return _single_convert_to_entity(db.RecordType(), python_object)
-    elif isinstance(python_object, CaosDBPythonProperty):
+    elif isinstance(python_object, LinkAheadPythonProperty):
         return _single_convert_to_entity(db.Property(), python_object)
-    elif isinstance(python_object, CaosDBPythonEntity):
+    elif isinstance(python_object, LinkAheadPythonEntity):
         return _single_convert_to_entity(db.Entity(), python_object)
     else:
         raise ValueError("Cannot convert an object of this type.")
@@ -943,15 +941,15 @@ def convert_to_entity(python_object):
 def convert_to_python_object(entity: Union[db.Container, db.Entity],
                              references: Optional[db.Container] = None,
                              visited: Optional[Dict[int,
-                                                    "CaosDBPythonEntity"]] = None):
+                                                    "LinkAheadPythonEntity"]] = None):
     """
-    Convert either a container of CaosDB entities or a single CaosDB entity
+    Convert either a container of LinkAhead entities or a single LinkAhead entity
     into the high level representation.
 
     The optional second parameter can be used
     to resolve references that occur in the converted entities and resolve them
     to their correct representations. (Entities that are not found remain as
-    CaosDBPythonUnresolvedReferences.)
+    LinkAheadPythonUnresolvedReferences.)
     """
     if isinstance(entity, db.Container):
         # Create a list of objects:
@@ -1028,10 +1026,10 @@ def load_external_record(record_name: str):
     return convert_to_python_object(db.Record(name=record_name).retrieve())
 
 
-def create_entity_container(record: CaosDBPythonEntity):
+def create_entity_container(record: LinkAheadPythonEntity):
     """
     Convert this record into an entity container in standard format that can be used
-    to insert or update entities in a running CaosDB instance.
+    to insert or update entities in a running LinkAhead instance.
     """
     ent = convert_to_entity(record)
     lse: List[db.Entity] = [ent]
diff --git a/src/caosdb/schema-pycaosdb-ini.yml b/src/caosdb/schema-pycaosdb-ini.yml
index cb07dfeb..89ce9857 100644
--- a/src/caosdb/schema-pycaosdb-ini.yml
+++ b/src/caosdb/schema-pycaosdb-ini.yml
@@ -10,11 +10,11 @@ schema-pycaosdb-ini:
           type: integer
           enum: [0, 1, 2]
     Connection:
-      description: Settings for the connection to the CaosDB server
+      description: Settings for the connection to the LinkAhead server
       additionalProperties: false
       properties:
         url:
-          description: "URL of the CaosDB server. Allowed are HTTP and HTTPS connections. However, since authentication tokens and sometimes even passwords are send in plain text to the server it is **highly** recommended to use HTTPS connections whenever possible. HTTP is ok for testing and debugging."
+          description: "URL of the LinkAhead server. Allowed are HTTP and HTTPS connections. However, since authentication tokens and sometimes even passwords are send in plain text to the server it is **highly** recommended to use HTTPS connections whenever possible. HTTP is ok for testing and debugging."
           type: string
           pattern: http(s)?://[-a-zA-Z0-9\.]+(:[0-9]+)?(/)?
           examples: ["https://demo.indiscale.com/", "http://localhost:10080/"]
@@ -98,16 +98,16 @@ schema-pycaosdb-ini:
           then:
             required: [url, username]
     IntegrationTests:
-      description: "Used by the integration test suite from the caosdb-pyinttest repo."
+      description: "Used by the integration test suite from the linkahead-pyinttest repo."
       additionalProperties: true
     Misc:
       description: "Some additional configuration settings."
       additionalProperties: true
     advancedtools:
-      description: "Configuration settings for the caosadvancedtools."
+      description: "Configuration settings for the linkahead-advancedtools."
       additionalProperties: true
     caoscrawler:
-      description: "Configuration settings for the CaosDB Crawler."
+      description: "Configuration settings for the LinkAhead Crawler."
       additionalProperties: true
     sss_helper:
       description: "Configuration settings for server-side scripting."
diff --git a/src/caosdb/utils/caosdb_admin.py b/src/caosdb/utils/caosdb_admin.py
deleted file mode 100755
index 09a8f64a..00000000
--- a/src/caosdb/utils/caosdb_admin.py
+++ /dev/null
@@ -1,657 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-#
-# ** header v3.0
-# This file is a part of the CaosDB Project.
-#
-# Copyright (C) 2018 Research Group Biomedical Physics,
-# Max-Planck-Institute for Dynamics and Self-Organization Göttingen
-#
-# 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/>.
-#
-# ** end header
-#
-
-"""A small caosdb client with a focus on administration of the server."""
-
-from __future__ import print_function, unicode_literals
-
-import getpass
-import sys
-from argparse import ArgumentParser, RawDescriptionHelpFormatter
-
-import caosdb as db
-from caosdb import administration as admin
-from caosdb.exceptions import HTTPClientError
-
-__all__ = []
-__version__ = 0.3
-__date__ = '2016-09-19'
-__updated__ = '2018-12-11'
-
-
-def do_update_role(args):
-    admin._update_role(name=args.role_name, description=args.role_description)
-
-
-def do_create_role(args):
-    admin._insert_role(name=args.role_name, description=args.role_description)
-
-
-def do_retrieve_role(args):
-    print(admin._retrieve_role(name=args.role_name))
-
-
-def do_delete_role(args):
-    admin._delete_role(name=args.role_name)
-
-
-def do_retrieve(args):
-    c = None
-
-    if args.query:
-        if len(args.entities) > 1:
-            raise Exception("Only one query at a time can be retrieved.")
-        c = db.execute_query(args.entities[0], flags=eval(args.flags))
-    else:
-        c = db.Container()
-
-        for i in args.entities:
-            try:
-                eid = int(i)
-                c.append(db.Entity(id=eid))
-            except ValueError:
-                c.append(db.Entity(name=i))
-        c.retrieve(flags=eval(args.flags))
-    print(c)
-
-
-def do_update(args):
-    fdict = eval(args.flags)
-    xml = open(args.xml_path, "r")
-    ret = db.get_connection().update(
-        entity_uri_segment=["Entity"], reconnect=True, body=xml)
-    db.Container._response_to_entities(ret)
-
-
-def do_delete(args):
-    c = db.Container()
-
-    for i in args.entities:
-        c.append(db.Entity(id=i))
-
-    c.delete()
-
-
-def do_insert(args):
-    fdict = eval(args.flags)
-    xml = open(args.xml_path, "r")
-    ret = db.get_connection().insert(
-        entity_uri_segment=["Entity"],
-        reconnect=True,
-        query_dict=fdict,
-        body=xml)
-    print(db.Container._response_to_entities(ret))
-
-
-def _promt_for_pw():
-    password = getpass.getpass(prompt="Please type password: ")
-    password2 = getpass.getpass(prompt="Please type password again: ")
-
-    if password != password2:
-        raise Exception("Password strings didn't match")
-
-    return password
-
-
-def do_create_user(args):
-    password = args.user_password
-
-    if args.ask_password is True:
-        password = _promt_for_pw()
-    try:
-        admin._insert_user(name=args.user_name,
-                           email=args.user_email, password=password)
-
-        if args.activate_user:
-            do_activate_user(args)
-    except HTTPClientError as e:
-        print(e.msg)
-
-
-def do_activate_user(args):
-    try:
-        admin._update_user(name=args.user_name, status="ACTIVE")
-    except HTTPClientError as e:
-        print(e.msg)
-
-
-def do_deactivate_user(args):
-    try:
-        admin._update_user(name=args.user_name, status="INACTIVE")
-    except HTTPClientError as e:
-        print(e.msg)
-
-
-def do_set_user_password(args):
-    if args.user_password is None:
-        password = _promt_for_pw()
-    else:
-        password = args.user_password
-    try:
-        admin._update_user(name=args.user_name, password=password)
-    except HTTPClientError as e:
-        print(e.msg)
-
-
-def do_add_user_roles(args):
-    roles = admin._get_roles(username=args.user_name, realm=None)
-
-    for r in args.user_roles:
-        roles.add(r)
-    admin._set_roles(username=args.user_name, roles=roles)
-
-
-def do_remove_user_roles(args):
-    roles = admin._get_roles(username=args.user_name, realm=None)
-
-    for r in args.user_roles:
-        if r in roles:
-            roles.remove(r)
-    admin._set_roles(username=args.user_name, roles=roles)
-
-
-def do_set_user_entity(args):
-    admin._update_user(name=args.user_name, entity=args.user_entity)
-
-
-def do_reset_user_entity(args):
-    admin._update_user(name=args.user_name, entity="")
-
-
-def do_set_user_email(args):
-    admin._update_user(name=args.user_name, email=args.user_email)
-
-
-def do_retrieve_user(args):
-    print(admin._retrieve_user(name=args.user_name))
-
-
-def do_delete_user(args):
-    admin._delete_user(name=args.user_name)
-
-
-def do_retrieve_user_roles(args):
-    print(admin._get_roles(username=args.user_name))
-
-
-def do_retrieve_role_permissions(args):
-    print(admin._get_permissions(role=args.role_name))
-
-
-def do_grant_role_permissions(args):
-    perms = admin._get_permissions(args.role_name)
-
-    for p in args.role_permissions:
-        g = admin.PermissionRule(
-            action="Grant", permission=p, priority=args.permissions_priority)
-        d = admin.PermissionRule(
-            action="Deny", permission=p, priority=args.permissions_priority)
-
-        if g in perms:
-            perms.remove(g)
-
-        if d in perms:
-            perms.remove(d)
-        perms.add(g)
-    admin._set_permissions(role=args.role_name, permission_rules=perms)
-
-
-def do_revoke_role_permissions(args):
-    perms = admin._get_permissions(args.role_name)
-
-    for p in args.role_permissions:
-        g = admin.PermissionRule(
-            action="Grant", permission=p, priority=args.permissions_priority)
-        d = admin.PermissionRule(
-            action="Deny", permission=p, priority=args.permissions_priority)
-
-        if g in perms:
-            perms.remove(g)
-
-        if d in perms:
-            perms.remove(d)
-    admin._set_permissions(role=args.role_name, permission_rules=perms)
-
-
-def do_deny_role_permissions(args):
-    perms = admin._get_permissions(args.role_name)
-
-    for p in args.role_permissions:
-        g = admin.PermissionRule(
-            action="Grant", permission=p, priority=args.permissions_priority)
-        d = admin.PermissionRule(
-            action="Deny", permission=p, priority=args.permissions_priority)
-
-        if g in perms:
-            perms.remove(g)
-
-        if d in perms:
-            perms.remove(d)
-        perms.add(d)
-    admin._set_permissions(role=args.role_name, permission_rules=perms)
-
-
-def do_retrieve_entity_acl(args):
-    entities = db.execute_query(q=args.query, flags={"ACL": None})
-
-    for entity in entities:
-        print(entity.id)
-        print(entity.acl)
-
-
-def do_action_entity_permissions(args):
-    entities = db.execute_query(q=args.query, flags={"ACL": None})
-
-    for entity in entities:
-        for p in args.permissions:
-            getattr(entity, args.action)(role=args.role, priority=args.priority,
-                                         permission=p)
-    entities.update(flags={"ACL": None})
-
-    for entity in entities:
-        print(entity.id)
-        print(entity.acl)
-
-
-def main(argv=None):
-    """Command line options."""
-
-    if argv is None:
-        argv = sys.argv
-    else:
-        sys.argv.extend(argv)
-
-    # program_name = os.path.basename(sys.argv[0])
-    program_version = "v%s" % __version__
-    program_build_date = str(__updated__)
-    program_version_message = '%%(prog)s %s (%s)' % (
-        program_version, program_build_date)
-    program_shortdesc = __import__('__main__').__doc__
-    program_license = '''%s
-
-USAGE
-''' % (program_shortdesc)
-
-    # Setup argument parser
-    parser = ArgumentParser(description=program_license,
-                            formatter_class=RawDescriptionHelpFormatter)
-    parser.add_argument('-V', '--version', action='version',
-                        version=program_version_message)
-    parser.add_argument("--auth-token", metavar="AUTH_TOKEN",
-                        dest="auth_token",
-                        help=("A CaosDB authentication token (default: None). "
-                              "If the authentication token is passed, the "
-                              "`password_method` of the connection is set to "
-                              "`auth_token` and the respective configuration "
-                              "from the pycaosdb.ini is effectively being "
-                              "overridden.\nTODO: Also allow passing the token "
-                              "via environmenty variables."))
-    subparsers = parser.add_subparsers(
-        title="commands",
-        metavar="COMMAND",
-        description="You can invoke the following commands. Print the detailed help for each command with #> caosdb_admin COMMAND -h")
-
-    # users (CRUD)
-    subparser = subparsers.add_parser(
-        "create_user",
-        help="Create a new user in caosdb's internal user database. You need "
-        " to activate the user before use.")
-    subparser.set_defaults(call=do_create_user)
-    mg = subparser.add_mutually_exclusive_group()
-    mg.add_argument("-a", "--ask-password",
-                    help="Prompt for a password.", action="store_true")
-    mg.add_argument(
-        "--password",
-        dest="user_password",
-        default=None,
-        help="Alternative way to provide the new user's password. Please "
-        "consider to use the more secure, interactive way (-a option).")
-    subparser.add_argument("-c", "--activate-user",
-                           help="Activate the user after creation.",
-                           action="store_true")
-    subparser.add_argument(
-        metavar='USERNAME',
-        dest="user_name",
-        help="A user name which is unique in the internal user database.")
-    subparser.add_argument(
-        metavar="EMAIL",
-        nargs='?',
-        dest="user_email",
-        help="The email address of the new user.")
-
-    subparser = subparsers.add_parser(
-        "activate_user", help="(Re-)activate an inactive (but existing) user.")
-    subparser.set_defaults(call=do_activate_user)
-    subparser.add_argument(metavar='USERNAME', dest="user_name",
-                           help="The name of the user who is to be activated.")
-
-    subparser = subparsers.add_parser(
-        "deactivate_user", help="Deactivate an active user.")
-    subparser.set_defaults(call=do_deactivate_user)
-    subparser.add_argument(
-        metavar='USERNAME',
-        dest="user_name",
-        help="The name of the user who is to be deactivated.")
-
-    subparser = subparsers.add_parser(
-        "set_user_password",
-        help="Set a new password for a user. "
-        "By default, you will be prompted for the password.")
-    subparser.set_defaults(call=do_set_user_password)
-    subparser.add_argument(
-        metavar='USERNAME',
-        dest="user_name",
-        help="The name of the user who's password is to be set.")
-    subparser.add_argument(
-        metavar='PASSWORD',
-        nargs="?",
-        dest="user_password",
-        default=None,
-        help="Alternative way to provide the user's new password. "
-        "The more secure (and default way) is to provide it interactively.")
-
-    subparser = subparsers.add_parser(
-        "set_user_entity",
-        help="Associate a user with an existing entity (which should represent a person, a program, an organization or something similar).")
-    subparser.set_defaults(call=do_set_user_entity)
-    subparser.add_argument(
-        metavar='USERNAME',
-        dest="user_name",
-        help="The name of the user who's associated entity you want to set.")
-    subparser.add_argument(metavar='ENTITY', dest="user_entity",
-                           help="An ID of an existing entity.")
-
-    subparser = subparsers.add_parser(
-        "reset_user_entity",
-        help="Terminate the association of a user with an entity.")
-    subparser.set_defaults(call=do_reset_user_entity)
-    subparser.add_argument(
-        metavar='USERNAME',
-        dest="user_name",
-        help="The name of the user who's associated entity you want to reset.")
-
-    subparser = subparsers.add_parser(
-        "set_user_email", help="Set a new email for a user.")
-    subparser.set_defaults(call=do_set_user_email)
-    subparser.add_argument(
-        metavar='USERNAME',
-        dest="user_name",
-        help="The name of the user who's email is to be set.")
-    subparser.add_argument(
-        metavar='EMAIL',
-        dest="user_email",
-        help="The name of the user who's email is to be set.")
-
-    subparser = subparsers.add_parser(
-        "retrieve_user", help="Retrieve a user (email, entity)")
-    subparser.set_defaults(call=do_retrieve_user)
-    subparser.add_argument(
-        metavar='USERNAME', dest="user_name", help="The name of the user.")
-
-    subparser = subparsers.add_parser(
-        "delete_user",
-        help="Delete a user from caosdb's internal user database.")
-    subparser.set_defaults(call=do_delete_user)
-    subparser.add_argument(metavar='USERNAME', dest="user_name",
-                           help="The name of the user who is to be deleted.")
-
-    # user roles
-    subparser = subparsers.add_parser(
-        "add_user_roles", help="Extend the roles of a user.")
-    subparser.set_defaults(call=do_add_user_roles)
-    subparser.add_argument(
-        metavar='USERNAME',
-        dest="user_name",
-        help="The name of the user who's roles are to be extended.")
-    subparser.add_argument(
-        metavar='ROLES',
-        dest="user_roles",
-        nargs='+',
-        help="A space separated list of (existing) roles.")
-
-    subparser = subparsers.add_parser(
-        "remove_user_roles", help="Remove some of the roles of a user.")
-    subparser.set_defaults(call=do_remove_user_roles)
-    subparser.add_argument(
-        metavar='USERNAME',
-        dest="user_name",
-        help="The name of the user from whom you want to take some roles away.")
-    subparser.add_argument(
-        metavar='ROLES',
-        dest="user_roles",
-        nargs='+',
-        help="A space separated list of (existing) roles.")
-
-    subparser = subparsers.add_parser(
-        "retrieve_user_roles", help="Retrieve a user's roles.")
-    subparser.set_defaults(call=do_retrieve_user_roles)
-    subparser.add_argument(
-        metavar='USERNAME', dest="user_name", help="The name of the user.")
-
-    # role permissions
-    subparser = subparsers.add_parser(
-        "retrieve_role_permissions",
-        help="Retrieve the set of permission rules of a role.")
-    subparser.set_defaults(call=do_retrieve_role_permissions)
-    subparser.add_argument(
-        metavar='ROLE',
-        dest="role_name",
-        help="The name of the role which permissions are to be retrieved.")
-
-    subparser = subparsers.add_parser(
-        "grant_role_permissions", help="Grant permissions to a role.")
-    subparser.set_defaults(call=do_grant_role_permissions)
-    subparser.add_argument(
-        '--priority',
-        dest="permissions_priority",
-        action="store_true",
-        default=False,
-        help="This flag enables priority permission rules.")
-    subparser.add_argument(
-        metavar='ROLE',
-        dest="role_name",
-        help="The name of the role to which the permissions are to be granted.")
-    subparser.add_argument(
-        metavar='PERMISSIONS',
-        dest="role_permissions",
-        nargs='+',
-        help="A space separated list of permissions.")
-
-    subparser = subparsers.add_parser(
-        "revoke_role_permissions",
-        help="Remove previously granted or denied permissions from a role.")
-    subparser.set_defaults(call=do_revoke_role_permissions)
-    subparser.add_argument(
-        '--priority',
-        dest="permissions_priority",
-        action="store_true",
-        default=False,
-        help="This flag is needed to revoke priority permissions.")
-    subparser.add_argument(
-        metavar='ROLE',
-        dest="role_name",
-        help="The name of the role from which you want to revoke permissions.")
-    subparser.add_argument(
-        metavar='PERMISSIONS',
-        dest="role_permissions",
-        nargs='+',
-        help="A space separated list of permissions.")
-
-    subparser = subparsers.add_parser(
-        "deny_role_permissions", help="Deny a role permissions.")
-    subparser.set_defaults(call=do_deny_role_permissions)
-    subparser.add_argument(
-        '--priority',
-        dest="permissions_priority",
-        action="store_true",
-        default=False,
-        help="This flag enables priority permission rules.")
-    subparser.add_argument(
-        metavar='ROLE',
-        dest="role_name",
-        help="The name of the role which you want to deny permissions.")
-    subparser.add_argument(
-        metavar='PERMISSIONS',
-        dest="role_permissions",
-        nargs='+',
-        help="A space separated list of permissions.")
-
-    # entities (CRUD)
-    subparser = subparsers.add_parser("insert", help="Insert entities.")
-    subparser.set_defaults(call=do_insert)
-    subparser.add_argument(
-        '-f',
-        '--flags',
-        dest="flags",
-        help="A python dictionary (dict) with flag keys and their values.",
-        metavar="FLAGS",
-        default="{}")
-    subparser.add_argument(metavar='PATH', dest="xml_path",
-                           help="Path to an xml file.")
-
-    subparser = subparsers.add_parser("retrieve", help="Retrieve entities.")
-    subparser.set_defaults(call=do_retrieve)
-    subparser.add_argument(
-        '-f',
-        '--flags',
-        dest="flags",
-        help="A python dictionary (dict) with flag keys and their values.",
-        metavar="FLAGS",
-        default="{}")
-    subparser.add_argument('-q', '--query', dest='query', action="store_true",
-                           help="If the ENTITIES argument is a query.")
-    subparser.add_argument(metavar='ENTITIES', dest="entities", nargs='+',
-                           help="A space separated list of ids or names of"
-                           "entities or ai single query.")
-
-    subparser = subparsers.add_parser("update", help="Update entities.")
-    subparser.set_defaults(call=do_update)
-    subparser.add_argument(
-        '-f',
-        '--flags',
-        dest="flags",
-        help="A python dictionary (dict) with flag keys and their values.",
-        metavar="FLAGS",
-        default="{}")
-    subparser.add_argument(metavar='PATH', dest="xml_path",
-                           help="Path to an xml file.")
-
-    subparser = subparsers.add_parser("delete", help="Delete entities.")
-    subparser.set_defaults(call=do_delete)
-    subparser.add_argument(
-        '-f',
-        '--flags',
-        dest="flags",
-        help="A python dictionary (dict) with flag keys and their values.",
-        metavar="FLAGS",
-        default="{}")
-    subparser.add_argument(
-        metavar='ENTITIES',
-        dest="entities",
-        nargs='+',
-        help="A space separated list of ids or names of entities.")
-
-    # roles (CRUD)
-    create_role_parser = subparsers.add_parser(
-        "create_role", help="Create a new role.")
-    create_role_parser.set_defaults(call=do_create_role)
-    create_role_parser.add_argument(
-        dest="role_name", metavar="ROLENAME", help="The name of the new role.")
-    create_role_parser.add_argument(
-        dest="role_description",
-        metavar="DESCRIPTION",
-        help="A description of the role's purpose, it's intended use case, characteristics of the users who have this role, etc.")
-
-    retrieve_role_parser = subparsers.add_parser(
-        "retrieve_role", help="Retrieve the description of an existing role.")
-    retrieve_role_parser.set_defaults(call=do_retrieve_role)
-    retrieve_role_parser.add_argument(
-        dest="role_name",
-        metavar="ROLENAME",
-        help="The name of the existing role.")
-
-    update_role_parser = subparsers.add_parser(
-        "update_role", help="Change the description of an existing role.")
-    update_role_parser.set_defaults(call=do_update_role)
-    update_role_parser.add_argument(
-        dest="role_name",
-        metavar="ROLENAME",
-        help="The name of the existing role.")
-    update_role_parser.add_argument(
-        dest="role_description",
-        metavar="DESCRIPTION",
-        help="A new description of the role's purpose, it's intended use case, characteristics of the users who have this role, etc.")
-
-    delete_role_parser = subparsers.add_parser(
-        "delete_role", help="Delete a role.")
-    delete_role_parser.set_defaults(call=do_delete_role)
-    delete_role_parser.add_argument(
-        dest="role_name",
-        metavar="ROLENAME",
-        help="The name of the existing role.")
-
-    # entity acl
-    retrieve_entity_acl_parser = subparsers.add_parser(
-        "retrieve_entity_acl", help="Retrieve an entity ACL.")
-    retrieve_entity_acl_parser.set_defaults(call=do_retrieve_entity_acl)
-    retrieve_entity_acl_parser.add_argument(dest="query", metavar="QUERY",
-                                            help="A FIND query.")
-
-    for action in ["grant", "deny", "revoke_denial", "revoke_grant"]:
-        action_entity_permissions_parser = subparsers.add_parser(
-            f"{action}_entity_permissions",
-            help=f"{action} entity permissions to one or more Entities.")
-        action_entity_permissions_parser.set_defaults(
-            call=do_action_entity_permissions, action=action)
-        action_entity_permissions_parser.add_argument(dest="query", metavar="QUERY",
-                                                      help="A FIND query.")
-        action_entity_permissions_parser.add_argument(dest="role", metavar="ROLE",
-                                                      help="The name of an exising role.")
-        action_entity_permissions_parser.add_argument(
-            dest="permissions",
-            metavar="PERMISSION",
-            help="A list of permissions",
-            nargs='+')
-        action_entity_permissions_parser.add_argument(
-            '--priority',
-            dest="priority",
-            action="store_true",
-            default=False,
-            help="This flag enables priority permission rules.")
-
-    # Process arguments
-    args = parser.parse_args()
-    auth_token = args.auth_token
-    if auth_token is not None:
-        db.configure_connection(password_method="auth_token",
-                                auth_token=auth_token)
-    else:
-        db.configure_connection()
-
-    return args.call(args)
-
-
-if __name__ == "__main__":
-    sys.exit(main())
diff --git a/src/caosdb/utils/caosdb_admin.py b/src/caosdb/utils/caosdb_admin.py
new file mode 120000
index 00000000..739e6aba
--- /dev/null
+++ b/src/caosdb/utils/caosdb_admin.py
@@ -0,0 +1 @@
+linkahead_admin.py
\ No newline at end of file
diff --git a/src/caosdb/utils/checkFileSystemConsistency.py b/src/caosdb/utils/checkFileSystemConsistency.py
index 6c053fdc..29d03dd5 100755
--- a/src/caosdb/utils/checkFileSystemConsistency.py
+++ b/src/caosdb/utils/checkFileSystemConsistency.py
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -26,12 +26,11 @@
 """requests the server to execute checkFileSystemConsistency job."""
 
 import sys
-import caosdb as db
+import linkahead as db
 
 from argparse import ArgumentParser
 from argparse import RawDescriptionHelpFormatter
 
-__all__ = []
 __version__ = 0.1
 __date__ = '2016-08-31'
 __updated__ = '2016-09-01'
@@ -52,7 +51,7 @@ class CLIError(Exception):
 
 
 def runCheck(timeout, location):
-    """ Request the caosdb server to check the file system for consistency.
+    """ Request the LinkAhead server to check the file system for consistency.
 
     location == None means that the whole file system is being checked.
     Otherwise only a the directory tree under location is being checked.
diff --git a/src/caosdb/utils/create_revision.py b/src/caosdb/utils/create_revision.py
index 419e1c9f..5f6ecc81 100644
--- a/src/caosdb/utils/create_revision.py
+++ b/src/caosdb/utils/create_revision.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -23,8 +23,8 @@
 #
 
 """provides utilities for creating revisions of database entries."""
-import caosdb as db
-from caosdb import INTEGER, LIST
+import linkahead as db
+from linkahead import INTEGER, LIST
 
 
 def bend_references(from_id, to_id, except_for=None):
diff --git a/src/caosdb/utils/get_entity.py b/src/caosdb/utils/get_entity.py
index a27aafa9..ea9f3228 100644
--- a/src/caosdb/utils/get_entity.py
+++ b/src/caosdb/utils/get_entity.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2023 Henrik tom Wörden <h.tomwoerden@indiscale.com>
 # Copyright (C) 2023 IndiScale GmbH <info@indiscale.com>
diff --git a/src/caosdb/utils/linkahead_admin.py b/src/caosdb/utils/linkahead_admin.py
new file mode 100755
index 00000000..f7e3b8b6
--- /dev/null
+++ b/src/caosdb/utils/linkahead_admin.py
@@ -0,0 +1,657 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# ** header v3.0
+# This file is a part of the LinkAhead Project.
+#
+# Copyright (C) 2018 Research Group Biomedical Physics,
+# Max-Planck-Institute for Dynamics and Self-Organization Göttingen
+#
+# 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/>.
+#
+# ** end header
+#
+
+"""A small LinkAhead client with a focus on administration of the server."""
+
+from __future__ import print_function, unicode_literals
+
+import getpass
+import sys
+from argparse import ArgumentParser, RawDescriptionHelpFormatter
+
+import linkahead as db
+from linkahead import administration as admin
+from linkahead.exceptions import HTTPClientError
+
+__all__ = []
+__version__ = 0.3
+__date__ = '2016-09-19'
+__updated__ = '2018-12-11'
+
+
+def do_update_role(args):
+    admin._update_role(name=args.role_name, description=args.role_description)
+
+
+def do_create_role(args):
+    admin._insert_role(name=args.role_name, description=args.role_description)
+
+
+def do_retrieve_role(args):
+    print(admin._retrieve_role(name=args.role_name))
+
+
+def do_delete_role(args):
+    admin._delete_role(name=args.role_name)
+
+
+def do_retrieve(args):
+    c = None
+
+    if args.query:
+        if len(args.entities) > 1:
+            raise Exception("Only one query at a time can be retrieved.")
+        c = db.execute_query(args.entities[0], flags=eval(args.flags))
+    else:
+        c = db.Container()
+
+        for i in args.entities:
+            try:
+                eid = int(i)
+                c.append(db.Entity(id=eid))
+            except ValueError:
+                c.append(db.Entity(name=i))
+        c.retrieve(flags=eval(args.flags))
+    print(c)
+
+
+def do_update(args):
+    fdict = eval(args.flags)
+    xml = open(args.xml_path, "r")
+    ret = db.get_connection().update(
+        entity_uri_segment=["Entity"], reconnect=True, body=xml)
+    db.Container._response_to_entities(ret)
+
+
+def do_delete(args):
+    c = db.Container()
+
+    for i in args.entities:
+        c.append(db.Entity(id=i))
+
+    c.delete()
+
+
+def do_insert(args):
+    fdict = eval(args.flags)
+    xml = open(args.xml_path, "r")
+    ret = db.get_connection().insert(
+        entity_uri_segment=["Entity"],
+        reconnect=True,
+        query_dict=fdict,
+        body=xml)
+    print(db.Container._response_to_entities(ret))
+
+
+def _promt_for_pw():
+    password = getpass.getpass(prompt="Please type password: ")
+    password2 = getpass.getpass(prompt="Please type password again: ")
+
+    if password != password2:
+        raise Exception("Password strings didn't match")
+
+    return password
+
+
+def do_create_user(args):
+    password = args.user_password
+
+    if args.ask_password is True:
+        password = _promt_for_pw()
+    try:
+        admin._insert_user(name=args.user_name,
+                           email=args.user_email, password=password)
+
+        if args.activate_user:
+            do_activate_user(args)
+    except HTTPClientError as e:
+        print(e.msg)
+
+
+def do_activate_user(args):
+    try:
+        admin._update_user(name=args.user_name, status="ACTIVE")
+    except HTTPClientError as e:
+        print(e.msg)
+
+
+def do_deactivate_user(args):
+    try:
+        admin._update_user(name=args.user_name, status="INACTIVE")
+    except HTTPClientError as e:
+        print(e.msg)
+
+
+def do_set_user_password(args):
+    if args.user_password is None:
+        password = _promt_for_pw()
+    else:
+        password = args.user_password
+    try:
+        admin._update_user(name=args.user_name, password=password)
+    except HTTPClientError as e:
+        print(e.msg)
+
+
+def do_add_user_roles(args):
+    roles = admin._get_roles(username=args.user_name, realm=None)
+
+    for r in args.user_roles:
+        roles.add(r)
+    admin._set_roles(username=args.user_name, roles=roles)
+
+
+def do_remove_user_roles(args):
+    roles = admin._get_roles(username=args.user_name, realm=None)
+
+    for r in args.user_roles:
+        if r in roles:
+            roles.remove(r)
+    admin._set_roles(username=args.user_name, roles=roles)
+
+
+def do_set_user_entity(args):
+    admin._update_user(name=args.user_name, entity=args.user_entity)
+
+
+def do_reset_user_entity(args):
+    admin._update_user(name=args.user_name, entity="")
+
+
+def do_set_user_email(args):
+    admin._update_user(name=args.user_name, email=args.user_email)
+
+
+def do_retrieve_user(args):
+    print(admin._retrieve_user(name=args.user_name))
+
+
+def do_delete_user(args):
+    admin._delete_user(name=args.user_name)
+
+
+def do_retrieve_user_roles(args):
+    print(admin._get_roles(username=args.user_name))
+
+
+def do_retrieve_role_permissions(args):
+    print(admin._get_permissions(role=args.role_name))
+
+
+def do_grant_role_permissions(args):
+    perms = admin._get_permissions(args.role_name)
+
+    for p in args.role_permissions:
+        g = admin.PermissionRule(
+            action="Grant", permission=p, priority=args.permissions_priority)
+        d = admin.PermissionRule(
+            action="Deny", permission=p, priority=args.permissions_priority)
+
+        if g in perms:
+            perms.remove(g)
+
+        if d in perms:
+            perms.remove(d)
+        perms.add(g)
+    admin._set_permissions(role=args.role_name, permission_rules=perms)
+
+
+def do_revoke_role_permissions(args):
+    perms = admin._get_permissions(args.role_name)
+
+    for p in args.role_permissions:
+        g = admin.PermissionRule(
+            action="Grant", permission=p, priority=args.permissions_priority)
+        d = admin.PermissionRule(
+            action="Deny", permission=p, priority=args.permissions_priority)
+
+        if g in perms:
+            perms.remove(g)
+
+        if d in perms:
+            perms.remove(d)
+    admin._set_permissions(role=args.role_name, permission_rules=perms)
+
+
+def do_deny_role_permissions(args):
+    perms = admin._get_permissions(args.role_name)
+
+    for p in args.role_permissions:
+        g = admin.PermissionRule(
+            action="Grant", permission=p, priority=args.permissions_priority)
+        d = admin.PermissionRule(
+            action="Deny", permission=p, priority=args.permissions_priority)
+
+        if g in perms:
+            perms.remove(g)
+
+        if d in perms:
+            perms.remove(d)
+        perms.add(d)
+    admin._set_permissions(role=args.role_name, permission_rules=perms)
+
+
+def do_retrieve_entity_acl(args):
+    entities = db.execute_query(q=args.query, flags={"ACL": None})
+
+    for entity in entities:
+        print(entity.id)
+        print(entity.acl)
+
+
+def do_action_entity_permissions(args):
+    entities = db.execute_query(q=args.query, flags={"ACL": None})
+
+    for entity in entities:
+        for p in args.permissions:
+            getattr(entity, args.action)(role=args.role, priority=args.priority,
+                                         permission=p)
+    entities.update(flags={"ACL": None})
+
+    for entity in entities:
+        print(entity.id)
+        print(entity.acl)
+
+
+def main(argv=None):
+    """Command line options."""
+
+    if argv is None:
+        argv = sys.argv
+    else:
+        sys.argv.extend(argv)
+
+    # program_name = os.path.basename(sys.argv[0])
+    program_version = "v%s" % __version__
+    program_build_date = str(__updated__)
+    program_version_message = '%%(prog)s %s (%s)' % (
+        program_version, program_build_date)
+    program_shortdesc = __import__('__main__').__doc__
+    program_license = '''%s
+
+USAGE
+''' % (program_shortdesc)
+
+    # Setup argument parser
+    parser = ArgumentParser(description=program_license,
+                            formatter_class=RawDescriptionHelpFormatter)
+    parser.add_argument('-V', '--version', action='version',
+                        version=program_version_message)
+    parser.add_argument("--auth-token", metavar="AUTH_TOKEN",
+                        dest="auth_token",
+                        help=("A LinkAhead authentication token (default: None). "
+                              "If the authentication token is passed, the "
+                              "`password_method` of the connection is set to "
+                              "`auth_token` and the respective configuration "
+                              "from the pylinkahead.ini is effectively being "
+                              "overridden.\nTODO: Also allow passing the token "
+                              "via environmenty variables."))
+    subparsers = parser.add_subparsers(
+        title="commands",
+        metavar="COMMAND",
+        description="You can invoke the following commands. Print the detailed help for each command with #> linkahead_admin COMMAND -h")
+
+    # users (CRUD)
+    subparser = subparsers.add_parser(
+        "create_user",
+        help="Create a new user in LinkAhead's internal user database. You need "
+        " to activate the user before use.")
+    subparser.set_defaults(call=do_create_user)
+    mg = subparser.add_mutually_exclusive_group()
+    mg.add_argument("-a", "--ask-password",
+                    help="Prompt for a password.", action="store_true")
+    mg.add_argument(
+        "--password",
+        dest="user_password",
+        default=None,
+        help="Alternative way to provide the new user's password. Please "
+        "consider to use the more secure, interactive way (-a option).")
+    subparser.add_argument("-c", "--activate-user",
+                           help="Activate the user after creation.",
+                           action="store_true")
+    subparser.add_argument(
+        metavar='USERNAME',
+        dest="user_name",
+        help="A user name which is unique in the internal user database.")
+    subparser.add_argument(
+        metavar="EMAIL",
+        nargs='?',
+        dest="user_email",
+        help="The email address of the new user.")
+
+    subparser = subparsers.add_parser(
+        "activate_user", help="(Re-)activate an inactive (but existing) user.")
+    subparser.set_defaults(call=do_activate_user)
+    subparser.add_argument(metavar='USERNAME', dest="user_name",
+                           help="The name of the user who is to be activated.")
+
+    subparser = subparsers.add_parser(
+        "deactivate_user", help="Deactivate an active user.")
+    subparser.set_defaults(call=do_deactivate_user)
+    subparser.add_argument(
+        metavar='USERNAME',
+        dest="user_name",
+        help="The name of the user who is to be deactivated.")
+
+    subparser = subparsers.add_parser(
+        "set_user_password",
+        help="Set a new password for a user. "
+        "By default, you will be prompted for the password.")
+    subparser.set_defaults(call=do_set_user_password)
+    subparser.add_argument(
+        metavar='USERNAME',
+        dest="user_name",
+        help="The name of the user who's password is to be set.")
+    subparser.add_argument(
+        metavar='PASSWORD',
+        nargs="?",
+        dest="user_password",
+        default=None,
+        help="Alternative way to provide the user's new password. "
+        "The more secure (and default way) is to provide it interactively.")
+
+    subparser = subparsers.add_parser(
+        "set_user_entity",
+        help="Associate a user with an existing entity (which should represent a person, a program, an organization or something similar).")
+    subparser.set_defaults(call=do_set_user_entity)
+    subparser.add_argument(
+        metavar='USERNAME',
+        dest="user_name",
+        help="The name of the user who's associated entity you want to set.")
+    subparser.add_argument(metavar='ENTITY', dest="user_entity",
+                           help="An ID of an existing entity.")
+
+    subparser = subparsers.add_parser(
+        "reset_user_entity",
+        help="Terminate the association of a user with an entity.")
+    subparser.set_defaults(call=do_reset_user_entity)
+    subparser.add_argument(
+        metavar='USERNAME',
+        dest="user_name",
+        help="The name of the user who's associated entity you want to reset.")
+
+    subparser = subparsers.add_parser(
+        "set_user_email", help="Set a new email for a user.")
+    subparser.set_defaults(call=do_set_user_email)
+    subparser.add_argument(
+        metavar='USERNAME',
+        dest="user_name",
+        help="The name of the user who's email is to be set.")
+    subparser.add_argument(
+        metavar='EMAIL',
+        dest="user_email",
+        help="The name of the user who's email is to be set.")
+
+    subparser = subparsers.add_parser(
+        "retrieve_user", help="Retrieve a user (email, entity)")
+    subparser.set_defaults(call=do_retrieve_user)
+    subparser.add_argument(
+        metavar='USERNAME', dest="user_name", help="The name of the user.")
+
+    subparser = subparsers.add_parser(
+        "delete_user",
+        help="Delete a user from linkahead's internal user database.")
+    subparser.set_defaults(call=do_delete_user)
+    subparser.add_argument(metavar='USERNAME', dest="user_name",
+                           help="The name of the user who is to be deleted.")
+
+    # user roles
+    subparser = subparsers.add_parser(
+        "add_user_roles", help="Extend the roles of a user.")
+    subparser.set_defaults(call=do_add_user_roles)
+    subparser.add_argument(
+        metavar='USERNAME',
+        dest="user_name",
+        help="The name of the user who's roles are to be extended.")
+    subparser.add_argument(
+        metavar='ROLES',
+        dest="user_roles",
+        nargs='+',
+        help="A space separated list of (existing) roles.")
+
+    subparser = subparsers.add_parser(
+        "remove_user_roles", help="Remove some of the roles of a user.")
+    subparser.set_defaults(call=do_remove_user_roles)
+    subparser.add_argument(
+        metavar='USERNAME',
+        dest="user_name",
+        help="The name of the user from whom you want to take some roles away.")
+    subparser.add_argument(
+        metavar='ROLES',
+        dest="user_roles",
+        nargs='+',
+        help="A space separated list of (existing) roles.")
+
+    subparser = subparsers.add_parser(
+        "retrieve_user_roles", help="Retrieve a user's roles.")
+    subparser.set_defaults(call=do_retrieve_user_roles)
+    subparser.add_argument(
+        metavar='USERNAME', dest="user_name", help="The name of the user.")
+
+    # role permissions
+    subparser = subparsers.add_parser(
+        "retrieve_role_permissions",
+        help="Retrieve the set of permission rules of a role.")
+    subparser.set_defaults(call=do_retrieve_role_permissions)
+    subparser.add_argument(
+        metavar='ROLE',
+        dest="role_name",
+        help="The name of the role which permissions are to be retrieved.")
+
+    subparser = subparsers.add_parser(
+        "grant_role_permissions", help="Grant permissions to a role.")
+    subparser.set_defaults(call=do_grant_role_permissions)
+    subparser.add_argument(
+        '--priority',
+        dest="permissions_priority",
+        action="store_true",
+        default=False,
+        help="This flag enables priority permission rules.")
+    subparser.add_argument(
+        metavar='ROLE',
+        dest="role_name",
+        help="The name of the role to which the permissions are to be granted.")
+    subparser.add_argument(
+        metavar='PERMISSIONS',
+        dest="role_permissions",
+        nargs='+',
+        help="A space separated list of permissions.")
+
+    subparser = subparsers.add_parser(
+        "revoke_role_permissions",
+        help="Remove previously granted or denied permissions from a role.")
+    subparser.set_defaults(call=do_revoke_role_permissions)
+    subparser.add_argument(
+        '--priority',
+        dest="permissions_priority",
+        action="store_true",
+        default=False,
+        help="This flag is needed to revoke priority permissions.")
+    subparser.add_argument(
+        metavar='ROLE',
+        dest="role_name",
+        help="The name of the role from which you want to revoke permissions.")
+    subparser.add_argument(
+        metavar='PERMISSIONS',
+        dest="role_permissions",
+        nargs='+',
+        help="A space separated list of permissions.")
+
+    subparser = subparsers.add_parser(
+        "deny_role_permissions", help="Deny a role permissions.")
+    subparser.set_defaults(call=do_deny_role_permissions)
+    subparser.add_argument(
+        '--priority',
+        dest="permissions_priority",
+        action="store_true",
+        default=False,
+        help="This flag enables priority permission rules.")
+    subparser.add_argument(
+        metavar='ROLE',
+        dest="role_name",
+        help="The name of the role which you want to deny permissions.")
+    subparser.add_argument(
+        metavar='PERMISSIONS',
+        dest="role_permissions",
+        nargs='+',
+        help="A space separated list of permissions.")
+
+    # entities (CRUD)
+    subparser = subparsers.add_parser("insert", help="Insert entities.")
+    subparser.set_defaults(call=do_insert)
+    subparser.add_argument(
+        '-f',
+        '--flags',
+        dest="flags",
+        help="A python dictionary (dict) with flag keys and their values.",
+        metavar="FLAGS",
+        default="{}")
+    subparser.add_argument(metavar='PATH', dest="xml_path",
+                           help="Path to an xml file.")
+
+    subparser = subparsers.add_parser("retrieve", help="Retrieve entities.")
+    subparser.set_defaults(call=do_retrieve)
+    subparser.add_argument(
+        '-f',
+        '--flags',
+        dest="flags",
+        help="A python dictionary (dict) with flag keys and their values.",
+        metavar="FLAGS",
+        default="{}")
+    subparser.add_argument('-q', '--query', dest='query', action="store_true",
+                           help="If the ENTITIES argument is a query.")
+    subparser.add_argument(metavar='ENTITIES', dest="entities", nargs='+',
+                           help="A space separated list of ids or names of"
+                           "entities or ai single query.")
+
+    subparser = subparsers.add_parser("update", help="Update entities.")
+    subparser.set_defaults(call=do_update)
+    subparser.add_argument(
+        '-f',
+        '--flags',
+        dest="flags",
+        help="A python dictionary (dict) with flag keys and their values.",
+        metavar="FLAGS",
+        default="{}")
+    subparser.add_argument(metavar='PATH', dest="xml_path",
+                           help="Path to an xml file.")
+
+    subparser = subparsers.add_parser("delete", help="Delete entities.")
+    subparser.set_defaults(call=do_delete)
+    subparser.add_argument(
+        '-f',
+        '--flags',
+        dest="flags",
+        help="A python dictionary (dict) with flag keys and their values.",
+        metavar="FLAGS",
+        default="{}")
+    subparser.add_argument(
+        metavar='ENTITIES',
+        dest="entities",
+        nargs='+',
+        help="A space separated list of ids or names of entities.")
+
+    # roles (CRUD)
+    create_role_parser = subparsers.add_parser(
+        "create_role", help="Create a new role.")
+    create_role_parser.set_defaults(call=do_create_role)
+    create_role_parser.add_argument(
+        dest="role_name", metavar="ROLENAME", help="The name of the new role.")
+    create_role_parser.add_argument(
+        dest="role_description",
+        metavar="DESCRIPTION",
+        help="A description of the role's purpose, it's intended use case, characteristics of the users who have this role, etc.")
+
+    retrieve_role_parser = subparsers.add_parser(
+        "retrieve_role", help="Retrieve the description of an existing role.")
+    retrieve_role_parser.set_defaults(call=do_retrieve_role)
+    retrieve_role_parser.add_argument(
+        dest="role_name",
+        metavar="ROLENAME",
+        help="The name of the existing role.")
+
+    update_role_parser = subparsers.add_parser(
+        "update_role", help="Change the description of an existing role.")
+    update_role_parser.set_defaults(call=do_update_role)
+    update_role_parser.add_argument(
+        dest="role_name",
+        metavar="ROLENAME",
+        help="The name of the existing role.")
+    update_role_parser.add_argument(
+        dest="role_description",
+        metavar="DESCRIPTION",
+        help="A new description of the role's purpose, it's intended use case, characteristics of the users who have this role, etc.")
+
+    delete_role_parser = subparsers.add_parser(
+        "delete_role", help="Delete a role.")
+    delete_role_parser.set_defaults(call=do_delete_role)
+    delete_role_parser.add_argument(
+        dest="role_name",
+        metavar="ROLENAME",
+        help="The name of the existing role.")
+
+    # entity acl
+    retrieve_entity_acl_parser = subparsers.add_parser(
+        "retrieve_entity_acl", help="Retrieve an entity ACL.")
+    retrieve_entity_acl_parser.set_defaults(call=do_retrieve_entity_acl)
+    retrieve_entity_acl_parser.add_argument(dest="query", metavar="QUERY",
+                                            help="A FIND query.")
+
+    for action in ["grant", "deny", "revoke_denial", "revoke_grant"]:
+        action_entity_permissions_parser = subparsers.add_parser(
+            f"{action}_entity_permissions",
+            help=f"{action} entity permissions to one or more Entities.")
+        action_entity_permissions_parser.set_defaults(
+            call=do_action_entity_permissions, action=action)
+        action_entity_permissions_parser.add_argument(dest="query", metavar="QUERY",
+                                                      help="A FIND query.")
+        action_entity_permissions_parser.add_argument(dest="role", metavar="ROLE",
+                                                      help="The name of an exising role.")
+        action_entity_permissions_parser.add_argument(
+            dest="permissions",
+            metavar="PERMISSION",
+            help="A list of permissions",
+            nargs='+')
+        action_entity_permissions_parser.add_argument(
+            '--priority',
+            dest="priority",
+            action="store_true",
+            default=False,
+            help="This flag enables priority permission rules.")
+
+    # Process arguments
+    args = parser.parse_args()
+    auth_token = args.auth_token
+    if auth_token is not None:
+        db.configure_connection(password_method="auth_token",
+                                auth_token=auth_token)
+    else:
+        db.configure_connection()
+
+    return args.call(args)
+
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/src/caosdb/utils/plantuml.py b/src/caosdb/utils/plantuml.py
index 6252a489..e5432dce 100644
--- a/src/caosdb/utils/plantuml.py
+++ b/src/caosdb/utils/plantuml.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -36,8 +36,8 @@ plantuml FILENAME.pu -> FILENAME.png
 import os
 import shutil
 
-import caosdb as db
-from caosdb.common.datatype import is_reference, get_referenced_recordtype
+import linkahead as db
+from linkahead.common.datatype import is_reference, get_referenced_recordtype
 
 from typing import List, Optional
 
@@ -113,7 +113,7 @@ def recordtypes_to_plantuml_string(iterable,
 
     Parameters
     ----------
-    iterable: iterable of caosdb.Entity
+    iterable: iterable of linkahead.Entity
       The objects to be rendered with plantuml.
 
     no_shadow : bool, optional
@@ -273,7 +273,7 @@ package \"The property P references an instance of D\" <<Rectangle>> {
 
 
 def retrieve_substructure(start_record_types, depth, result_id_set=None, result_container=None, cleanup=True):
-    """Recursively retrieves CaosDB record types and properties, starting
+    """Recursively retrieves LinkAhead record types and properties, starting
     from given initial types up to a specific depth.
 
     Parameters
diff --git a/src/caosdb/utils/register_tests.py b/src/caosdb/utils/register_tests.py
index 9d0afcbb..6909544f 100644
--- a/src/caosdb/utils/register_tests.py
+++ b/src/caosdb/utils/register_tests.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2022 Alexander Schlemmer <alexander.schlemmer@ds.mpg.de>
 # Copyright (C) 2022 Timm Fitschen <t.fitschen@indiscale.com>
@@ -19,15 +19,15 @@
 # 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/>.
 
-import caosdb as db
-from caosdb import administration as admin
+import linkahead as db
+from linkahead import administration as admin
 
 """
 This module implements a registration procedure for integration tests which
-need a running CaosDB instance.
+need a running LinkAhead instance.
 
-It ensures that tests do not accidentally overwrite data in real CaosDB
-instances, as it checks whether the running CaosDB instance is actually the
+It ensures that tests do not accidentally overwrite data in real LinkAhead
+instances, as it checks whether the running LinkAhead instance is actually the
 correct one, that
 should be used for these tests.
 
@@ -44,7 +44,7 @@ information is stored in one of the server properties or otherwise
 
 NOTE: you probably need to use pytest with the -s option to be able to
       register the test interactively. Otherwise, the server property has to be
-      set before server start-up in the server.conf of the CaosDB server.
+      set before server start-up in the server.conf of the LinkAhead server.
 
 This module is intended to be used with pytest.
 
@@ -65,13 +65,13 @@ def _register_test():
     if not isinstance(res, int):
         raise RuntimeError("Response from server for Info could not be interpreted.")
     if res > 0:
-        raise RuntimeError("This instance of CaosDB contains entities already."
+        raise RuntimeError("This instance of LinkAhead contains entities already."
                            "It must be empty in order to register a new test.")
 
-    print("Current host of CaosDB instance is: {}".format(
+    print("Current host of LinkAhead instance is: {}".format(
         db.connection.connection.get_connection()._delegate_connection.setup_fields["host"]))
     answer = input("This method will register your current test with key {} with the currently"
-                   " running instance of CaosDB. Do you want to continue (y/N)?".format(
+                   " running instance of LinkAhead. Do you want to continue (y/N)?".format(
                        TEST_KEY))
     if answer != "y":
         raise RuntimeError("Test registration aborted by user.")
@@ -102,7 +102,7 @@ def _assure_test_is_registered():
     if TEST_KEY is None:
         raise RuntimeError("TEST_KEY is not defined.")
     if not _is_registered():
-        answer = input("Do you want to register this instance of CaosDB"
+        answer = input("Do you want to register this instance of LinkAhead"
                        " with the current test? Do you want to continue (y/N)?")
         if answer == "y":
             _register_test()
@@ -122,7 +122,7 @@ try:
 
     @pytest.fixture
     def clear_database():
-        """Remove Records, RecordTypes, Properties, and Files ONLY IF the CaosDB
+        """Remove Records, RecordTypes, Properties, and Files ONLY IF the LinkAhead
         server the current connection points to was registered with the appropriate key.
 
         PyTestInfo Records and the corresponding RecordType and Property are preserved.
@@ -133,4 +133,4 @@ try:
 except ImportError:
     raise Warning("""The register_tests module depends on pytest and is
                   intended to be used in integration test suites for the
-                  caosdb-pylib library only.""")
+                  linkahead-pylib library only.""")
diff --git a/src/caosdb/utils/server_side_scripting.py b/src/caosdb/utils/server_side_scripting.py
index 7e5ee439..06caa3d9 100644
--- a/src/caosdb/utils/server_side_scripting.py
+++ b/src/caosdb/utils/server_side_scripting.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
@@ -28,10 +28,10 @@ Helper functions for calling server-side scripts.
 from urllib.parse import quote
 from lxml import etree
 
-from caosdb.connection.connection import get_connection
-from caosdb.connection.utils import urlencode
-from caosdb.connection.encode import (MultipartParam, multipart_encode,
-                                      ReadableMultiparts)
+from linkahead.connection.connection import get_connection
+from linkahead.connection.utils import urlencode
+from linkahead.connection.encode import (MultipartParam, multipart_encode,
+                                         ReadableMultiparts)
 
 
 def _make_params(pos_args, opts):
diff --git a/src/caosdb/yamlapi.py b/src/caosdb/yamlapi.py
index 80bb4b13..8b5eda55 100644
--- a/src/caosdb/yamlapi.py
+++ b/src/caosdb/yamlapi.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -22,22 +22,22 @@
 # ** end header
 #
 
-"""!!! Deprecated !!! YAML interface for the database (caosdb)"""
+"""!!! Deprecated !!! YAML interface for the database (LinkAhead)"""
 
 import yaml
 from lxml import etree
 from lxml.etree import Element
 import re
-import caosdb
-import caosdb.common.utils as utils
-from caosdb.connection.connection import get_connection
+import linkahead
+import linkahead.common.utils as utils
+from linkahead.connection.connection import get_connection
 import warnings
 
 
 def append_sublist(v, newel, def_entity_type):
     warnings.warn("""
                   This function is deprecated and will be removed with the next release.
-                  Please use caosdb-advanced-user-tools/models/data_model.py for a
+                  Please use linkahead-advanced-user-tools/models/data_model.py for a
                   similar functionality.""", DeprecationWarning)
     if v is None:
         return
@@ -53,7 +53,7 @@ def append_sublist(v, newel, def_entity_type):
 def kv_to_xml(k, v):
     warnings.warn("""
                   This function is deprecated and will be removed with the next release.
-                  Please use caosdb-advanced-user-tools/models/data_model.py for a
+                  Please use linkahead-advanced-user-tools/models/data_model.py for a
                   similar functionality.""", DeprecationWarning)
     newel = Element(k)
     # code.interact(local=locals())
@@ -76,11 +76,11 @@ def kv_to_xml(k, v):
 def dict_to_xml(d):
     """
     d: The dictionary (possibly loaded from yaml)
-       to convert to caosdb-xml.
+       to convert to linkahead-xml.
     """
     warnings.warn("""
                   This function is deprecated and will be removed with the next release.
-                  Please use caosdb-advanced-user-tools/models/data_model.py for a
+                  Please use linkahead-advanced-user-tools/models/data_model.py for a
                   similar functionality.""", DeprecationWarning)
     return kv_to_xml("Entities", d)
 
@@ -88,7 +88,7 @@ def dict_to_xml(d):
 def yaml_to_xml(yamlstr):
     warnings.warn("""
                   This function is deprecated and will be removed with the next release.
-                  Please use caosdb-advanced-user-tools/models/data_model.py for a
+                  Please use linkahead-advanced-user-tools/models/data_model.py for a
                   similar functionality.""", DeprecationWarning)
     """Load a yaml document from yamlstr and converts it to XML.
 
@@ -105,7 +105,7 @@ def process(text):
     """Do some replacements on the original file to obtain valid yaml."""
     warnings.warn("""
                   This function is deprecated and will be removed with the next release.
-                  Please use caosdb-advanced-user-tools/models/data_model.py for a
+                  Please use linkahead-advanced-user-tools/models/data_model.py for a
                   similar functionality.""", DeprecationWarning)
     processed = re.sub(
         "^(\\s*)-\\s*\\{?(.*)\\}?\\s*$",
@@ -121,7 +121,7 @@ def process(text):
 def yaml_file_to_xml(yamlfilename):
     warnings.warn("""
                   This function is deprecated and will be removed with the next release.
-                  Please use caosdb-advanced-user-tools/models/data_model.py for a
+                  Please use linkahead-advanced-user-tools/models/data_model.py for a
                   similar functionality.""", DeprecationWarning)
     with open(yamlfilename, "r") as f:
         return yaml_to_xml(process(f.read()))
@@ -135,7 +135,7 @@ def insert_yaml_file(yamlfilename, simulate=False):
     """
     warnings.warn("""
                   This function is deprecated and will be removed with the next release.
-                  Please use caosdb-advanced-user-tools/models/data_model.py for a
+                  Please use linkahead-advanced-user-tools/models/data_model.py for a
                   similar functionality.""", DeprecationWarning)
     con = get_connection()
     prs = etree.XMLParser(remove_blank_text=True)
diff --git a/src/doc/Makefile b/src/doc/Makefile
index 64219c59..f25b8e50 100644
--- a/src/doc/Makefile
+++ b/src/doc/Makefile
@@ -1,5 +1,5 @@
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Daniel Hornung <d.hornung@indiscale.com>
@@ -28,7 +28,7 @@
 SPHINXOPTS    ?= -a
 SPHINXBUILD   ?= sphinx-build
 SPHINXAPIDOC   ?= sphinx-apidoc
-PY_BASEDIR    = ../caosdb
+PY_BASEDIR    = ../linkahead
 SOURCEDIR     = .
 BUILDDIR      = ../../build/doc
 
diff --git a/src/doc/administration.rst b/src/doc/administration.rst
index eab02e43..cef9b694 100644
--- a/src/doc/administration.rst
+++ b/src/doc/administration.rst
@@ -1,16 +1,16 @@
 Administration
 ==============
 
-The Python script ``caosdb_admin.py`` should be used for administrative tasks.
-Call ``caosdb_admin.py --help`` to see how to use it.
+The Python script ``linkahead_admin.py`` should be used for administrative tasks.
+Call ``linkahead_admin.py --help`` to see how to use it.
 
-The most common task is to create a new user (in the CaosDB realm) and set a 
+The most common task is to create a new user (in the LinkAhead realm) and set a
 password for the user (note that a user typically needs to be activated):
 
 .. code:: console
 
-   $ caosdb_admin.py create_user anna
-   $ caosdb_admin.py set_user_password anna
-   $ caosdb_admin.py add_user_roles anna administration
-   $ caosdb_admin.py activate_user anna
+   $ linkahead_admin.py create_user anna
+   $ linkahead_admin.py set_user_password anna
+   $ linkahead_admin.py add_user_roles anna administration
+   $ linkahead_admin.py activate_user anna
 
diff --git a/src/doc/concepts.rst b/src/doc/concepts.rst
index 29625a0a..2438614f 100644
--- a/src/doc/concepts.rst
+++ b/src/doc/concepts.rst
@@ -1,6 +1,6 @@
-========================
-The concepts of PyCaosDB
-========================
+===========================
+The concepts of PyLinkAhead
+===========================
 
 - `Configuration <configuration>`
 
diff --git a/src/doc/conf.py b/src/doc/conf.py
index 0fa5de57..197a44ec 100644
--- a/src/doc/conf.py
+++ b/src/doc/conf.py
@@ -24,7 +24,7 @@ import sphinx_rtd_theme  # noqa: E402
 
 # -- Project information -----------------------------------------------------
 
-project = 'pycaosdb'
+project = 'pylinkahead'
 copyright = '2023, IndiScale GmbH'
 author = 'Daniel Hornung'
 
@@ -115,7 +115,7 @@ html_static_path = ['_static']
 # -- Options for HTMLHelp output ---------------------------------------------
 
 # Output file base name for HTML help builder.
-htmlhelp_basename = 'caosdb-pylibdoc'
+htmlhelp_basename = 'linkahead-pylibdoc'
 
 
 # -- Options for LaTeX output ------------------------------------------------
@@ -142,7 +142,7 @@ latex_elements = {
 # (source start file, target name, title,
 #  author, documentclass [howto, manual, or own class]).
 latex_documents = [
-    (master_doc, 'caosdb-pylib.tex', 'caosdb-pylib Documentation',
+    (master_doc, 'linkahead-pylib.tex', 'linkahead-pylib Documentation',
      'IndiScale GmbH', 'manual'),
 ]
 
@@ -152,7 +152,7 @@ latex_documents = [
 # One entry per manual page. List of tuples
 # (source start file, name, description, authors, manual section).
 man_pages = [
-    (master_doc, 'pycaosdb', 'pycaosdb documentation',
+    (master_doc, 'pylinkahead', 'pylinkahead documentation',
      [author], 1)
 ]
 
@@ -163,8 +163,8 @@ man_pages = [
 # (source start file, target name, title, author,
 #  dir menu entry, description, category)
 texinfo_documents = [
-    (master_doc, 'pycaosdb', 'pycaosdb documentation',
-     author, 'pycaosdb', 'One line description of project.',
+    (master_doc, 'pylinkahead', 'pylinkahead documentation',
+     author, 'pylinkahead', 'One line description of project.',
      'Miscellaneous'),
 ]
 
@@ -202,9 +202,9 @@ epub_exclude_files = ['search.html']
 # https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html#confval-intersphinx_mapping
 intersphinx_mapping = {
     "python": ("https://docs.python.org/", None),
-    "caosdb-mysqlbackend": ("https://docs.indiscale.com/caosdb-mysqlbackend/",
-                            None),
-    "caosdb-server": ("https://docs.indiscale.com/caosdb-server/", None),
+    "linkahead-mysqlbackend": ("https://docs.indiscale.com/caosdb-mysqlbackend/",
+                               None),
+    "linkahead-server": ("https://docs.indiscale.com/caosdb-server/", None),
 }
 
 
diff --git a/src/doc/configuration.md b/src/doc/configuration.md
index 02cbbd7b..54ae251b 100644
--- a/src/doc/configuration.md
+++ b/src/doc/configuration.md
@@ -1,16 +1,16 @@
-# Configuration of PyCaosDB #
-The behavior of PyCaosDB is defined via a configuration that is provided using configuration files.
-PyCaosDB tries to read from the inifile specified in the environment variable `PYCAOSDBINI` or
-alternatively in `~/.pycaosdb.ini` upon import.  After that, the ini file `pycaosdb.ini` in the
+# Configuration of PyLinkAhead #
+The behavior of PyLinkAhead is defined via a configuration that is provided using configuration files.
+PyLinkAhead tries to read from the inifile specified in the environment variable `PYCAOSDBINI` or
+alternatively in `~/.pylinkahead.ini` upon import.  After that, the ini file `pylinkahead.ini` in the
 current working directory will be read additionally, if it exists.
 
 Here, we will look at the most common configuration options. For a full and comprehensive
-description please check out the [example pycaosdb.ini file](https://gitlab.com/caosdb/caosdb-pylib/-/blob/main/examples/pycaosdb.ini).  You can download this file and use
+description please check out the [example pylinkahead.ini file](https://gitlab.com/linkahead/linkahead-pylib/-/blob/main/examples/pylinkahead.ini).  You can download this file and use
 it as a starting point.
 
 
 Typically, you need to change at least the `url` and `username` fields as required.  (Ask your
-CaosDB administrator or IT crowd if you do not know what to put there, but for the demo instance at
+LinkAhead administrator or IT crowd if you do not know what to put there, but for the demo instance at
 https://demo.indiscale.com, `username=admin` and `password=caosdb` should work).
 
 ## Authentication ##
@@ -46,7 +46,7 @@ username=YOUR_USERNAME
 
 ## SSL Certificate ##
 
-In some cases (especially if you are testing CaosDB) you might need to supply an SSL certificate to
+In some cases (especially if you are testing LinkAhead) you might need to supply an SSL certificate to
 allow SSL encryption.
 
 The `cacert` option sets the path to the ssl certificate for the connection:
@@ -59,12 +59,12 @@ cacert=/path/to/caosdb.ca.pem
 ## Further Settings ##
 
 `debug=0` ensures that debug information is **not** printed to the terminal every time you interact
-with CaosDB which makes the experience much less verbose. Set it to 1 or 2 in case you want to help
+with LinkAhead which makes the experience much less verbose. Set it to 1 or 2 in case you want to help
 debugging (which I hope will not be necessary for this tutorial) or if you want to learn more about
 the internals of the protocol. 
 
 `timeout` sets the timeout for requests to the server.
 
 A complete list of options can be found in the 
-[pycaosdb.ini file](https://gitlab.com/caosdb/caosdb-pylib/-/blob/main/examples/pycaosdb.ini) in 
+[pylinkahead.ini file](https://gitlab.com/linkahead/linkahead-pylib/-/blob/main/examples/pylinkahead.ini) in 
 the examples folder of the source code.
diff --git a/src/doc/future_caosdb.md b/src/doc/future_linkahead.md
similarity index 87%
rename from src/doc/future_caosdb.md
rename to src/doc/future_linkahead.md
index de6170fa..7c85de95 100644
--- a/src/doc/future_caosdb.md
+++ b/src/doc/future_linkahead.md
@@ -1,4 +1,4 @@
-# The future of the CaosDB Python Client
+# The future of the LinkAhead Python Client
 
 The current Python client has done us great services but its structure and the 
 way it is used sometimes feels outdated and clumsy. In this document we sketch
@@ -7,13 +7,13 @@ contribute to this development.
 
 At several locations in this document there will be links to discussion issues.
 If you want to discuss something new, you can create a new issue
-[here](https://gitlab.com/caosdb/caosdb-pylib/-/issues/new).
+[here](https://gitlab.com/linkahead/linkahead-pylib/-/issues/new).
 
 ## Overview
 Let's get a general impression before discussing single aspects.
 
 ``` python
-import caosdb as db
+import linkahead as db
 experiments = db.query("FIND Experiment")
 # print name and date for each `Experiment`
 for exp in experiments:
@@ -29,13 +29,13 @@ new_one.name = "Needle Measurement"
 new_one.insert()
 ```
 Related discussions:
-- [recursive retrieve in query](https://gitlab.com/caosdb/caosdb-pylib/-/issues/57)
-- [create_record function](https://gitlab.com/caosdb/caosdb-pylib/-/issues/58)
-- [data model utility](https://gitlab.com/caosdb/caosdb-pylib/-/issues/59)
+- [recursive retrieve in query](https://gitlab.com/linkahead/linkahead-pylib/-/issues/57)
+- [create_record function](https://gitlab.com/linkahead/linkahead-pylib/-/issues/58)
+- [data model utility](https://gitlab.com/linkahead/linkahead-pylib/-/issues/59)
 
 ## Quickstart
 Note that you can try out one possible implementation using the 
-`caosdb.high_level_api` module. It is experimental and might be removed in 
+`linkahead.high_level_api` module. It is experimental and might be removed in 
 future!
 
 A `resolve_references` function allows to retrieve the referenced entities of 
@@ -47,7 +47,7 @@ function:
 -   `depth`: Maximum recursion depth
 -   `references`: Whether to use the supplied db.Container to resolve
     references. This allows offline usage. Set it to None if you want to
-    automatically retrieve entities from the current CaosDB connection.
+    automatically retrieve entities from the current LinkAhead connection.
 
 In order to allow a quick look at the object structures an easily readable 
 serialization is provided by the `to_dict` function. It has the following 
@@ -76,7 +76,7 @@ but no Properties are inserted unexpectedly with NULL values.
 
 - Raise Exception if attribute does not exist but is accessed?
 
-[Discussion](https://gitlab.com/caosdb/caosdb-pylib/-/issues/60)
+[Discussion](https://gitlab.com/linkahead/linkahead-pylib/-/issues/60)
 
 We aim for a distinction between "concrete" Properties of Records/RecordTypes and "abstract" Properties as part of the definition of a data model. Concrete properties are always "contained" in a record or record type while abstract properties stand for themselves.
 
@@ -129,7 +129,7 @@ GRPC json serialization?
 I can resolve later and end up with the same result:
 `recs =db.query("FIND Experiment", depth=2)`  equals `recs = db.query("FIND Experiment"); recs = resolve_references(recs, depth=2)`
 
-[Discussion](https://gitlab.com/caosdb/caosdb-pylib/-/issues/57)
+[Discussion](https://gitlab.com/linkahead/linkahead-pylib/-/issues/57)
 
 
 #### Alternative
@@ -155,11 +155,11 @@ Especially the following functions operate by default NOT in-place:
 - insert
 - retrieve
 - resolve_references
-[Discussion](https://gitlab.com/caosdb/caosdb-pylib/-/issues/61)
+[Discussion](https://gitlab.com/linkahead/linkahead-pylib/-/issues/61)
 
 ## Extended Example
 ``` python
-import caosdb as db
+import linkahead as db
 
 dm = db.get_data_model()
 
@@ -174,7 +174,7 @@ print("The new record has the ID:", inserted.id)
 ```
 
 ### Factory method
-While creating an Entity will not talk to a CaosDB server and can thus be done offline, the factory method
+While creating an Entity will not talk to a LinkAhead server and can thus be done offline, the factory method
 `create_record` allows to 
 1. Retrieve the parent and set attributes according to inheritance
 2. Use a container to resolve the parent and set attributes
diff --git a/src/doc/gallery/Makefile b/src/doc/gallery/Makefile
index 658f9a6a..b8ed911d 100644
--- a/src/doc/gallery/Makefile
+++ b/src/doc/gallery/Makefile
@@ -1,4 +1,4 @@
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2022 Daniel Hornung <d.hornung@indiscale.com>
diff --git a/src/doc/gallery/curator-permissions.rst b/src/doc/gallery/curator-permissions.rst
index fa6b4022..f5113a98 100644
--- a/src/doc/gallery/curator-permissions.rst
+++ b/src/doc/gallery/curator-permissions.rst
@@ -18,7 +18,7 @@ In the following, you'll learn how to
 Prerequisites
 -------------
 
-This example needs some preparations regarding your CaosDB setup that have to
+This example needs some preparations regarding your LinkAhead setup that have to
 (or, for the sake of simplicity, should) be done outside the actual Python
 example script.
 
@@ -26,27 +26,27 @@ The curator role
 ~~~~~~~~~~~~~~~~
 
 First, a ``curator`` role is created with a meaningful description. We'll use
-``caosdb_admin.py`` for this which leads to the following command:
+``linkahead_admin.py`` for this which leads to the following command:
 
 .. code:: console
 
-   $ caosdb_admin.py create_role "curator" "A user who is permitted to create new Records, Properties, and RecordTypes but who is not allowed to change the core data model."
+   $ linkahead_admin.py create_role "curator" "A user who is permitted to create new Records, Properties, and RecordTypes but who is not allowed to change the core data model."
 
 To actually see how this role's permissions change, we also need a user with
 this role. Assume you already have created and activated (see
 :doc:`Administration <../administration>`) a ``test_curator`` user, then
-``caosdb_admin.py`` is used again to assign it the correct role:
+``linkahead_admin.py`` is used again to assign it the correct role:
 
 .. code:: console
 
-   $ caosdb_admin.py add_user_roles test_curator curator
+   $ linkahead_admin.py add_user_roles test_curator curator
 
 .. note::
 
    The ``test_curator`` user shouldn't have administration privileges, otherwise
    the below changes won't have any effect.
 
-The core data model and caosdb-advanced-user-tools
+The core data model and linkahead-advanced-user-tools
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 In principle, the following script works with any data model defined in a json
@@ -61,8 +61,8 @@ Clone the schemata into the same directory containing the below script via
 
    $ git clone https://github.com/leibniz-zmt/zmt-metadata-schema.git
 
-Furthermore, we'll need the `CaosDB Advanced User Tools
-<https://gitlab.com/caosdb/caosdb-advanced-user-tools>`_ for loading the
+Furthermore, we'll need the `LinkAhead Advanced User Tools
+<https://gitlab.com/linkahead/linkahead-advanced-user-tools>`_ for loading the
 metadata schemata from the json files, so install them via
 
 .. code:: console
@@ -109,13 +109,13 @@ Your complete ``global_entities_permissions.xml`` might then look like
 
 .. note::
 
-   Note that you have to restart your CaosDB server after modifying the
+   Note that you have to restart your LinkAhead server after modifying the
    ``global_entities_permissions.xml``.
 
 The code
 --------
 
-After having applied all of the above prerequisites and restarting your CaosDB
+After having applied all of the above prerequisites and restarting your LinkAhead
 server, execute the following code.
 
 :download:`Download full code<curator_permissions.py>`
diff --git a/src/doc/gallery/curator_permissions.py b/src/doc/gallery/curator_permissions.py
index 16b4b7f6..a9c9f319 100644
--- a/src/doc/gallery/curator_permissions.py
+++ b/src/doc/gallery/curator_permissions.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2022 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2022 Florian Spreckelsen <f.spreckelsen@indiscale.com>
@@ -23,9 +23,9 @@
 import os
 import sys
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.models.parser import parse_model_from_json_schema
-from caosdb import administration as admin
+from linkahead import administration as admin
 
 CURATOR = "curator"
 
diff --git a/src/doc/gallery/index.rst b/src/doc/gallery/index.rst
index bfba4317..f3c6c699 100644
--- a/src/doc/gallery/index.rst
+++ b/src/doc/gallery/index.rst
@@ -1,13 +1,13 @@
 
-PyCaosDB Code Gallery
-=====================
+PyLinkAhead Code Gallery
+========================
 
-This chapter collects code examples which can be immediately run against an empty CaosDB instance.
+This chapter collects code examples which can be immediately run against an empty LinkAhead instance.
 
 .. note::
 
    These examples require a configuration file with valid server and user/password settings.  Refer
-   to the :ref:`Configuration <Configuration of PyCaosDB>` section for details.
+   to the :ref:`Configuration <Configuration of PyLinkAhead>` section for details.
 
 .. toctree::
    :maxdepth: 2
diff --git a/src/doc/gallery/simulation.py b/src/doc/gallery/simulation.py
index 342d5d98..f92e7b7f 100644
--- a/src/doc/gallery/simulation.py
+++ b/src/doc/gallery/simulation.py
@@ -1,5 +1,5 @@
 """
-Run a simulation and store the values into CaosDB.
+Run a simulation and store the values into LinkAhead.
 
 >>> main()              # doctest: +ELLIPSIS
 These distances resulted in small x,y, values:
@@ -8,12 +8,12 @@ These distances resulted in small x,y, values:
 
 import numpy as np
 import scipy.integrate
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.table_converter import to_table
 
 
-def setup_caosdb():
-    """Create the data model and insert it into CaosDB
+def setup_linkahead():
+    """Create the data model and insert it into LinkAhead
 
     The data model consists of the following RecordTypes:
 
@@ -35,7 +35,7 @@ def setup_caosdb():
     The data model of course also contains the corresponding properties for these RecordTypes.
     """
 
-    cont = db.Container()  # Container to insert all Entities at once into CaosDB
+    cont = db.Container()  # Container to insert all Entities at once into LinkAhead
     # create Properties
     cont.append(db.Property("x", datatype=db.DOUBLE))
     cont.append(db.Property("y", datatype=db.DOUBLE))
@@ -74,7 +74,7 @@ def simulations(n, t_max):
         # Get the parameters and result
         initial, result = run_simulation(run=i, t_max=t_max)
 
-        # Prepare CaosDB insertion
+        # Prepare LinkAhead insertion
         run = db.Record().add_parent("SoftwareRun").add_property("Software", value=software.id)
         parameters = (db.Record().add_parent("Parameters").add_property("x", initial[0])
                       .add_property("y", initial[1]).add_property("z", initial[2]))
@@ -83,7 +83,7 @@ def simulations(n, t_max):
         run.add_property("Parameters", value=parameters).add_property("Result", value=result_record)
         cont = db.Container()
         cont.extend([run, parameters, result_record])
-        cont.insert()           # Insert everything of this run into CaosDB.
+        cont.insert()           # Insert everything of this run into LinkAhead.
 
 
 def run_simulation(run, t_max):
@@ -121,7 +121,7 @@ def analyze():
 
 def main():
     # 1. Set up the data model
-    setup_caosdb()
+    setup_linkahead()
 
     # 2. Run simulations
     simulations(n=200, t_max=5)
diff --git a/src/doc/gallery/simulation.rst b/src/doc/gallery/simulation.rst
index ce1a7f45..887c6219 100644
--- a/src/doc/gallery/simulation.rst
+++ b/src/doc/gallery/simulation.rst
@@ -6,7 +6,7 @@ This code example
 
 1. sets up the data model
 2. runs simulations
-3. stores the simulation parameters and results into CaosDB
+3. stores the simulation parameters and results into LinkAhead
 4. retrieves the parameters for interesting results.
 
 :download:`Download code<simulation.py>`
diff --git a/src/doc/high_level_api.org b/src/doc/high_level_api.org
index 516df1b4..fee47356 100644
--- a/src/doc/high_level_api.org
+++ b/src/doc/high_level_api.org
@@ -1,14 +1,14 @@
 * High Level API
 
 In addition to the old standard pylib API, new versions of pylib ship with a high level API
-that facilitates usage of CaosDB entities within data analysis scripts. In a nutshell that
-API exposes all properties of CaosDB Records as standard python attributes making their
+that facilitates usage of LinkAhead entities within data analysis scripts. In a nutshell that
+API exposes all properties of LinkAhead Records as standard python attributes making their
 access easier.
 
 Or to spell it out directly in Python:
 #+BEGIN_SRC python
 
-  import caosdb as db
+  import linkahead as db
   # Old API:
   r = db.Record()
   r.add_parent("Experiment")
@@ -16,7 +16,7 @@ Or to spell it out directly in Python:
   r.get_property("alpha").value = 25 # setting properties (old api)
   print(r.get_property("alpha").value + 25) # getting properties (old api)
 
-  from caosdb.high_level_api import convert_to_python_entity
+  from linkahead.high_level_api import convert_to_python_entity
   obj = convert_to_python_object(r) # create a high level entity
   obj.r = 25 # setting properties (new api)
   print(obj.r + 25) # getting properties (new api)
@@ -27,7 +27,7 @@ Or to spell it out directly in Python:
 ** Quickstart
 
 The module, needed for the high level API is called:
-~caosdb.high_level_api~
+~linkahead.high_level_api~
 
 There are two functions converting entities between the two representation (old API and new API):
 - ~convert_to_python_object~: Convert entities from **old** into **new** representation.
@@ -38,11 +38,11 @@ Furthermore there are a few utility functions which expose very practical shorth
 - ~create_record~: Create a new high level entity using the name of a record type and a list of key value pairs as properties.
 - ~load_external_record~: Retrieve a record with a specific name and return it as high level entity.
 - ~create_entity_container~: Convert a high level entity into a standard entity including all sub entities.
-- ~query~: Do a CaosDB query and return the result as a container of high level objects.
+- ~query~: Do a LinkAhead query and return the result as a container of high level objects.
 
-So as a first example, you could retrieve any record from CaosDB and use it using its high level representation:
+So as a first example, you could retrieve any record from LinkAhead and use it using its high level representation:
 #+BEGIN_SRC python
-  from caosdb.high_level_api import query
+  from linkahead.high_level_api import query
 
   res = query("FIND Record Experiment")
   experiment = res[0]
@@ -60,7 +60,7 @@ like the list of output files "output", become immediately available.
 **Note** that for the old API you were supposed to run the following series of commands
 to achieve the same result:
 #+BEGIN_SRC python
-  import caosdb as db
+  import linkahead as db
 
   res = db.execute_query("FIND Record Experiment")
   output = res.get_property("output")
@@ -69,9 +69,9 @@ to achieve the same result:
 #+END_SRC
 
 Resolving subproperties makes use of the "resolve_reference" function provided by the high level
-entity class (~CaosDBPythonEntity~), with the following parameters:
+entity class (~LinkAheadPythonEntity~), with the following parameters:
 - ~deep~: Whether to use recursive retrieval
-- ~references~: Whether to use the supplied db.Container to resolve references. This allows offline usage. Set it to None if you want to automatically retrieve entities from the current CaosDB connection.
+- ~references~: Whether to use the supplied db.Container to resolve references. This allows offline usage. Set it to None if you want to automatically retrieve entities from the current LinkAhead connection.
 - ~visited~: Needed for recursion, set this to None.
 
 Objects in the high level representation can be serialized to a simple yaml form using the function
@@ -94,26 +94,26 @@ print(str(obj))
 As described in the section [[Quickstart]] the two functions ~convert_to_python_object~ and ~convert_to_entity~ convert
 entities beetween the high level and the standard representation.
 
-The high level entities are represented using the following classes from the module ~caosdb.high_level_api~:
-- ~CaosDBPythonEntity~: Base class of the following entity classes.
-- ~CaosDBPythonRecord~
-- ~CaosDBPythonRecordType~
-- ~CaosDBPythonProperty~
-- ~CaosDBPythonMultiProperty~: **WARNING** Not implemented yet.
-- ~CaosDBPythonFile~: Used for file entities and provides an additional ~download~ function for being able to directly retrieve files from CaosDB.
+The high level entities are represented using the following classes from the module ~linkahead.high_level_api~:
+- ~LinkAheadPythonEntity~: Base class of the following entity classes.
+- ~LinkAheadPythonRecord~
+- ~LinkAheadPythonRecordType~
+- ~LinkAheadPythonProperty~
+- ~LinkAheadPythonMultiProperty~: **WARNING** Not implemented yet.
+- ~LinkAheadPythonFile~: Used for file entities and provides an additional ~download~ function for being able to directly retrieve files from LinkAhead.
 
 In addition, there are the following helper structures which are realized as Python data classes:
-- ~CaosDBPropertyMetaData~: For storing meta data about properties.
-- ~CaosDBPythonUnresolved~: The base class of unresolved "things".
-- ~CaosDBPythonUnresolvedParent~: Parents of entities are stored as unresolved parents by default, storing an id or a name of a parent (or both).
-- ~CaosDBPythonUnresolvedReference~: An unresolved reference is a reference property with an id which has not (yet) been resolved to an Entity.
+- ~LinkAheadPropertyMetaData~: For storing meta data about properties.
+- ~LinkAheadPythonUnresolved~: The base class of unresolved "things".
+- ~LinkAheadPythonUnresolvedParent~: Parents of entities are stored as unresolved parents by default, storing an id or a name of a parent (or both).
+- ~LinkAheadPythonUnresolvedReference~: An unresolved reference is a reference property with an id which has not (yet) been resolved to an Entity.
 
-The function "resolve_references" can be used to recursively replace ~CaosDBPythonUnresolvedReferences~ into members of type ~CaosDBPythonRecords~
-or ~CaosDBPythonFile~.
+The function "resolve_references" can be used to recursively replace ~LinkAheadPythonUnresolvedReferences~ into members of type ~LinkAheadPythonRecords~
+or ~LinkAheadPythonFile~.
 
-Each property stored in a CaosDB record corresponds to:
-- a member attribute of ~CaosDBPythonRecord~ **and**
-- an entry in a dict called "metadata" storing a CaosDBPropertyMetadata object with the following information about proeprties:
+Each property stored in a LinkAhead record corresponds to:
+- a member attribute of ~LinkAheadPythonRecord~ **and**
+- an entry in a dict called "metadata" storing a LinkAheadPropertyMetadata object with the following information about proeprties:
   - ~unit~
   - ~datatype~
   - ~description~
@@ -141,7 +141,7 @@ First, the data model will be filled with the parameter values for this specific
 Records are created by the `create_record` function. Parameter values can be set at record creation and also after creation as python properties of the corresponding record instance. The following example shows how to create a record, how to set the parameter at creation and how to set them as python properties
 
 #+BEGIN_SRC python
-  from caosdb.high_level_api import create_record
+  from linkahead.high_level_api import create_record
 
   MonodomainRecord = create_record("MonodomainTissueSimulation")
   MonodomainRecord.LocalModel = create_record("MitchellSchaefferModel")
@@ -166,6 +166,6 @@ Records are created by the `create_record` function. Parameter values can be set
 #+END_SRC
 
 At any position in the algorithm you are free to:
-- Convert this model to the standard python API and insert or update the records in a running instance of CaosDB.
-- Serialize this model in the high level API yaml format. This enables the CaosDB crawler to pickup the file and synchronize it with a running instance 
-of CaosDB.
+- Convert this model to the standard python API and insert or update the records in a running instance of LinkAhead.
+- Serialize this model in the high level API yaml format. This enables the LinkAhead crawler to pickup the file and synchronize it with a running instance 
+of LinkAhead.
diff --git a/src/doc/high_level_api.rst b/src/doc/high_level_api.rst
index e92f2dd5..5f8ae7f9 100644
--- a/src/doc/high_level_api.rst
+++ b/src/doc/high_level_api.rst
@@ -2,16 +2,15 @@ High Level API
 ==============
 
 In addition to the old standard pylib API, new versions of pylib ship
-with a high level API that facilitates usage of CaosDB entities within
+with a high level API that facilitates usage of LinkAhead entities within
 data analysis scripts. In a nutshell that API exposes all properties of
-CaosDB Records as standard python attributes making their access easier.
+LinkAhead Records as standard python attributes making their access easier.
 
 Or to speak it out directly in Python:
 
 .. code:: python
 
-
-   import caosdb as db
+   import linkahead as db
    # Old API:
    r = db.Record()
    r.add_parent("Experiment")
@@ -19,7 +18,7 @@ Or to speak it out directly in Python:
    r.get_property("alpha").value = 25 # setting properties (old api)
    print(r.get_property("alpha").value + 25) # getting properties (old api)
 
-   from caosdb.high_level_api import convert_to_python_entity
+   from linkahead.high_level_api import convert_to_python_entity
    obj = convert_to_python_object(r) # create a high level entity
    obj.r = 25 # setting properties (new api)
    print(obj.r + 25) # getting properties (new api)
@@ -28,7 +27,7 @@ Quickstart
 ----------
 
 The module, needed for the high level API is called:
-``caosdb.high_level_api``
+``linkahead.high_level_api``
 
 There are two functions converting entities between the two
 representation (old API and new API):
@@ -50,15 +49,15 @@ practical shorthands:
    return it as high level entity.
 -  ``create_entity_container``: Convert a high level entity into a
    standard entity including all sub entities.
--  ``query``: Do a CaosDB query and return the result as a container of
+-  ``query``: Do a LinkAhead query and return the result as a container of
    high level objects.
 
-So as a first example, you could retrieve any record from CaosDB and use
+So as a first example, you could retrieve any record from LinkAhead and use
 it using its high level representation:
 
 .. code:: python
 
-   from caosdb.high_level_api import query
+   from linkahead.high_level_api import query
 
    res = query("FIND Experiment")
    experiment = res[0]
@@ -78,7 +77,7 @@ series of commands to achieve the same result:
 
 .. code:: python
 
-   import caosdb as db
+   import linkahead as db
 
    res = db.execute_query("FIND Experiment")
    output = res.get_property("output")
@@ -87,12 +86,12 @@ series of commands to achieve the same result:
 
 Resolving subproperties makes use of the "resolve\ :sub:`reference`"
 function provided by the high level entity class
-(``CaosDBPythonEntity``), with the following parameters:
+(``LinkAheadPythonEntity``), with the following parameters:
 
 -  ``deep``: Whether to use recursive retrieval
 -  ``references``: Whether to use the supplied db.Container to resolve
    references. This allows offline usage. Set it to None if you want to
-   automatically retrieve entities from the current CaosDB connection.
+   automatically retrieve entities from the current LinkAhead connection.
 -  ``visited``: Needed for recursion, set this to None.
 
 Objects in the high level representation can be serialized to a simple
@@ -123,37 +122,37 @@ As described in the section Quickstart the two functions
 beetween the high level and the standard representation.
 
 The high level entities are represented using the following classes from
-the module ``caosdb.high_level_api``:
-
--  ``CaosDBPythonEntity``: Base class of the following entity classes.
--  ``CaosDBPythonRecord``
--  ``CaosDBPythonRecordType``
--  ``CaosDBPythonProperty``
--  ``CaosDBPythonMultiProperty``: **WARNING** Not implemented yet.
--  ``CaosDBPythonFile``: Used for file entities and provides an
+the module ``linkahead.high_level_api``:
+
+-  ``LinkAheadPythonEntity``: Base class of the following entity classes.
+-  ``LinkAheadPythonRecord``
+-  ``LinkAheadPythonRecordType``
+-  ``LinkAheadPythonProperty``
+-  ``LinkAheadPythonMultiProperty``: **WARNING** Not implemented yet.
+-  ``LinkAheadPythonFile``: Used for file entities and provides an
    additional ``download`` function for being able to directly retrieve
-   files from CaosDB.
+   files from LinkAhead.
 
 In addition, there are the following helper structures which are
 realized as Python data classes:
 
--  ``CaosDBPropertyMetaData``: For storing meta data about properties.
--  ``CaosDBPythonUnresolved``: The base class of unresolved "things".
--  ``CaosDBPythonUnresolvedParent``: Parents of entities are stored as
+-  ``LinkAheadPropertyMetaData``: For storing meta data about properties.
+-  ``LinkAheadPythonUnresolved``: The base class of unresolved "things".
+-  ``LinkAheadPythonUnresolvedParent``: Parents of entities are stored as
    unresolved parents by default, storing an id or a name of a parent
    (or both).
--  ``CaosDBPythonUnresolvedReference``: An unresolved reference is a
+-  ``LinkAheadPythonUnresolvedReference``: An unresolved reference is a
    reference property with an id which has not (yet) been resolved to an
    Entity.
 
 The function "resolve\ :sub:`references`" can be used to recursively
-replace ``CaosDBPythonUnresolvedReferences`` into members of type
-``CaosDBPythonRecords`` or ``CaosDBPythonFile``.
+replace ``LinkAheadPythonUnresolvedReferences`` into members of type
+``LinkAheadPythonRecords`` or ``LinkAheadPythonFile``.
 
-Each property stored in a CaosDB record corresponds to:
+Each property stored in a LinkAhead record corresponds to:
 
--  a member attribute of ``CaosDBPythonRecord`` **and**
--  an entry in a dict called "metadata" storing a CaosDBPropertyMetadata
+-  a member attribute of ``LinkAheadPythonRecord`` **and**
+-  an entry in a dict called "metadata" storing a LinkAheadPropertyMetadata
    object with the following information about proeprties:
 
    -  ``unit``
diff --git a/src/doc/index.rst b/src/doc/index.rst
index 7344b6aa..5e5a5e88 100644
--- a/src/doc/index.rst
+++ b/src/doc/index.rst
@@ -1,6 +1,6 @@
 
-Welcome to PyCaosDB's documentation!
-====================================
+Welcome to PyLinkAhead's documentation!
+=======================================
 
 .. toctree::
    :maxdepth: 2
@@ -14,9 +14,9 @@ Welcome to PyCaosDB's documentation!
    Administration <administration>
    High Level API <high_level_api>
    Code gallery <gallery/index>
-   API documentation<_apidoc/caosdb>
+   API documentation<_apidoc/linkahead>
 
-This is the documentation for the Python client library for CaosDB, ``PyCaosDB``.
+This is the documentation for the Python client library for LinkAhead, ``PyLinkAhead``.
 
 This documentation helps you to :doc:`get started<README_SETUP>`, explains the most important
 :doc:`concepts<concepts>` and offers a range of :doc:`tutorials<tutorials/index>`.
diff --git a/src/doc/tutorials/Data-Insertion.rst b/src/doc/tutorials/Data-Insertion.rst
index 82df0769..6804ef5c 100644
--- a/src/doc/tutorials/Data-Insertion.rst
+++ b/src/doc/tutorials/Data-Insertion.rst
@@ -4,12 +4,12 @@ Data Insertion
 Data Models
 ~~~~~~~~~~~
 
-Data is stored and structured in CaosDB using a concept of RecordTypes, Properties, Records etc. If
-you do not know what these are, please look at the chapter :doc:`Data
-Model<caosdb-server:Data-Model>` in the CaosDB server documentation.
+Data is stored and structured in LinkAhead using a concept of RecordTypes, Properties, Records etc.
+If you do not know what these are, please look at the chapter :doc:`Data
+Model<linkahead-server:Data-Model>` in the LinkAhead server documentation.
 
 In order to insert some actual data, we need to create a data model
-using RecordTypes and Properties (You may skip this if you use a CaosDB
+using RecordTypes and Properties (You may skip this if you use a LinkAhead
 instance that already has the required types). When you create a new Property 
 you must supply a datatype. So, let’s create a simple
 Property called “a” of datatype double. This is very easy in pylib:
@@ -60,18 +60,18 @@ resolution, but we'll omit this for the sake of brevity for now.
    print(rt.get_property(name="epsilon").importance) ### rt has a "epsilon" property with the same importance as "BarkleySimulation"
 
 The parameter ``inheritance=(obligatory|recommended|fix|all|none)`` of
-:py:meth:`Entity.add_parent()<caosdb.common.models.Entity.add_parent>` tells the server to assign
+:py:meth:`Entity.add_parent()<linkahead.common.models.Entity.add_parent>` tells the server to assign
 all properties of the parent RecordType with the chosen importance (and properties with a higher
 importance) to the child RecordType
 automatically upon insertion. See the chapter on `importance
 <https://docs.indiscale.com/caosdb-server/specification/RecordType.html#importance>`_ in the
-documentation of the CaosDB server for more information on the importance and inheritance of
+documentation of the LinkAhead server for more information on the importance and inheritance of
 properties.
 
 .. note::
 
    The inherited properties will only be visible after the insertion since they are set by the
-   CaosDB server, not by the Python client.
+   LinkAhead server, not by the Python client.
 
 
 Insert Actual Data
@@ -111,7 +111,7 @@ record as its source data. Since we know that the id of the experiment record is
 
 The experiment record's id is used as the value of the ``Experiment`` property
 of the analysis Record (note how we use the RecordType ``Experiment`` as a
-``REFERENCE`` property here). Sending a CaosDB query like ``FIND RECORD
+``REFERENCE`` property here). Sending a LinkAhead query like ``FIND RECORD
 Experiment WHICH IS REFERENCED BY A Analysis WITH date=2020-01-08`` would now
 return our original experiment record.
 
@@ -141,7 +141,7 @@ Finally, we can also insert both records at the same time using a
 
    cont = db.Container().extend([rec, ana]) # Add experiment and analysis
                                             # records to our container
-   cont.insert() # Insert both at the same time, the CaosDB server will
+   cont.insert() # Insert both at the same time, the LinkAhead server will
                  # resolve the reference upon insertion.
 
 All three ways result in an Analysis record which references an Experiment
@@ -209,7 +209,7 @@ list-valued attribute in Python, as the following example illustrates.
 
 .. code:: python
 
-   import caosdb as db
+   import linkahead as db
    db.Property(name="TestList", datatype=db.LIST(db.DOUBLE)).insert()
    db.RecordType(name="TestType").add_property(name="TestList").insert()
    db.Record(name="TestRec").add_parent("TestType").add_property(
@@ -254,7 +254,7 @@ Updating an existing file by uploading a new version.
 
 .. code:: python
 
-   import caosdb as db
+   import linkahead as db
 
    file_upd = db.File(id=174).retrieve()
 
diff --git a/src/doc/tutorials/Entity-Getters.rst b/src/doc/tutorials/Entity-Getters.rst
index 50ed1320..5bcc97fb 100644
--- a/src/doc/tutorials/Entity-Getters.rst
+++ b/src/doc/tutorials/Entity-Getters.rst
@@ -2,7 +2,7 @@
 Entity Getters
 ==============
 
-There is a very frequent situation when working with PyCaosDB: You need to get a specific Entity
+There is a very frequent situation when working with PyLinkAhead: You need to get a specific Entity
 from the remote server. For example, you need the Property Entity in order to make an update. Sure,
 you can do a ``db.Entity().retrieve()`` or submit a query, but there is an even faster way which
 also helps preventing errors:
diff --git a/src/doc/tutorials/basic_analysis.rst b/src/doc/tutorials/basic_analysis.rst
index c40cad28..960d542f 100644
--- a/src/doc/tutorials/basic_analysis.rst
+++ b/src/doc/tutorials/basic_analysis.rst
@@ -4,14 +4,14 @@ Basic Analysis
 
 If you have not yet, configure a connection with the demo instance. E.g.:
 
->>> import caosdb as db
+>>> import linkahead as db
 >>> _ = db.configure_connection(
 ...    url="https://demo.indiscale.com/", 
 ...    password_method="plain", 
 ...    username="admin", 
 ...    password="caosdb")
 
-A basic Analysis of data in CaosDB could start like:
+A basic Analysis of data in LinkAhead could start like:
 
 >>> 
 >>> analyses =  db.execute_query("FIND RECORD Analysis with quality_factor")
diff --git a/src/doc/tutorials/caching.rst b/src/doc/tutorials/caching.rst
index aad9a1dd..e814d32f 100644
--- a/src/doc/tutorials/caching.rst
+++ b/src/doc/tutorials/caching.rst
@@ -21,12 +21,12 @@ function, easily created from ``get_entity_by_name`` using Python's ``lru_cache`
    # reset the cache with
    cached_get_by_name.cache_clear()
 
-For convenience, PyCaosDB provides the ``caosdb.cached`` module that defines the functions
+For convenience, PyLinkAhead provides the ``linkahead.cached`` module that defines the functions
 ``cached_query`` and ``cached_get_entity_by``, they use a shared cache. Let's have a look:
 
 .. code:: python
 
-   from caosdb.cached import cached_query, cached_get_entity_by, cache_clear, cache_info, cache_initialize
+   from linkahead.cached import cached_query, cached_get_entity_by, cache_clear, cache_info, cache_initialize
    rt1 = cached_get_entity_by(name='RT1')
    qresult = cached_query('FIND Experiment WITH parameter=1')
    # you can inspect the cache
@@ -45,7 +45,7 @@ have entities on hand from previous queries that you want to add.
 
 .. code:: python
 
-   from caosdb.cached import cache_fill, AccessType
+   from linkahead.cached import cache_fill, AccessType
    # Here, items must be a dict with Entity IDs as keys and the Entities as values.
    cache_fill(items, AccessType.EID, unique=True)
    # If you now use IDs that were in items, they are taken from the cache.
diff --git a/src/doc/tutorials/complex_data_models.rst b/src/doc/tutorials/complex_data_models.rst
index 7b45b6a2..569acdae 100644
--- a/src/doc/tutorials/complex_data_models.rst
+++ b/src/doc/tutorials/complex_data_models.rst
@@ -1,7 +1,7 @@
 Complex Data Models
 -------------------
 
-With CaosDB it is possible to create very complex data models.
+With LinkAhead it is possible to create very complex data models.
 
 E.g. it is possible to add properties to properties to cover complex relations
 in data management workflows.
@@ -17,7 +17,7 @@ Examples
 
 .. code-block:: python3
 
-   import caosdb as db
+   import linkahead as db
 
    # Create two record types with descriptions:
    rt1 = db.RecordType(name="TypeA", description="The first type")
diff --git a/src/doc/tutorials/data-model-interface.md b/src/doc/tutorials/data-model-interface.md
index f6967c57..fa21c0c4 100644
--- a/src/doc/tutorials/data-model-interface.md
+++ b/src/doc/tutorials/data-model-interface.md
@@ -8,16 +8,16 @@ pip3 install --user --no-deps .
 ```
 in 
 ```bash
-CaosDB/data_models
+LinkAhead/data_models
 ```
 
 Change to the appropriate directory
 ```bash
-cd CaosDB/data_models
+cd LinkAhead/data_models
 ```
 There are "data models" defined in 
 ```bash
-caosdb_models
+linkahead_models
 ```
 having an ending like "_model.py"
 A set of data models is also considered to be a model
diff --git a/src/doc/tutorials/errors.rst b/src/doc/tutorials/errors.rst
index 37c53c9b..ed0c7869 100644
--- a/src/doc/tutorials/errors.rst
+++ b/src/doc/tutorials/errors.rst
@@ -3,33 +3,33 @@ Error Handling
 ==============
 
 In case of erroneous transactions, connection problems and a lot of
-other cases, PyCaosDB may raise specific errors in order to pinpoint
+other cases, PyLinkAhead may raise specific errors in order to pinpoint
 the problem as precisely as possible. Some of these errors a
-representations of errors in the CaosDB server, others stem from
+representations of errors in the LinkAhead server, others stem from
 problems that occurred on the client side.
 
 The errors and exceptions are ordered hierarchically form the most
 general exceptions to specific transaction or connection problems. The
 most important error types and the hierarchy will be explained in the
 following. For more information on specific error types, see also the
-:doc:`source code<../_apidoc/caosdb.exceptions>`.
+:doc:`source code<../_apidoc/linkahead.exceptions>`.
 
 .. note::
 
-   Starting from PyCaosDB 0.5, the error handling has changed
+   Starting from PyLinkAhead 0.5, the error handling has changed
    significantly. New error classes have been introduced and the
    behavior of ``TransactionError`` and ``EntityError`` has been
    re-worked. In the following, only the "new" errors are
-   discussed. Please refer to the documentation of PyCaosDB 0.4.1 and
+   discussed. Please refer to the documentation of PyLinkAhead 0.4.1 and
    earlier for the old error handling.
 
-CaosDBException
-----------------
+LinkAheadException
+------------------
 
-``CaosDBException`` is the most generic exception and all other error classes inherit
+``LinkAheadException`` is the most generic exception and all other error classes inherit
 from this one. Because of its generality, it doesn't tell you much
-except that some component of PyCaosDB raised an exception. If you
-want to catch all possible CaosDB errors, this is the class to use.
+except that some component of PyLinkAhead raised an exception. If you
+want to catch all possible LinkAhead errors, this is the class to use.
 
 TransactionError
 ----------------
@@ -116,7 +116,7 @@ HTTP Errors
 -----------
 
 An ``HTTPClientError`` or an ``HTTPServerError`` is raised in case of
-http(s) connection problems caused by the Python client or the CaosDB
+http(s) connection problems caused by the Python client or the LinkAhead
 server, respectively. There are the following subclasses of
 ``HTTPClientError`` that are used to specify the connection problem:
 
@@ -130,9 +130,9 @@ server, respectively. There are the following subclasses of
 Other Errors
 ------------
 
-There are further subclasses of ``CaosDBException`` that are raised in
+There are further subclasses of ``LinkAheadException`` that are raised in
 case of faulty configurations or other problems. They should be rather
-self-explanatory from their names; see the :doc:`source code<../_apidoc/caosdb.exceptions>`
+self-explanatory from their names; see the :doc:`source code<../_apidoc/linkahead.exceptions>`
 for further information.
 
 * ``ConfigurationError``
@@ -148,7 +148,7 @@ Examples
 
 .. code-block:: python3
 
-   import caosdb as db
+   import linkahead as db
 
    def link_and_insert(entity, linked, link=True):
      """Link the ENTITY to LINKED and insert it."""
diff --git a/src/doc/tutorials/first_steps.rst b/src/doc/tutorials/first_steps.rst
index c84ec52a..d2a7019b 100644
--- a/src/doc/tutorials/first_steps.rst
+++ b/src/doc/tutorials/first_steps.rst
@@ -1,18 +1,18 @@
 First Steps
 ===========
 
-You should have a working connection to a CaosDB instance now. If not, please check out the 
+You should have a working connection to a LinkAhead instance now. If not, please check out the
 :doc:`Getting Started secton</README_SETUP>`.
 
-If you are not yet familiar with Records, RecordTypes and Properties used in CaosDB,
+If you are not yet familiar with Records, RecordTypes and Properties used in LinkAhead,
 please check out the respective part in the `Web Interface tutorial`_.
-You should also know the basics of the CaosDB Query Language (a tutorial is
+You should also know the basics of the LinkAhead Query Language (a tutorial is
 `here <https://docs.indiscale.com/caosdb-webui/tutorials/query.html>`_).
 
 We recommend that you connect to the `demo instance`_ (hosted by `Indiscale`_) in order to try out
 the following examples. You can do this with
 
->>> import caosdb as db
+>>> import linkahead as db
 >>> _ = db.configure_connection(
 ...    url="https://demo.indiscale.com/", 
 ...    password_method="plain", 
@@ -34,7 +34,7 @@ data is the strength of the web interface while the automated processing of
 data is the strength of the Python client.
 
 >>> type(response)
-<class 'caosdb.common.models.Container'>
+<class 'linkahead.common.models.Container'>
 
 As you can see the type of the returned object is Container. Containers are 
 simply lists of LinkAhead objects with useful functions to interact with LinkAhead. 
@@ -47,7 +47,7 @@ Let's look at the first element:
 
 >>> firstguitar = response[0]
 >>> print(type(firstguitar))
-<class 'caosdb.common.models.Record'>
+<class 'linkahead.common.models.Record'>
 >>> print(firstguitar)
 <Record ...
 
@@ -93,7 +93,7 @@ Ids can also come in handy when searching. Suppose you have some complicated con
 >>> # thrown if the number of results is unequal to 1 and the resulting object will be
 >>> # an Entity and not a Container
 >>> print(type(record))
-<class 'caosdb.common.models.Record'>
+<class 'linkahead.common.models.Record'>
 >>> print(record.id)
 123
 
@@ -120,7 +120,7 @@ If the files are large data files, it is often a better idea to only retrieve th
 Summary
 -------
 
-Now you know how to use Python to send queries to CaosDB and you can access
+Now you know how to use Python to send queries to LinkAhead and you can access
 the result Records and their properties. 
 
 The next tutorial shows how to make some meaningful use of this.
diff --git a/src/doc/tutorials/index.rst b/src/doc/tutorials/index.rst
index ce37993d..706e26c2 100644
--- a/src/doc/tutorials/index.rst
+++ b/src/doc/tutorials/index.rst
@@ -1,6 +1,6 @@
 
-PyCaosDB Tutorials
-==================
+PyLinkAhead Tutorials
+=====================
 
 This chapter contains tutorials that lead you from the first steps to 
 advanced usage of the Python client.
diff --git a/src/doc/tutorials/serverside.rst b/src/doc/tutorials/serverside.rst
index 93f0fdcf..de5f34b4 100644
--- a/src/doc/tutorials/serverside.rst
+++ b/src/doc/tutorials/serverside.rst
@@ -3,7 +3,7 @@ Server Side Scripting
 =====================
 
 The administrator may store regularly needed scripts, e.g. for computing a
-standardized analysis, on the same machine as the CaosDB server, "on the server
+standardized analysis, on the same machine as the LinkAhead server, "on the server
 side", where they can be run directly by the server.
 
 The execution of those scripts can be initiated using the Python client, or the
@@ -17,7 +17,7 @@ execution is fairly simple:
 
 .. code:: python
 
-    from caosdb.utils.server_side_scripting import run_server_side_script
+    from linkahead.utils.server_side_scripting import run_server_side_script
     response = run_server_side_script('scriptname.py')
     print(response.stderr,response.stdout)
 
@@ -29,7 +29,7 @@ script (``stderr`` and ``stdout``) is returned within an response object.
 If the script requires additional arguments, those can be provided after the 
 script's name.
 
-Note that by default the script runs with your CaosDB account. It has your
+Note that by default the script runs with your LinkAhead account. It has your
 permissions and changes are logged as if they were done by you directly.
 
 
@@ -37,8 +37,8 @@ Testing it
 ~~~~~~~~~~
 
 You can try this out using for example the ``diagnostics.py`` script (it is part
-of the `CaosDB server repository
-<https://gitlab.indiscale.com/caosdb/src/caosdb-server/-/blob/main/scripting/bin/administration/diagnostics.py>`_
+of the `LinkAhead server repository
+<https://gitlab.com/linkahead/linkahead-server/-/blob/main/scripting/bin/administration/diagnostics.py>`_
 and is also available on https://demo.indiscale.com). The script returns
 information about the server in JSON format. You can do for example the
 following:
@@ -46,7 +46,7 @@ following:
 .. code:: python
 
     import json
-    from caosdb.utils.server_side_scripting import run_server_side_script
+    from linkahead.utils.server_side_scripting import run_server_side_script
     response = run_server_side_script('administration/diagnostics.py')
     print("JSON content:")
     print(json.loads(response.stdout))
diff --git a/unittests/broken_configs/pycaosdb1.ini b/unittests/broken_configs/pylinkahead1.ini
similarity index 100%
rename from unittests/broken_configs/pycaosdb1.ini
rename to unittests/broken_configs/pylinkahead1.ini
diff --git a/unittests/broken_configs/pycaosdb2.ini b/unittests/broken_configs/pylinkahead2.ini
similarity index 100%
rename from unittests/broken_configs/pycaosdb2.ini
rename to unittests/broken_configs/pylinkahead2.ini
diff --git a/unittests/broken_configs/pycaosdb3.ini b/unittests/broken_configs/pylinkahead3.ini
similarity index 100%
rename from unittests/broken_configs/pycaosdb3.ini
rename to unittests/broken_configs/pylinkahead3.ini
diff --git a/unittests/broken_configs/pycaosdb4.ini b/unittests/broken_configs/pylinkahead4.ini
similarity index 100%
rename from unittests/broken_configs/pycaosdb4.ini
rename to unittests/broken_configs/pylinkahead4.ini
diff --git a/unittests/docker/Dockerfile b/unittests/docker/Dockerfile
index 7c84050b..a5f355fe 100644
--- a/unittests/docker/Dockerfile
+++ b/unittests/docker/Dockerfile
@@ -9,6 +9,7 @@ RUN apt-get update && \
       curl pycodestyle \
       python3-sphinx
 ARG COMMIT="dev"
-RUN git clone -b dev https://gitlab.indiscale.com/caosdb/src/caosdb-pylib.git && \
-    cd caosdb-pylib && git checkout $COMMIT && pip3 install .
+# TODO Rename to linkahead
+RUN git clone -b dev https://gitlab.indiscale.com/caosdb/src/linkahead-pylib.git linkahead-pylib && \
+    cd linkahead-pylib && git checkout $COMMIT && pip3 install .
 RUN pip3 install recommonmark sphinx-rtd-theme
diff --git a/unittests/test_acl.py b/unittests/test_acl.py
index 633c25ad..c004979f 100644
--- a/unittests/test_acl.py
+++ b/unittests/test_acl.py
@@ -1,6 +1,6 @@
 # -*- encoding: utf-8 -*-
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2022 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2022 Timm Fitschen <f.fitschen@indiscale.com>
@@ -18,7 +18,7 @@
 # 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/>.
 #
-import caosdb as db
+import linkahead as db
 from lxml import etree
 
 
diff --git a/unittests/test_add_property.py b/unittests/test_add_property.py
index 0d3183b4..2989adec 100644
--- a/unittests/test_add_property.py
+++ b/unittests/test_add_property.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -24,7 +24,7 @@
 # ** end header
 #
 from pytest import raises
-import caosdb as db
+import linkahead as db
 
 
 def test_no_parameter():
diff --git a/unittests/test_administraction.py b/unittests/test_administraction.py
index 25a7d0de..7f40aa94 100644
--- a/unittests/test_administraction.py
+++ b/unittests/test_administraction.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -25,8 +25,8 @@
 # pylint: disable=missing-docstring
 from __future__ import unicode_literals
 from pytest import raises
-from caosdb import administration, configure_connection, get_connection
-from caosdb.connection.mockup import MockUpServerConnection, MockUpResponse
+from linkahead import administration, configure_connection, get_connection
+from linkahead.connection.mockup import MockUpServerConnection, MockUpResponse
 
 
 def setup_module():
diff --git a/unittests/test_apiutils.py b/unittests/test_apiutils.py
index bda381cf..bb6f978b 100644
--- a/unittests/test_apiutils.py
+++ b/unittests/test_apiutils.py
@@ -1,5 +1,5 @@
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
 # Copyright (C) 2022 Florian Spreckelsen <f.spreckelsen@indiscale.com>
@@ -27,13 +27,13 @@
 
 
 import pytest
-import caosdb as db
-import caosdb.apiutils
-from caosdb.apiutils import (apply_to_ids, compare_entities, create_id_query,
-                             empty_diff, EntityMergeConflictError,
-                             resolve_reference, merge_entities)
+import linkahead as db
+import linkahead.apiutils
+from linkahead.apiutils import (apply_to_ids, compare_entities, create_id_query,
+                                empty_diff, EntityMergeConflictError,
+                                resolve_reference, merge_entities)
 
-from caosdb.common.models import SPECIAL_ATTRIBUTES
+from linkahead.common.models import SPECIAL_ATTRIBUTES
 
 
 def test_apply_to_ids():
@@ -60,8 +60,8 @@ def test_id_query():
 
 
 def test_resolve_reference():
-    original_retrieve_entity_with_id = caosdb.apiutils.retrieve_entity_with_id
-    caosdb.apiutils.retrieve_entity_with_id = lambda eid: db.Record(id=eid)
+    original_retrieve_entity_with_id = linkahead.apiutils.retrieve_entity_with_id
+    linkahead.apiutils.retrieve_entity_with_id = lambda eid: db.Record(id=eid)
 
     prop = db.Property(id=1, datatype=db.REFERENCE, value=100)
     prop.is_valid = lambda: True
@@ -93,7 +93,7 @@ def test_resolve_reference():
     assert no_reference.datatype is db.INTEGER
 
     # restore retrive_entity_with_id
-    caosdb.apiutils.retrieve_entity_with_id = original_retrieve_entity_with_id
+    linkahead.apiutils.retrieve_entity_with_id = original_retrieve_entity_with_id
 
 
 def test_compare_entities():
diff --git a/unittests/test_authentication_auth_token.py b/unittests/test_authentication_auth_token.py
index d0eb6b90..3142f1f9 100644
--- a/unittests/test_authentication_auth_token.py
+++ b/unittests/test_authentication_auth_token.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
@@ -23,17 +23,17 @@
 #
 """test_authentication_auth_token
 
-Unit tests for the module caosdb.connection.authentication.auth_token
+Unit tests for the module linkahead.connection.authentication.auth_token
 """
 
 from __future__ import unicode_literals
 from pytest import raises
 from unittest.mock import Mock
-from caosdb.connection.authentication import auth_token as at
-from caosdb.connection.mockup import MockUpServerConnection, MockUpResponse
-from caosdb.connection.utils import parse_auth_token
-from caosdb.exceptions import LoginFailedError
-from caosdb import configure_connection
+from linkahead.connection.authentication import auth_token as at
+from linkahead.connection.mockup import MockUpServerConnection, MockUpResponse
+from linkahead.connection.utils import parse_auth_token
+from linkahead.exceptions import LoginFailedError
+from linkahead import configure_connection
 
 
 def test_get_authentication_provider():
diff --git a/unittests/test_authentication_external.py b/unittests/test_authentication_external.py
index a8fc6f79..66a584ca 100644
--- a/unittests/test_authentication_external.py
+++ b/unittests/test_authentication_external.py
@@ -1,7 +1,7 @@
 #! -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -29,7 +29,7 @@ Tests for the external_credentials_provider modul.
 from __future__ import unicode_literals
 import logging
 from pytest import raises
-from caosdb.connection.authentication import (
+from linkahead.connection.authentication import (
     external_credentials_provider as ecp
 )
 
diff --git a/unittests/test_authentication_keyring.py b/unittests/test_authentication_keyring.py
index 71551449..95f0ad1f 100644
--- a/unittests/test_authentication_keyring.py
+++ b/unittests/test_authentication_keyring.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -23,11 +23,11 @@
 #
 """test_authentication_keyring.
 
-Tests for the caosdb.connection.authentication.keyring module.
+Tests for the linkahead.connection.authentication.keyring module.
 """
 import sys
 from pytest import raises
-from caosdb.connection.authentication.keyring import KeyringCaller
+from linkahead.connection.authentication.keyring import KeyringCaller
 
 
 def test_initialization():
diff --git a/unittests/test_authentication_pass.py b/unittests/test_authentication_pass.py
index 45bda08a..782577b2 100644
--- a/unittests/test_authentication_pass.py
+++ b/unittests/test_authentication_pass.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -23,11 +23,11 @@
 #
 """test_authentication_pass.
 
-Tests for the caosdb.connection.authentication.pass module.
+Tests for the linkahead.connection.authentication.pass module.
 """
 import sys
 from pytest import raises
-_PASSCALLER = "caosdb.connection.authentication.pass"
+_PASSCALLER = "linkahead.connection.authentication.pass"
 __import__(_PASSCALLER)
 PassCaller = sys.modules[_PASSCALLER].PassCaller
 
diff --git a/unittests/test_authentication_plain.py b/unittests/test_authentication_plain.py
index 146b5988..fe117876 100644
--- a/unittests/test_authentication_plain.py
+++ b/unittests/test_authentication_plain.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -23,12 +23,12 @@
 #
 """test_authentication_plain.
 
-Unit tests for the modul caosdb.connection.authentication.plain.
+Unit tests for the modul linkahead.connection.authentication.plain.
 """
 
 from __future__ import unicode_literals
 
-from caosdb.connection.authentication.plain import PlainTextCredentialsProvider
+from linkahead.connection.authentication.plain import PlainTextCredentialsProvider
 from pytest import raises
 
 
@@ -67,4 +67,4 @@ def test_plain_has_logger():
     assert hasattr(p, "logger")
     assert "authentication" in p.logger.name
     assert "connection" in p.logger.name
-    assert "caosdb" in p.logger.name
+    assert "linkahead" in p.logger.name
diff --git a/unittests/test_authentication_unauthenticated.py b/unittests/test_authentication_unauthenticated.py
index 45a709fc..e039dc0b 100644
--- a/unittests/test_authentication_unauthenticated.py
+++ b/unittests/test_authentication_unauthenticated.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
@@ -23,17 +23,17 @@
 #
 """test_authentication_unauthenticated
 
-Unit tests for the module caosdb.connection.authentication.unauthenticated.
+Unit tests for the module linkahead.connection.authentication.unauthenticated.
 """
 
 from __future__ import unicode_literals
 from pytest import raises
 from unittest.mock import Mock
-from caosdb.connection.authentication import unauthenticated
-from caosdb.connection.mockup import MockUpServerConnection, MockUpResponse
-from caosdb.connection.utils import parse_auth_token
-from caosdb.exceptions import LoginFailedError
-from caosdb import configure_connection
+from linkahead.connection.authentication import unauthenticated
+from linkahead.connection.mockup import MockUpServerConnection, MockUpResponse
+from linkahead.connection.utils import parse_auth_token
+from linkahead.exceptions import LoginFailedError
+from linkahead import configure_connection
 from .test_authentication_auth_token import response_with_auth_token
 
 
diff --git a/unittests/test_cached.py b/unittests/test_cached.py
index ce302d67..29404eea 100644
--- a/unittests/test_cached.py
+++ b/unittests/test_cached.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2023 Henrik tom Wörden <h.tomwoerden@indiscale.com>
 # Copyright (C) 2023 IndiScale GmbH <info@indiscale.com>
@@ -19,12 +19,12 @@
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
 #
 
-""" Test the caosdb.cached module """
+""" Test the linkahead.cached module """
 
-from caosdb.cached import (cached_get_entity_by, cache_clear, cache_info, cache_fill,
-                           AccessType, cache_initialize, cached_query)
+from linkahead.cached import (cached_get_entity_by, cache_clear, cache_info, cache_fill,
+                              AccessType, cache_initialize, cached_query)
 from unittest.mock import patch
-import caosdb as db
+import linkahead as db
 from copy import deepcopy
 import pytest
 
@@ -73,7 +73,7 @@ def mocked_gen_query(q, unique):
             return db.Container().extend(DUMMY_SERVER_CONTENT)
 
 
-@patch("caosdb.utils.get_entity.get_entity_by_name")
+@patch("linkahead.utils.get_entity.get_entity_by_name")
 def test_get_by_name(mocked_get_by_name):
     mocked_get_by_name.side_effect = mocked_name_query
     # first call; not in cache -> mocked_execute is touched
@@ -107,7 +107,7 @@ def test_get_by_name(mocked_get_by_name):
     assert c.id == 103
 
 
-@patch("caosdb.utils.get_entity.get_entity_by_id")
+@patch("linkahead.utils.get_entity.get_entity_by_id")
 def test_get_by_id(mocked_get_by_id):
     mocked_get_by_id.side_effect = mocked_id_query
     # first call; not in cache -> mocked_execute is touched
@@ -142,7 +142,7 @@ def test_get_by_id(mocked_get_by_id):
     assert c.name == 'c'
 
 
-@patch("caosdb.cached.get_entity.get_entity_by_path")
+@patch("linkahead.cached.get_entity.get_entity_by_path")
 def test_get_by_path(mocked_get_by_path):
     mocked_get_by_path.side_effect = mocked_path_query
     # first call; not in cache -> mocked_execute is touched
@@ -176,7 +176,7 @@ def test_get_by_path(mocked_get_by_path):
     assert c.id == 105
 
 
-@patch("caosdb.cached.execute_query")
+@patch("linkahead.cached.execute_query")
 def test_get_by_query(mocked_query):
     mocked_query.side_effect = mocked_gen_query
     # test cache initialization
@@ -205,7 +205,7 @@ def test_get_by_query(mocked_query):
     assert cache_info().misses == 2
 
 
-@patch("caosdb.cached.execute_query")
+@patch("linkahead.cached.execute_query")
 def test_cached_query(mocked_query):
     mocked_query.side_effect = mocked_gen_query
     # test cache initialization
@@ -243,7 +243,7 @@ def test_cached_query(mocked_query):
     assert c[0].id == 101
 
 
-@patch("caosdb.utils.get_entity.get_entity_by_name")
+@patch("linkahead.utils.get_entity.get_entity_by_name")
 def test_cache_size(mocked_get_by_name):
     mocked_get_by_name.side_effect = lambda x: x
     # first call; not in cache -> mocked_execute is touched
diff --git a/unittests/test_concrete_property.py b/unittests/test_concrete_property.py
index 0e5c2853..e70668f0 100644
--- a/unittests/test_concrete_property.py
+++ b/unittests/test_concrete_property.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -24,9 +24,9 @@
 """Tests for the _ConcreteProperty class."""
 
 
-from caosdb import configure_connection
-from caosdb.common.models import _ConcreteProperty
-from caosdb.connection.mockup import MockUpServerConnection
+from linkahead import configure_connection
+from linkahead.common.models import _ConcreteProperty
+from linkahead.connection.mockup import MockUpServerConnection
 # pylint: disable=missing-docstring
 from nose.tools import assert_equal as eq
 from nose.tools import assert_is_not_none as there
diff --git a/unittests/test_configs/pycaosdb-server-side-scripting.ini b/unittests/test_configs/pycaosdb-server-side-scripting.ini
deleted file mode 100644
index de2867f8..00000000
--- a/unittests/test_configs/pycaosdb-server-side-scripting.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-; this is the pycaosdb.ini for the server-side-scripting home.
-[Connection]
-url = https://caosdb-server:10443
-cacert = /opt/caosdb/cert/caosdb.cert.pem
-debug = 0
-timeout = 5000
-
-[Misc]
-sendmail = /usr/local/bin/sendmail_to_file
diff --git a/unittests/test_configs/pycaosdb-IntegrationTests.ini b/unittests/test_configs/pylinkahead-IntegrationTests.ini
similarity index 70%
rename from unittests/test_configs/pycaosdb-IntegrationTests.ini
rename to unittests/test_configs/pylinkahead-IntegrationTests.ini
index cb987170..0965b4be 100644
--- a/unittests/test_configs/pycaosdb-IntegrationTests.ini
+++ b/unittests/test_configs/pylinkahead-IntegrationTests.ini
@@ -2,14 +2,14 @@
 ## This sections needs to exist in addition to the usual section
 [IntegrationTests]
 # test_server_side_scripting.bin_dir.local=/path/to/scripting/bin
-test_server_side_scripting.bin_dir.local=/home/myself/test/caosdb-server/scripting/bin
-# test_server_side_scripting.bin_dir.server=/opt/caosdb/git/caosdb-server/scripting/bin
+test_server_side_scripting.bin_dir.local=/home/myself/test/linkahead-server/scripting/bin
+# test_server_side_scripting.bin_dir.server=/opt/linkahead/git/linkahead-server/scripting/bin
 
 # # location of the files from the pyinttest perspective
 # test_files.test_insert_files_in_dir.local=/extroot/test_insert_files_in_dir/
 test_files.test_insert_files_in_dir.local=/home/myself/test/debug_advanced/paths/extroot/test_insert_files_in_dir
-# # location of the files from the caosdb_servers perspective
-test_files.test_insert_files_in_dir.server=/opt/caosdb/mnt/extroot/test_insert_files_in_dir/
+# # location of the files from the LinkAhead server's perspective
+test_files.test_insert_files_in_dir.server=/opt/linkahead/mnt/extroot/test_insert_files_in_dir/
 
 ########## Files ##################
 ## Used by tests of file handling. Specify the path to an existing
@@ -19,8 +19,8 @@ test_files.test_insert_files_in_dir.server=/opt/caosdb/mnt/extroot/test_insert_f
 # location of the files from the pyinttest (i.e. host) perspective
 #test_files.test_insert_files_in_dir.local=/extroot/test_insert_files_in_dir/
 
-# location of the files from the caosdb server's perspective
-#test_files.test_insert_files_in_dir.server=/opt/caosdb/mnt/extroot/test_insert_files_in_dir/
+# location of the files from the LinkAhead server's perspective
+#test_files.test_insert_files_in_dir.server=/opt/linkahead/mnt/extroot/test_insert_files_in_dir/
 
 # # location of the one-time tokens from the pyinttest's perspective
 # test_authentication.admin_token_crud = /authtoken/admin_token_crud.txt
diff --git a/unittests/test_configs/pycaosdb-empty.ini b/unittests/test_configs/pylinkahead-empty.ini
similarity index 100%
rename from unittests/test_configs/pycaosdb-empty.ini
rename to unittests/test_configs/pylinkahead-empty.ini
diff --git a/unittests/test_configs/pycaosdb-indiscale-demo.ini b/unittests/test_configs/pylinkahead-indiscale-demo.ini
similarity index 100%
rename from unittests/test_configs/pycaosdb-indiscale-demo.ini
rename to unittests/test_configs/pylinkahead-indiscale-demo.ini
diff --git a/unittests/test_configs/pycaosdb-real-world-1.ini b/unittests/test_configs/pylinkahead-real-world-1.ini
similarity index 77%
rename from unittests/test_configs/pycaosdb-real-world-1.ini
rename to unittests/test_configs/pylinkahead-real-world-1.ini
index e524f1d3..bfdb48bb 100644
--- a/unittests/test_configs/pycaosdb-real-world-1.ini
+++ b/unittests/test_configs/pylinkahead-real-world-1.ini
@@ -1,6 +1,6 @@
 [Connection]
 url = https://localhost:10443
-cacert = /opt/caosdb/cert/caosdb.cert.pem
+cacert = /opt/linkahead/cert/caosdb.cert.pem
 debug = 0
 timeout = 5000
 
@@ -10,7 +10,7 @@ entity_loan.curator_mail_from=crawler-test@example.com
 entity_loan.curator_mail_to=crawler-test@example.com
 
 [sss_helper]
-external_uri = https://caosdb.example.com:443
+external_uri = https://linkahead.example.com:443
 
 [advancedtools]
 crawler.from_mail=admin@example.com
diff --git a/unittests/test_configs/pycaosdb-real-world-2.ini b/unittests/test_configs/pylinkahead-real-world-2.ini
similarity index 89%
rename from unittests/test_configs/pycaosdb-real-world-2.ini
rename to unittests/test_configs/pylinkahead-real-world-2.ini
index 5ebd115a..b9ebb85a 100644
--- a/unittests/test_configs/pycaosdb-real-world-2.ini
+++ b/unittests/test_configs/pylinkahead-real-world-2.ini
@@ -1,6 +1,6 @@
 [Connection]
 url = https://samplemanager.example.com:443
-cacert = /opt/caosdb/cert/caosdb.cert.pem
+cacert = /opt/linkahead/cert/caosdb.cert.pem
 debug = 0
 timeout = 5000
 [Misc]
diff --git a/unittests/test_configs/pylinkahead-server-side-scripting.ini b/unittests/test_configs/pylinkahead-server-side-scripting.ini
new file mode 100644
index 00000000..74dbb3eb
--- /dev/null
+++ b/unittests/test_configs/pylinkahead-server-side-scripting.ini
@@ -0,0 +1,9 @@
+; this is the pylinkahead.ini for the server-side-scripting home.
+[Connection]
+url = https://linkahead-server:10443
+cacert = /opt/linkahead/cert/caosdb.cert.pem
+debug = 0
+timeout = 5000
+
+[Misc]
+sendmail = /usr/local/bin/sendmail_to_file
diff --git a/unittests/test_configs/pycaosdb1.ini b/unittests/test_configs/pylinkahead1.ini
similarity index 79%
rename from unittests/test_configs/pycaosdb1.ini
rename to unittests/test_configs/pylinkahead1.ini
index dcfa7c21..bd9b085d 100644
--- a/unittests/test_configs/pycaosdb1.ini
+++ b/unittests/test_configs/pylinkahead1.ini
@@ -1,6 +1,6 @@
 [Connection]
 cacert=/very/long/path/to/self/signed/pem/file/caosdb.ca.pem
 url=https://hostname:8833/playground
-password_identifier=SECTION/caosdb
+password_identifier=SECTION/linkahead
 username=username
 password_method=pass
diff --git a/unittests/test_configs/pycaosdb2.ini b/unittests/test_configs/pylinkahead2.ini
similarity index 100%
rename from unittests/test_configs/pycaosdb2.ini
rename to unittests/test_configs/pylinkahead2.ini
diff --git a/unittests/test_configs/pycaosdb3.ini b/unittests/test_configs/pylinkahead3.ini
similarity index 100%
rename from unittests/test_configs/pycaosdb3.ini
rename to unittests/test_configs/pylinkahead3.ini
diff --git a/unittests/test_configs/pycaosdb4.ini b/unittests/test_configs/pylinkahead4.ini
similarity index 100%
rename from unittests/test_configs/pycaosdb4.ini
rename to unittests/test_configs/pylinkahead4.ini
diff --git a/unittests/test_configs/pycaosdb5.ini b/unittests/test_configs/pylinkahead5.ini
similarity index 100%
rename from unittests/test_configs/pycaosdb5.ini
rename to unittests/test_configs/pylinkahead5.ini
diff --git a/unittests/test_configs/pycaosdb6.ini b/unittests/test_configs/pylinkahead6.ini
similarity index 100%
rename from unittests/test_configs/pycaosdb6.ini
rename to unittests/test_configs/pylinkahead6.ini
diff --git a/unittests/test_configuration.py b/unittests/test_configuration.py
index b135e7cd..9522e58c 100644
--- a/unittests/test_configuration.py
+++ b/unittests/test_configuration.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -23,7 +23,7 @@
 #
 
 import pytest
-import caosdb as db
+import linkahead as db
 from os import environ, getcwd, remove
 from os.path import expanduser, isfile, join
 from pytest import raises
@@ -33,18 +33,18 @@ from pytest import raises
 def temp_ini_files():
     created_temp_ini_cwd = False
     created_temp_ini_home = False
-    if not isfile(join(getcwd(), "pycaosdb.ini")):
-        open("pycaosdb.ini", 'a').close()  # create temporary ini file
+    if not isfile(join(getcwd(), "pylinkahead.ini")):
+        open("pylinkahead.ini", 'a').close()  # create temporary ini file
         created_temp_ini_cwd = True
-    if not isfile(expanduser("~/.pycaosdb.ini")):
-        open(expanduser("~/.pycaosdb.ini"), 'a').close()  # create temporary ini file in home directory
+    if not isfile(expanduser("~/.pylinkahead.ini")):
+        open(expanduser("~/.pylinkahead.ini"), 'a').close()  # create temporary ini file in home directory
         created_temp_ini_home = True
     yield 0
     if created_temp_ini_cwd:
-        remove("pycaosdb.ini")
+        remove("pylinkahead.ini")
     if created_temp_ini_home:
-        remove(expanduser("~/.pycaosdb.ini"))
-    environ["PYCAOSDBINI"] = "~/.pycaosdb.ini"
+        remove(expanduser("~/.pylinkahead.ini"))
+    environ["PYCAOSDBINI"] = "~/.pylinkahead.ini"
 
 
 def test_config_ini_via_envvar(temp_ini_files):
@@ -57,10 +57,10 @@ def test_config_ini_via_envvar(temp_ini_files):
     # test wrong configuration file in envvar
     assert not expanduser(environ["PYCAOSDBINI"]) in db.configuration._read_config_files()
     # test good configuration file in envvar
-    environ["PYCAOSDBINI"] = "~/.pycaosdb.ini"
-    assert expanduser("~/.pycaosdb.ini") in db.configuration._read_config_files()
+    environ["PYCAOSDBINI"] = "~/.pylinkahead.ini"
+    assert expanduser("~/.pylinkahead.ini") in db.configuration._read_config_files()
     # test without envvar
     environ.pop("PYCAOSDBINI")
-    assert expanduser("~/.pycaosdb.ini") in db.configuration._read_config_files()
+    assert expanduser("~/.pylinkahead.ini") in db.configuration._read_config_files()
     # test configuration file in cwd
-    assert join(getcwd(), "pycaosdb.ini") in db.configuration._read_config_files()
+    assert join(getcwd(), "pylinkahead.ini") in db.configuration._read_config_files()
diff --git a/unittests/test_connection.py b/unittests/test_connection.py
index 6cc23d87..ca36a716 100644
--- a/unittests/test_connection.py
+++ b/unittests/test_connection.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -21,24 +21,24 @@
 #
 # ** end header
 #
-"""Test caosdb.connection."""
+"""Test linkahead.connection."""
 # pylint: disable=missing-docstring
 from __future__ import print_function, unicode_literals
 
 import re
 from builtins import bytes, str  # pylint: disable=redefined-builtin
 
-from caosdb import execute_query
-from caosdb.configuration import _reset_config, get_config
-from caosdb.connection.authentication.interface import CredentialsAuthenticator
-from caosdb.connection.connection import (CaosDBServerConnection,
-                                          _DefaultCaosDBServerConnection,
-                                          configure_connection)
-from caosdb.connection.mockup import (MockUpResponse, MockUpServerConnection,
-                                      _request_log_message)
-from caosdb.connection.utils import make_uri_path, quote, urlencode
-from caosdb.exceptions import (ConfigurationError, LoginFailedError,
-                               CaosDBConnectionError)
+from linkahead import execute_query
+from linkahead.configuration import _reset_config, get_config
+from linkahead.connection.authentication.interface import CredentialsAuthenticator
+from linkahead.connection.connection import (CaosDBServerConnection,
+                                             _DefaultCaosDBServerConnection,
+                                             configure_connection)
+from linkahead.connection.mockup import (MockUpResponse, MockUpServerConnection,
+                                         _request_log_message)
+from linkahead.connection.utils import make_uri_path, quote, urlencode
+from linkahead.exceptions import (ConfigurationError, LoginFailedError,
+                                  LinkAheadConnectionError)
 from nose.tools import assert_equal as eq
 from nose.tools import assert_false as falz
 from nose.tools import assert_is_not_none as there
@@ -127,11 +127,11 @@ def test_configure_connection():
 
 def test_configure_connection_bad_url():
     configure_connection(url="https://localhost:8888")
-    with raises(CaosDBConnectionError) as exc_info:
+    with raises(LinkAheadConnectionError) as exc_info:
         configure_connection(url="ftp://localhost:8888")
     assert exc_info.value.args[0].startswith(
         "The connection url is expected to be a http or https url")
-    with raises(CaosDBConnectionError) as exc_info:
+    with raises(LinkAheadConnectionError) as exc_info:
         configure_connection(url="localhost:8888")
     assert exc_info.value.args[0].startswith(
         "The connection url is expected to be a http or https url")
@@ -140,8 +140,8 @@ def test_configure_connection_bad_url():
 def test_connection_interface():
     with raiz(TypeError) as cm:
         CaosDBServerConnection()
-    eq(cm.exception.args[0][:55],
-       "Can't instantiate abstract class CaosDBServerConnection")
+    tru(cm.exception.args[0].startswith(
+       "Can't instantiate abstract class CaosDBServerConnection"))
 
     tru(hasattr(CaosDBServerConnection, "request"))
     tru(hasattr(CaosDBServerConnection.request, "__call__"))
diff --git a/unittests/test_connection_utils.py b/unittests/test_connection_utils.py
index 3890ae05..6a95fffa 100644
--- a/unittests/test_connection_utils.py
+++ b/unittests/test_connection_utils.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -21,23 +21,23 @@
 #
 # ** end header
 #
-"""Test caosdb.connection.utils."""
+"""Test linkahead.connection.utils."""
 # pylint: disable=missing-docstring
 from __future__ import unicode_literals, print_function
 from pytest import raises
 from nose.tools import (assert_equal as eq, assert_raises as raiz, assert_true
                         as tru, assert_is_not_none as there, assert_false as
                         falz)
-from caosdb.exceptions import ConfigurationError, LoginFailedError
-from caosdb.connection.utils import parse_auth_token, auth_token_to_cookie
-from caosdb.connection.connection import (
+from linkahead.exceptions import ConfigurationError, LoginFailedError
+from linkahead.connection.utils import parse_auth_token, auth_token_to_cookie
+from linkahead.connection.connection import (
     configure_connection, CaosDBServerConnection,
     _DefaultCaosDBServerConnection)
-from caosdb.connection.mockup import (MockUpServerConnection, MockUpResponse,
-                                      _request_log_message)
-from caosdb.configuration import get_config, _reset_config
-from caosdb.connection.authentication.interface import CredentialsAuthenticator
-from caosdb import execute_query
+from linkahead.connection.mockup import (MockUpServerConnection, MockUpResponse,
+                                         _request_log_message)
+from linkahead.configuration import get_config, _reset_config
+from linkahead.connection.authentication.interface import CredentialsAuthenticator
+from linkahead import execute_query
 
 
 def setup_module():
diff --git a/unittests/test_container.py b/unittests/test_container.py
index 0ac4be44..113dd622 100644
--- a/unittests/test_container.py
+++ b/unittests/test_container.py
@@ -2,7 +2,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
@@ -25,7 +25,7 @@
 """Tests for the Container class."""
 from __future__ import absolute_import
 
-import caosdb as db
+import linkahead as db
 
 
 def test_get_property_values():
diff --git a/unittests/test_datatype.py b/unittests/test_datatype.py
index 9b3c6267..5a5e82cc 100644
--- a/unittests/test_datatype.py
+++ b/unittests/test_datatype.py
@@ -1,5 +1,5 @@
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (c) 2020 IndiScale GmbH
 # Copyright (c) 2020 Daniel Hornung (d.hornung@indiscale.com)
@@ -19,9 +19,9 @@
 #
 # ** end header
 from pytest import raises
-import caosdb as db
-from caosdb.common import datatype
-from caosdb.common.models import _parse_value
+import linkahead as db
+from linkahead.common import datatype
+from linkahead.common.models import _parse_value
 
 
 def test_list():
diff --git a/unittests/test_entity.py b/unittests/test_entity.py
index f2891fda..abf82f0a 100644
--- a/unittests/test_entity.py
+++ b/unittests/test_entity.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -27,9 +27,9 @@ import unittest
 from lxml import etree
 
 import os
-from caosdb import (INTEGER, Entity, Property, Record, RecordType,
-                    configure_connection)
-from caosdb.connection.mockup import MockUpServerConnection
+from linkahead import (INTEGER, Entity, Property, Record, RecordType,
+                       configure_connection)
+from linkahead.connection.mockup import MockUpServerConnection
 
 UNITTESTDIR = os.path.dirname(os.path.abspath(__file__))
 
diff --git a/unittests/test_error_handling.py b/unittests/test_error_handling.py
index 7f974e7d..3f524146 100644
--- a/unittests/test_error_handling.py
+++ b/unittests/test_error_handling.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Florian Spreckelsen <f.spreckelsen@indiscale.com>
@@ -26,14 +26,14 @@ be TransactionErrors at first which may have one or more level of
 children.
 
 """
-import caosdb as db
-from caosdb.common.models import raise_errors
-from caosdb.exceptions import (AuthorizationError,
-                               EntityDoesNotExistError, EntityError,
-                               EntityHasNoDatatypeError,
-                               TransactionError, UniqueNamesError,
-                               UnqualifiedParentsError,
-                               UnqualifiedPropertiesError)
+import linkahead as db
+from linkahead.common.models import raise_errors
+from linkahead.exceptions import (AuthorizationError,
+                                  EntityDoesNotExistError, EntityError,
+                                  EntityHasNoDatatypeError,
+                                  TransactionError, UniqueNamesError,
+                                  UnqualifiedParentsError,
+                                  UnqualifiedPropertiesError)
 
 from pytest import raises
 
diff --git a/unittests/test_exception.py b/unittests/test_exception.py
new file mode 100644
index 00000000..23607f46
--- /dev/null
+++ b/unittests/test_exception.py
@@ -0,0 +1,60 @@
+# -*- encoding: utf-8 -*-
+#
+# This file is a part of the LinkAhead Project.
+#
+# Copyright (C) 2023 Indiscale GmbH <info@indiscale.com>
+# Copyright (C) 2023 Henrik tom Wörden <h.tomwoerden@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/>.
+#
+
+import warnings
+
+from caosdb.exceptions import (CaosDBConnectionError, CaosDBException,
+                               LinkAheadConnectionError, LinkAheadException)
+
+# make sure the deprecation is raised
+with warnings.catch_warnings(record=True) as w:
+    # Cause all warnings to always be triggered.
+    warnings.simplefilter("always")
+    CaosDBException('1')
+
+    assert issubclass(w[-1].category, DeprecationWarning)
+    assert "The name CaosDBException is deprecated" in str(w[-1].message)
+    CaosDBConnectionError('1')
+
+    assert issubclass(w[-1].category, DeprecationWarning)
+    assert "The name CaosDBConnectionError is deprecated" in str(w[-1].message)
+
+
+# make sure the deprecated Error still allows to catch exceptions
+def raiseCE():
+    raise CaosDBException('a')
+
+
+def raiseCCE():
+    raise CaosDBConnectionError('a')
+
+
+# Exception must be caught
+try:
+    raiseCE()
+except CaosDBException as e:
+    print(e.msg)
+
+# Exception must be caught
+try:
+    raiseCCE()
+except CaosDBConnectionError as e:
+    print(e.msg)
diff --git a/unittests/test_file.py b/unittests/test_file.py
index 3c80af7f..dd974cb1 100644
--- a/unittests/test_file.py
+++ b/unittests/test_file.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -22,8 +22,8 @@
 # ** end header
 #
 """Tests for the File class."""
-from caosdb import File, Record, configure_connection
-from caosdb.connection.mockup import MockUpServerConnection
+from linkahead import File, Record, configure_connection
+from linkahead.connection.mockup import MockUpServerConnection
 # pylint: disable=missing-docstring
 from nose.tools import assert_equal as eq
 from nose.tools import assert_is_not_none as there
diff --git a/unittests/test_high_level_api.py b/unittests/test_high_level_api.py
index ea5e635e..7820ed78 100644
--- a/unittests/test_high_level_api.py
+++ b/unittests/test_high_level_api.py
@@ -1,4 +1,4 @@
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -23,31 +23,30 @@
 # A. Schlemmer, 02/2022
 
 
-import caosdb as db
-from caosdb.high_level_api import (convert_to_entity, convert_to_python_object,
-                                   new_high_level_entity)
-from caosdb.high_level_api import (CaosDBPythonUnresolvedParent,
-                                   CaosDBPythonUnresolvedReference,
-                                   CaosDBPythonRecord, CaosDBPythonFile,
-                                   high_level_type_for_standard_type,
-                                   standard_type_for_high_level_type,
-                                   high_level_type_for_role,
-                                   CaosDBPythonEntity)
-from caosdb.apiutils import compare_entities
-
-from caosdb.common.datatype import (is_list_datatype,
-                                    get_list_datatype,
-                                    is_reference)
-
-import pytest
-from lxml import etree
 import os
-import tempfile
+import pdb
 import pickle
-
 import sys
+import tempfile
 import traceback
-import pdb
+
+import linkahead as db
+import pytest
+from linkahead.apiutils import compare_entities
+from linkahead.common.datatype import (get_list_datatype, is_list_datatype,
+                                       is_reference)
+from linkahead.high_level_api import (LinkAheadPythonEntity,
+                                      LinkAheadPythonFile,
+                                      LinkAheadPythonRecord,
+                                      LinkAheadPythonUnresolvedParent,
+                                      LinkAheadPythonUnresolvedReference,
+                                      convert_to_entity,
+                                      convert_to_python_object,
+                                      high_level_type_for_role,
+                                      high_level_type_for_standard_type,
+                                      new_high_level_entity,
+                                      standard_type_for_high_level_type)
+from lxml import etree
 
 
 @pytest.fixture
@@ -92,25 +91,25 @@ def test_convert_record():
         assert obj.c == 18
 
     assert obj.has_parent("bla") is True
-    assert obj.has_parent(CaosDBPythonUnresolvedParent(name="bla")) is True
+    assert obj.has_parent(LinkAheadPythonUnresolvedParent(name="bla")) is True
 
     # Check the has_parent function:
     assert obj.has_parent("test") is False
-    assert obj.has_parent(CaosDBPythonUnresolvedParent(name="test")) is False
+    assert obj.has_parent(LinkAheadPythonUnresolvedParent(name="test")) is False
 
     # duplicate parent
     with pytest.raises(RuntimeError):
         obj.add_parent("bla")
 
     # add parent with just an id:
-    obj.add_parent(CaosDBPythonUnresolvedParent(id=225))
+    obj.add_parent(LinkAheadPythonUnresolvedParent(id=225))
     assert obj.has_parent(225) is True
-    assert obj.has_parent(CaosDBPythonUnresolvedParent(id=225)) is True
+    assert obj.has_parent(LinkAheadPythonUnresolvedParent(id=225)) is True
     assert obj.has_parent(226) is False
-    assert obj.has_parent(CaosDBPythonUnresolvedParent(id=228)) is False
+    assert obj.has_parent(LinkAheadPythonUnresolvedParent(id=228)) is False
 
     # same with just a name:
-    obj.add_parent(CaosDBPythonUnresolvedParent(name="another"))
+    obj.add_parent(LinkAheadPythonUnresolvedParent(name="another"))
     assert obj.has_parent("another") is True
 
 
@@ -164,7 +163,7 @@ def test_convert_with_references():
     obj = convert_to_python_object(r)
     # Parent does not automatically lead to a datatype:
     assert obj.get_property_metadata("ref").datatype == "bla"
-    assert isinstance(obj.ref, CaosDBPythonUnresolvedReference)
+    assert isinstance(obj.ref, LinkAheadPythonUnresolvedReference)
     assert obj.ref.id == 27
 
 
@@ -186,19 +185,19 @@ def test_resolve_references():
 
     # Nothing is going to be resolved:
     obj.resolve_references(False, db.Container())
-    assert isinstance(obj.ref, CaosDBPythonUnresolvedReference)
+    assert isinstance(obj.ref, LinkAheadPythonUnresolvedReference)
     assert obj.ref.id == 27
     assert obj.ref_false == 27
 
     # deep == True does not help:
     obj.resolve_references(True, db.Container())
-    assert isinstance(obj.ref, CaosDBPythonUnresolvedReference)
+    assert isinstance(obj.ref, LinkAheadPythonUnresolvedReference)
     assert obj.ref.id == 27
 
     # But adding the reference container will do:
     obj.resolve_references(False, references)
-    assert not isinstance(obj.ref, CaosDBPythonUnresolvedReference)
-    assert isinstance(obj.ref, CaosDBPythonRecord)
+    assert not isinstance(obj.ref, LinkAheadPythonUnresolvedReference)
+    assert isinstance(obj.ref, LinkAheadPythonRecord)
     assert obj.ref.id == 27
     assert obj.ref.a == 57
     # Datatypes will not automatically be set:
@@ -210,27 +209,27 @@ def test_resolve_references():
     ref.add_property(name="ref", value=225, datatype="bla")
 
     obj = convert_to_python_object(r)
-    assert isinstance(obj.ref, CaosDBPythonUnresolvedReference)
+    assert isinstance(obj.ref, LinkAheadPythonUnresolvedReference)
     obj.resolve_references(False, references)
-    assert not isinstance(obj.ref, CaosDBPythonUnresolvedReference)
-    assert isinstance(obj.ref.ref, CaosDBPythonUnresolvedReference)
+    assert not isinstance(obj.ref, LinkAheadPythonUnresolvedReference)
+    assert isinstance(obj.ref.ref, LinkAheadPythonUnresolvedReference)
     assert obj.ref.ref.id == 225
 
     # Will not help, because ref2 is missing in container:
     obj.resolve_references(True, references)
-    assert not isinstance(obj.ref, CaosDBPythonUnresolvedReference)
-    assert isinstance(obj.ref.ref, CaosDBPythonUnresolvedReference)
+    assert not isinstance(obj.ref, LinkAheadPythonUnresolvedReference)
+    assert isinstance(obj.ref.ref, LinkAheadPythonUnresolvedReference)
     assert obj.ref.ref.id == 225
 
     references.append(ref2)
     obj.resolve_references(False, references)
-    assert not isinstance(obj.ref, CaosDBPythonUnresolvedReference)
-    assert isinstance(obj.ref.ref, CaosDBPythonUnresolvedReference)
+    assert not isinstance(obj.ref, LinkAheadPythonUnresolvedReference)
+    assert isinstance(obj.ref.ref, LinkAheadPythonUnresolvedReference)
     assert obj.ref.ref.id == 225
 
     obj.resolve_references(True, references)
-    assert not isinstance(obj.ref, CaosDBPythonUnresolvedReference)
-    assert not isinstance(obj.ref.ref, CaosDBPythonUnresolvedReference)
+    assert not isinstance(obj.ref, LinkAheadPythonUnresolvedReference)
+    assert not isinstance(obj.ref.ref, LinkAheadPythonUnresolvedReference)
     assert obj.ref.ref.c == "test"
 
     # Test circular dependencies:
@@ -303,7 +302,7 @@ def test_base_properties():
 def test_empty():
     r = db.Record()
     obj = convert_to_python_object(r)
-    assert isinstance(obj, CaosDBPythonRecord)
+    assert isinstance(obj, LinkAheadPythonRecord)
     assert len(obj.get_properties()) == 0
     assert len(obj.get_parents()) == 0
 
@@ -347,7 +346,7 @@ def test_files():
     r = db.File()
     obj = convert_to_python_object(r)
     print(type(obj))
-    assert isinstance(obj, CaosDBPythonFile)
+    assert isinstance(obj, LinkAheadPythonFile)
     assert len(obj.get_properties()) == 0
     assert len(obj.get_parents()) == 0
 
@@ -359,7 +358,7 @@ def test_files():
     obj = convert_to_python_object(r)
     assert r.path == "test.dat"
     assert r.file == "/local/path/test.dat"
-    assert isinstance(obj, CaosDBPythonFile)
+    assert isinstance(obj, LinkAheadPythonFile)
 
     assert obj.path == "test.dat"
     assert obj.file == "/local/path/test.dat"
@@ -385,7 +384,7 @@ def test_files():
     rec = db.Record()
     rec.add_property(name="testfile", value=2, datatype=db.FILE)
     obj = convert_to_python_object(rec)
-    assert type(obj.testfile) == CaosDBPythonUnresolvedReference
+    assert type(obj.testfile) == LinkAheadPythonUnresolvedReference
     assert obj.testfile.id == 2
     assert obj.get_property_metadata("testfile").datatype == db.FILE
 
@@ -467,8 +466,8 @@ def test_list_types():
     assert len(obj.a) == 3
     assert obj.get_property_metadata("a").datatype == "LIST<TestReference>"
     for i in range(3):
-        assert type(obj.a[i]) == CaosDBPythonUnresolvedReference
-    assert obj.a == [CaosDBPythonUnresolvedReference(id=i) for i in [1, 2, 4]]
+        assert type(obj.a[i]) == LinkAheadPythonUnresolvedReference
+    assert obj.a == [LinkAheadPythonUnresolvedReference(id=i) for i in [1, 2, 4]]
 
     # Try resolving:
 
@@ -478,8 +477,8 @@ def test_list_types():
     assert len(obj.a) == 3
     assert obj.get_property_metadata("a").datatype == "LIST<TestReference>"
     for i in range(3):
-        assert type(obj.a[i]) == CaosDBPythonUnresolvedReference
-    assert obj.a == [CaosDBPythonUnresolvedReference(id=i) for i in [1, 2, 4]]
+        assert type(obj.a[i]) == LinkAheadPythonUnresolvedReference
+    assert obj.a == [LinkAheadPythonUnresolvedReference(id=i) for i in [1, 2, 4]]
 
     references = db.Container()
     for i in [1, 2, 4]:
@@ -492,7 +491,7 @@ def test_list_types():
     assert len(obj.a) == 3
     assert obj.get_property_metadata("a").datatype == "LIST<TestReference>"
     for i in range(3):
-        assert type(obj.a[i]) == CaosDBPythonRecord
+        assert type(obj.a[i]) == LinkAheadPythonRecord
 
     assert obj.a[0].val == "1 bla"
 
@@ -523,15 +522,15 @@ def test_list_types():
 
 # Test utility functions:
 def test_type_conversion():
-    assert high_level_type_for_standard_type(db.Record()) == CaosDBPythonRecord
-    assert high_level_type_for_standard_type(db.Entity()) == CaosDBPythonEntity
-    assert standard_type_for_high_level_type(CaosDBPythonRecord()) == db.Record
-    assert standard_type_for_high_level_type(CaosDBPythonEntity()) == db.Entity
-    assert standard_type_for_high_level_type(CaosDBPythonFile(), True) == "File"
-    assert standard_type_for_high_level_type(CaosDBPythonRecord(), True) == "Record"
-    assert high_level_type_for_role("Record") == CaosDBPythonRecord
-    assert high_level_type_for_role("Entity") == CaosDBPythonEntity
-    assert high_level_type_for_role("File") == CaosDBPythonFile
+    assert high_level_type_for_standard_type(db.Record()) == LinkAheadPythonRecord
+    assert high_level_type_for_standard_type(db.Entity()) == LinkAheadPythonEntity
+    assert standard_type_for_high_level_type(LinkAheadPythonRecord()) == db.Record
+    assert standard_type_for_high_level_type(LinkAheadPythonEntity()) == db.Entity
+    assert standard_type_for_high_level_type(LinkAheadPythonFile(), True) == "File"
+    assert standard_type_for_high_level_type(LinkAheadPythonRecord(), True) == "Record"
+    assert high_level_type_for_role("Record") == LinkAheadPythonRecord
+    assert high_level_type_for_role("Entity") == LinkAheadPythonEntity
+    assert high_level_type_for_role("File") == LinkAheadPythonFile
     with pytest.raises(RuntimeError, match="Unknown role."):
         high_level_type_for_role("jkaldjfkaldsjf")
 
@@ -556,11 +555,11 @@ def test_deserialization():
     obj = convert_to_python_object(r)
 
     serial = obj.serialize()
-    obj_des = CaosDBPythonEntity.deserialize(serial)
+    obj_des = LinkAheadPythonEntity.deserialize(serial)
 
     assert obj_des.name == "test"
     assert obj_des.id == 17
-    assert obj_des.has_parent(CaosDBPythonUnresolvedParent(name="bla"))
+    assert obj_des.has_parent(LinkAheadPythonUnresolvedParent(name="bla"))
     print(obj)
     print(obj_des)
 
@@ -574,7 +573,7 @@ def test_deserialization():
     obj = convert_to_python_object(f)
 
     serial = obj.serialize()
-    obj_des = CaosDBPythonEntity.deserialize(serial)
+    obj_des = LinkAheadPythonEntity.deserialize(serial)
     assert obj_des.file == "bla.test"
     assert obj_des.path == "/test/n/bla.test"
 
@@ -593,7 +592,7 @@ def test_deserialization():
     obj = convert_to_python_object(r)
 
     serial = obj.serialize()
-    obj_des = CaosDBPythonEntity.deserialize(serial)
+    obj_des = LinkAheadPythonEntity.deserialize(serial)
     assert obj.serialize() == obj_des.serialize()
 
 
diff --git a/unittests/test_issues.py b/unittests/test_issues.py
index 3fb48416..7472f710 100644
--- a/unittests/test_issues.py
+++ b/unittests/test_issues.py
@@ -1,4 +1,4 @@
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (c) 2022 IndiScale GmbH
 # Copyright (c) 2022 Daniel Hornung (d.hornung@indiscale.com)
@@ -22,7 +22,7 @@
 import os
 
 import lxml
-import caosdb as db
+import linkahead as db
 
 from pytest import raises
 
diff --git a/unittests/test_message.py b/unittests/test_message.py
index 440e7169..d54b2daa 100644
--- a/unittests/test_message.py
+++ b/unittests/test_message.py
@@ -1,7 +1,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -23,16 +23,14 @@
 #
 # ** end header
 #
-import caosdb as db
 from copy import deepcopy
 
-
+import linkahead as db
 import pytest
 
 
 def test_messages_dict_behavior():
-    from caosdb.common.models import Message
-    from caosdb.common.models import Messages
+    from linkahead.common.models import Message, Messages
 
     msgs = Messages()
 
diff --git a/unittests/test_plantuml.py b/unittests/test_plantuml.py
index a507c36b..4605ebcb 100644
--- a/unittests/test_plantuml.py
+++ b/unittests/test_plantuml.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2022 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2022 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -29,9 +29,9 @@ test plantuml utility
 
 import tempfile
 import pytest
-import caosdb as db
+import linkahead as db
 import shutil
-from caosdb.utils.plantuml import to_graphics
+from linkahead.utils.plantuml import to_graphics
 
 
 @pytest.fixture
diff --git a/unittests/test_property.py b/unittests/test_property.py
index 84f89b5a..0fea6e51 100644
--- a/unittests/test_property.py
+++ b/unittests/test_property.py
@@ -1,6 +1,6 @@
 # -*- encoding: utf-8 -*-
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -24,8 +24,8 @@
 """Tests for the Property class."""
 import os
 
-import caosdb as db
-from caosdb import Entity, Property, Record
+import linkahead as db
+from linkahead import Entity, Property, Record
 # pylint: disable=missing-docstring
 from lxml import etree
 
diff --git a/unittests/test_query.py b/unittests/test_query.py
index 12622ea4..2c13f4b6 100644
--- a/unittests/test_query.py
+++ b/unittests/test_query.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2021 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2021 Timm Fitschen <f.fitschen@indiscale.com>
@@ -22,7 +22,7 @@
 # ** end header
 #
 from lxml import etree
-import caosdb as db
+import linkahead as db
 
 
 def test_query_parsing():
diff --git a/unittests/test_record.py b/unittests/test_record.py
index c08a3eb1..92c0f84a 100644
--- a/unittests/test_record.py
+++ b/unittests/test_record.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -26,7 +26,7 @@
 #
 """Tests for the Record class."""
 # pylint: disable=missing-docstring
-from caosdb import Entity, Record, RecordType
+from linkahead import Entity, Record, RecordType
 
 
 def test_is_entity():
diff --git a/unittests/test_record_type.py b/unittests/test_record_type.py
index f31c56de..594f9c64 100644
--- a/unittests/test_record_type.py
+++ b/unittests/test_record_type.py
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -22,8 +22,8 @@
 # ** end header
 #
 """Tests for the RecordType class."""
-from caosdb import Entity, RecordType, configure_connection
-from caosdb.connection.mockup import MockUpServerConnection
+from linkahead import Entity, RecordType, configure_connection
+from linkahead.connection.mockup import MockUpServerConnection
 # pylint: disable=missing-docstring
 from nose.tools import assert_equal as eq
 from nose.tools import assert_is_not_none as there
diff --git a/unittests/test_schema.py b/unittests/test_schema.py
index fc3f63a4..feb84e3b 100644
--- a/unittests/test_schema.py
+++ b/unittests/test_schema.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2022 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2021 Alexander Schlemmer
@@ -27,7 +27,7 @@ from jsonschema.exceptions import ValidationError
 from pytest import raises
 from glob import glob
 import os
-from caosdb.configuration import config_to_yaml, validate_yaml_schema
+from linkahead.configuration import config_to_yaml, validate_yaml_schema
 from configparser import ConfigParser
 
 
diff --git a/unittests/test_server_side_scripting.py b/unittests/test_server_side_scripting.py
index b699c448..7749af98 100644
--- a/unittests/test_server_side_scripting.py
+++ b/unittests/test_server_side_scripting.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
@@ -25,9 +25,9 @@
 import json
 from urllib.parse import parse_qs
 from unittest.mock import Mock
-from caosdb.utils import server_side_scripting as sss
-from caosdb.connection.mockup import MockUpServerConnection, MockUpResponse
-from caosdb import configure_connection
+from linkahead.utils import server_side_scripting as sss
+from linkahead.connection.mockup import MockUpServerConnection, MockUpResponse
+from linkahead import configure_connection
 
 _REMOVE_FILES_AFTERWARDS = []
 
diff --git a/unittests/test_state.py b/unittests/test_state.py
index 202c7a02..d2bb08b7 100644
--- a/unittests/test_state.py
+++ b/unittests/test_state.py
@@ -1,7 +1,7 @@
 import pytest
-import caosdb as db
-from caosdb import State, Transition
-from caosdb.common.models import parse_xml, ACL
+import linkahead as db
+from linkahead import State, Transition
+from linkahead.common.models import parse_xml, ACL
 from lxml import etree
 
 
diff --git a/unittests/test_utils.py b/unittests/test_utils.py
index 42d18ba0..3d8e2896 100644
--- a/unittests/test_utils.py
+++ b/unittests/test_utils.py
@@ -1,7 +1,7 @@
 # coding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -21,10 +21,10 @@
 #
 # ** end header
 #
-"""Tests for caosdb.common.utils."""
+"""Tests for linkahead.common.utils."""
 from __future__ import unicode_literals
 from lxml.etree import Element
-from caosdb.common.utils import xml2str
+from linkahead.common.utils import xml2str
 
 
 def test_xml2str():
diff --git a/unittests/test_versioning.py b/unittests/test_versioning.py
index 5047069c..4fbe96d3 100644
--- a/unittests/test_versioning.py
+++ b/unittests/test_versioning.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
@@ -23,16 +23,16 @@
 #
 
 from __future__ import absolute_import
-from caosdb import Record
-from caosdb.common.utils import xml2str
-from caosdb.common.versioning import Version
+from linkahead import Record
+from linkahead.common.utils import xml2str
+from linkahead.common.versioning import Version
 from .test_property import testrecord
 from lxml import etree
 
 
 def test_constructor():
     v = Version(id="1234abcd", date="2020-01-01T20:15:00.000UTC",
-                username="testuser", realm="CaosDB", is_head=True,
+                username="testuser", realm="LinkAhead", is_head=True,
                 predecessors=[Version(id="2345abdc",
                                       date="2020-01-01T20:00:00.000UTC")],
                 successors=[Version(id="3465abdc",
@@ -40,7 +40,7 @@ def test_constructor():
     assert v.id == "1234abcd"
     assert v.date == "2020-01-01T20:15:00.000UTC"
     assert v.username == "testuser"
-    assert v.realm == "CaosDB"
+    assert v.realm == "LinkAhead"
     assert v.is_head is True
     assert isinstance(v.predecessors, list)
     assert isinstance(v.predecessors[0], Version)
diff --git a/unittests/test_yamlapi.py b/unittests/test_yamlapi.py
index cdb1e049..027e5750 100644
--- a/unittests/test_yamlapi.py
+++ b/unittests/test_yamlapi.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead Project.
 #
 # Copyright (C) 2021 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2021 Alexander Kreft <akreft@trineo.org>
@@ -22,9 +22,9 @@
 import os
 import warnings
 import tempfile
-from caosdb.yamlapi import (append_sublist, kv_to_xml,
-                            dict_to_xml, yaml_to_xml,
-                            process, yaml_file_to_xml)
+from linkahead.yamlapi import (append_sublist, kv_to_xml,
+                               dict_to_xml, yaml_to_xml,
+                               process, yaml_file_to_xml)
 
 with warnings.catch_warnings(record=True) as w:
     # Cause all warnings to always be triggered.
-- 
GitLab