diff --git a/.gitignore b/.gitignore
index 55fb3f0d1bc6c101704557da8f35d6e784b5ea89..04a7ba7bdfc8fb1a5e4885e412e31ed218469730 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@ __pycache__/
 dist/
 build/
 src/caosdb/version.py
+src/linkahead/version.py
 
 # documentation
 _apidoc
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0430a4f6b5ac08d4ab38f00bff78b845e11fb97e..dfe61ff4e0c4a107e6f1e24667e271557eef2de3 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 a7e90f8df2358a8fbcd9a9798a8f38e9150e2609..858790276e69616205d22401781726b739936a52 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,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 0a0888ad0484c0307583e139e65058c38574ed3a..d15c830d8e4cf6e4bc0b519b9fa5b8cb5f224043 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 7215591a4f31f1946029442de291eb9ccf9beea1..193cb8f0cff8ff5cee36a40a78e53f070527e2e0 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 01eea85188078ae6f2fe226e89e5c227497b4bd0..b05eff87711b84682aa82bbd0aafd61f2e8c86eb 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 95ee8e314871153476c30790a456242e38dcaf9e..b3025f0021ac82a29db5380be021ccaec86b96f9 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 0000000000000000000000000000000000000000..bb2162ee7642576d5ecbef5f2556fc0ad74a0573
--- /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 c7eab4a64e6797f26b49716499ee4e0267b167a1..9a3d766791ca7a6fd111d734d08ac4cf3b85b75a 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 8cf74e43c5db32ed139c4fe371a6c2b3831b2ee1..f37e24e0e5b754ec58a07b034ba2755096f0b441 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 71bd9c05b4e86133cc356e1c15359701642a9486..0c5013eb7fac64d2ee04e8a7ab02f39342f411a8 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 8162b11bfefb41b1bcdbc74b8e314f99a61d1a4e..a558bde73897cb6827c93373cc8327efc10e6e15 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 8fdf3b1c63322ec48af398d1dcb1c4028355d473..f5bc6afcb28ac1c80ac951cc2141f883e8953634 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 acf323e860a93753b57f2e104531383b412f3fa0..3a8c5ba39c88deaa5dc945135e3828945fd39d58 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 a46e30375b924d358448e73aece61562c36c700b..597342e38a961c628edd84dd8dff37471ef2570b 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)
 
diff --git a/src/caosdb/cached.py b/src/caosdb/cached.py
index 131526674d7df97d598a6d1bfbc2af7805c63a03..2eff5b1b7e0b9c3a6b3b5b461c6920a2a90f3202 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 436281df8077b2cbf357537d36b21567b86ea5a2..f74e0da15952a3ed0bea2b3f3ebffe1cb5754cc4 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 a27aaf0406c83ac33c37b676a9cdeab812bf2f7a..417081b0dad19ce15049b8ce05aeef8cc86607f7 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 03ff6d023ab0d3005c37d56c65353c1a1072518e..832844567bca31f4c46e205094daa709a8af9e71 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 18175043d842eca784cc353119c1cf796d4793d5..75ee469bfb78f43054cffd2d29d723804ababc5f 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,27 @@ 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, PagingConsistencyError,
-                               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, PagingConsistencyError,
+                          QueryNotUniqueError, TransactionError,
+                          UniqueNamesError, UnqualifiedParentsError,
+                          UnqualifiedPropertiesError)
+from .datatype import (BOOLEAN, DATETIME, DOUBLE, INTEGER, TEXT,
+                       is_list_datatype, is_reference)
+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 +86,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 +589,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 +1366,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 +1395,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 +1452,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 +1776,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 +1910,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 +1966,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 +1989,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 +2156,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 +3054,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 +3254,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 +3422,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 +3507,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 +3669,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 +3905,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).")
 
 
@@ -4570,7 +4571,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
@@ -4589,14 +4590,14 @@ class Info():
 
     def __str__(self):
         if "Counts" not in [m.type for m 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__()
@@ -4837,7 +4838,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 cb74022bef57a77c8270b2033c904eecabaadf83..82f314e80191163f14a5c4babdd749f977f2901b 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 f0ce740d38d90b0c7bb1031e808b83efb2207a43..b333e3e07253397e54f3e2830a7cdcce42fa2e1e 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 2875486a13347a2eb834d22580497033699ebd37..facfbc488e413e090ea1a856501ccd96334f8354 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 1c108ac1d39c135dbc90f477be8b8f2f630391ce..81642fd8926bb1ab5dae64ad5032eab54c63b559 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,48 @@ 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``).
+    If deprecated names are used (starting with 'pycaosdb'), those used in addition but the files
+    with the new naming scheme take precedence.
+    All of these files 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 688123867f68153d3631bb8559baa235f6f02da5..bf2b76345a62f06de2bdbaf25b6b1e7e17dc8fc5 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 1cf4cefc90de2a0281528eb83c1efe55eda4f345..3d1b8afa17f58a87f09afba90c4bc7ae6dcba693 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 7edec7c814d9019d43701b33d4022063081714a7..2799207354b3949063461229d7d465e8a83c83ae 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 f2cc5001cf8fa0f6d61ec65346f6a200ba0dfcd8..6de43b81f441ab60401c1c01885eaa514790d3de 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 99d184136c20b23557efea0b54c648095a8d3ab2..202520bbab7e940ccce6517e640eff5904039553 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 853cdf0ed92039e7b5fc9beda8bb76cc0f3cc030..bec307401f945a6cd2e223195e0cce2396602061 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 83dd592940a7010d07112f73b9bd5bcf3741a168..162cd365b76349c4baf1831900236c832c593547 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 65febae8fd8f02f3ee0d339fafb36af512fc7be7..590b7914199eb47bd2dbe064106ad6215255ad4f 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 46dadea9dfcfa6e614493b75d709f604aa188ef6..db6b66f17dd3eb8c4415119912d5586c6543b953 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("/")
@@ -333,7 +333,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 +349,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 +371,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 +384,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 +395,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 +412,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 +423,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 +514,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 +641,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 0b826cc4400275a2374308ee104cdbdabb619b75..6b328285e97e4dce2483ddd955134ee64cd3ce84 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 a6f739171597a848356321578f4a4065a2e94006..d63dbeb8cc4cd59e056823440948aa54906dd47c 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 b37670b867cd88cf47e64084c6ccc802cad463b4..9b69971c0409708f221c402f540fac85ff9c527e 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 095d47035e24dad5b6d7041f5d3b8a739652f271..90ec6b5ba6789747f5d4452a1260306b716b1f7e 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 ebbb52565ca7e95b064664da22797489c0d4d422..a6abe09edbbece2a38bdc6c5e1296a2b3dd81bde 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,13 +156,13 @@ 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."""
 
 
@@ -162,9 +182,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).
@@ -174,7 +194,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 3509a7b6bfe7ec322f2e0d2590334c6fc6f02cf8..70f1be36283b706f8d38d450d937ab13a9b9e699 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,29 +25,25 @@
 #
 
 """
-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 .apiutils import create_flat_list, get_type_of_entity_with
+from .common.datatype import (BOOLEAN, DATETIME, DOUBLE, FILE, INTEGER,
+                              REFERENCE, TEXT, get_list_datatype,
+                              is_list_datatype, is_reference)
+
 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.""")
diff --git a/src/caosdb/schema-pycaosdb-ini.yml b/src/caosdb/schema-pycaosdb-ini.yml
index cb07dfeb84bc16e212100232403b0f66543c73e9..89ce98570738fdd29dba81de25a2c022c1581467 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
old mode 100755
new mode 100644
index 09a8f64a3c6b9f0825089949840a8791604d1ded..4128a5d0b4a45b96adcabd04820aa8b4c1c2c3c8
--- a/src/caosdb/utils/caosdb_admin.py
+++ b/src/caosdb/utils/caosdb_admin.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
@@ -20,638 +20,12 @@
 # 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 warnings
 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)
 
+from linkahead.utils.linkahead_admin import main
 
 if __name__ == "__main__":
+    warnings.warn("caosdb_admin.py is deprecated. Please use linkahead_admin.py",
+                  DeprecationWarning)
     sys.exit(main())
diff --git a/src/caosdb/utils/checkFileSystemConsistency.py b/src/caosdb/utils/checkFileSystemConsistency.py
index 6c053fdca6acb3a6585589c0e6298ba0704ea590..29d03dd5c63da3713ab134573f80a0b96919ce9f 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 419e1c9f2b97171be0dccf1bc772ae5db679c0b7..5f6ecc8148859d0ee0908412ff80d20d465cdb25 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 a27aafa99ffe3759a46876a5bcd5e686d631b1dc..ea9f3228bfc32f223979846623fccdec45752e5d 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 0000000000000000000000000000000000000000..f7e3b8b63f18e37e6210f2aa03f34ce5b0f688d4
--- /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 6252a48983c62e7a2f33113422205209d616b5b6..e5432dcebff7bd7aef83d2ad0355b34d82fbf331 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 9d0afcbb0845e1d8d31622e8ab9926f26f7e78f6..6909544fed5a6f80572f60ba102c72b53568d897 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 7e5ee4390ae3314792d12fd2942980aa3d9c9773..06caa3d94a629e368dc99f83dc2957c756b7b487 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 80bb4b13e4d1626c5d29c8950f3a22bbb73e0fdb..8b5eda55460ae085de11c6bc2507dd98e578d682 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 64219c5957ee963e84f9305685f2ec4e8ed3d761..f25b8e501d5f295af9b17700b76f58494b62b66f 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 eab02e43a833559dc21ea7a9fa5edfaf6431facf..cef9b69483339ebb803b4882fd73beb189c5c184 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 29625a0a105dacdea2183eac743d1904a7743ec7..2438614f3b1fb8f1b392fef9a03f618dc1cf9750 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 0fa5de575f5424e267cad8ecc193cca8230faa8b..197a44ece41aeebffe6785669b3e5713f1ddc484 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 02cbbd7b13d916a676ad26c277e370ae76bf3725..54ae251b9db9ef000545e701406b979aa58043f8 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 de6170fa42674ed4e3161fb791a397a149dba659..7c85de95b07c8101c04e8fcac82205e20fb9e8a6 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 658f9a6a93e23957b20aee5f38e5565bde35af80..b8ed911d9fdeb2cc64023ee0c6ec2306f84d5afa 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 fa6b4022b7fbc1d042ed00f265e63a2675794a21..f5113a9812a37e8b8dd8e95599fba8061967640b 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 16b4b7f6f1bb9abfb7e191c6a1101181984bce9a..a9c9f319b3c153bebd09516d46a75e1f28eb40bf 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 bfba4317c3556d0692eb402f42ba3699be586d5a..f3c6c699d110ca2927e75a4a37055a020b55918a 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 342d5d980fc2b1a981f4a76d99e1954f8b2f5c2a..f92e7b7f0cdc305fbe8a19a4c3d8755d1348c16e 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 ce1a7f457a142e36ef9f2b0cfe6a4df0b9fcedf6..887c6219d80b579bda50fff5cf6411798579228c 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.rst b/src/doc/high_level_api.rst
index e92f2dd5e326b14222ad3c776ce5f5ed1ed31536..5f8ae7f9b998fd1205674250383f06ae25aaf460 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 7344b6aacdd55fd75f4940d834104faa00c33069..5e5a5e8801b0bd4c91ce225766d7973ee8fa2b92 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 82df07691f7c78a2787d67463ca222d2e68249ca..6804ef5cd67f0febfcb0ab20f40e10aa16547b8b 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 50ed13201e5720de22bf0b605bc5162834a458a8..5bcc97fb7ef097cfa8463e9736ee891152e55559 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 c40cad28b8c9a3be537c641b9614da2eb4df8dd9..960d542feea44103dbdb493860207d4de434ee2b 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 aad9a1ddbd9e93a3cd06887eaffcf956c3c5bea6..e814d32ff1be12708c6f0ec93b9424aa5a813ff4 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 7b45b6a2681bcf781fd4acc9329ffada28d4e01c..569acdae174a9df9d0d2b5eae9a0084d793cc90c 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 f6967c57a0a3de6e7c6fd3d2b64d3f59620526de..fa21c0c413fa2b72f247f5823fc98ea3a765868e 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 37c53c9b527a0435f9f24ae6c6e71687e73eb963..ed0c786905c4a3868902863364a753c5df37b082 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 c84ec52aa63f0563b22c698081e89600c7af6122..d2a7019b14e469854dbc25efec60a1a9b0bdbacf 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 ce37993d7ec5e0888da8a2b4c58904bcbdc43bb4..706e26c2b1b4876c29d43c2bddd9a5fe357a003d 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 93f0fdcf742efc70bc80f5113eb7c6ddbbf87cde..de5f34b47e3d30b2789c116b915b1402b676ad44 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 7c84050b0a55ae6e1e8f2e2583f894a69f691193..a5f355fe23d00449ea470fa80f81a4e8e1914242 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 633c25ad5c4046c0fa41b66049bdf56aa695f482..c004979fd4fc437bdca5a3d037417e5f47f45b42 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 0d3183b4c0ca5517ecea68d0e49bbf335bb2a13e..2989adec5ded5dd227b21771a0d723c45952782a 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 25a7d0de7d2a591135ddf21530f23ad532101c53..7f40aa9437b327e140ab0de3a3438522a31b200c 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 bda381cf6427377194e272dfa14b83399b6f012f..bb6f978bb83c4ee32cc485f538b8807c8f7012dd 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 d0eb6b90883951af584d42a80e319c14891f6e50..3142f1f9f54230cb19666eeb8ff5809a906f9d49 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 a8fc6f79578c9812dab52dd1fa3807f62fd710fb..66a584ca4b2e6a2ee49bf1f16ae25ff26983fdd6 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 715514498b406478a3bddcc64c7794316f64368e..95f0ad1f61072297a7eacf2e6601ea8ff83e8bbf 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 45bda08a46bcc95aa73e5609f053f3ac178901dc..782577b26bb5ae0ed3b8c74cc5ac4b21b59562f0 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 146b59889c71c86ea77fb4ae962118cdda1afb06..fe11787633c9f12ccec9ef27b89e446a0ddeb1b5 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 45a709fcc62b609a97de7e87dd6c6f6ac94a55a1..e039dc0bc9cd064ffe1d49d9f4e0de2aa7f7cd61 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 ce302d671d6077aed7d8457e70da2076ebe65d50..29404eea07a0e9e8be270f45ccf2952a4deac735 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 0e5c28534c7ac404b829df575225f42e908adb01..e70668f02aab12762a342f035a974f708652ae69 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 de2867f8dc66b3e81f10f35e40c36f9cb8591604..0000000000000000000000000000000000000000
--- 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 cb9871708f7f23c489de0cbc8f4fbda15dfa6ad0..0965b4be218703c14bfb2c0091e989af7387051f 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 e524f1d3465c61d89ae4a4dda54536a722f99837..bfdb48bb56de6e834af020d5ee6da082a91050f2 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 5ebd115a4a4de189d22180130acca2a4b78b6daf..b9ebb85a4e114f1e1aeabf74a7e11d6f0c2cdbd2 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 0000000000000000000000000000000000000000..74dbb3eb97d4e7df90223779481f3632c8fab7a3
--- /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 dcfa7c21fac735d81ab92b33f0abd31df25fc1ad..bd9b085dcf4e47c3a55c2521d0c4bf05dcd532ef 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 b135e7cd65b11be7cb6c4ef2237a41a6639ccbb7..9522e58c735b1c7e0efd6d029fe41c9e4e71088a 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 6cc23d87c5cdcf639709a444849a856a8c70af5f..ca36a71680f8e13ac9114b9ab0bff0b6a96ea4c3 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 3890ae05cfe38b78a5ba0829753420246bdb560d..6a95fffa2f5f3dbfb302e035deee2f24fab9acf5 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 0ac4be44826825aa3302119c8bca08f335ab68d3..113dd6223a9a8cd246b3b2998faa586fbae3da11 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 9b3c6267fb018e2cd3085dea568d7396c4549ac8..5a5e82cc5bfba9ac46a91b4baf4fe45665049c84 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 f2891fda266e1d62139b4cb2667c31b090ca6498..abf82f0a9b557cf9d1d2365e01fedaa4eae0c565 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 7f974e7db826d093e335b250953658b08db062cd..3f5241466e9a8f810b581cbb587e17ccf8f123ee 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 0000000000000000000000000000000000000000..23607f46e1794ff336aa6687403c69f99b851988
--- /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 3c80af7f362a7cdabe0a9ebc89cd2986d04fe242..dd974cb176ca69e2ffb065b5de185611e528e815 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_issues.py b/unittests/test_issues.py
index 3fb48416511ba654d6f998442319c4ff29ac2956..7472f710cea32c1d76f11e52fe7c3c3617804c3c 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 440e7169501afb0a35acb78df95cefae01bd9426..d54b2daaf43778452adbd1564bbaa459ea0e7ff3 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 a507c36b2d3a4246205fc7507cb05119c575084c..4605ebcb24a785c4f176e9008c837177eac1e3cc 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 84f89b5a959192d7831e1bb3eab3a441912afe7e..0fea6e5111d687d8f1b15ba189ec4f75405b5af2 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 12622ea486dda717ca1fbc1255510575c5e0c8e6..2c13f4b6488efacf32fc8c0afb8e26e29e0d7bc7 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 c08a3eb1605d25ce4a9f142895e50647fe02cc3a..92c0f84a8115b1483b0f860a32009f775378a286 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 f31c56decfc394211940296babc83200a470cc8a..594f9c647997d68cccdcccc56eaab482cd694c74 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 fc3f63a4cbaeadcac3c1cb9be2d861a0688fe4b0..feb84e3b7cd2825ef50d712cfaf089b2c4905b35 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 b699c4482d02972282167eb9683a956097ebc5e9..7749af982113c71be1717646e83813ee34c7cff0 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 202c7a02af3db28434406626e5164def46febed7..d2bb08b791e3fc087b6078855667c4b5b3354024 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 42d18ba06eb7516bb318de54cb537f548cfe9081..3d8e2896247f66c98f1461c1a1e91baca5f01cb6 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 5047069ca17b573b8b54dcaab984419083d06859..4fbe96d3a9abbeba80a530f4049aefc8d19036e8 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 cdb1e0499890ee58d10ff7f102632e104ef60868..027e5750d74cabe7a102eb01415aeb3c2c950f61 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.