diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index c38f56968aed1f151139f7f15990ec993d94057e..885b791421f5ddef4014692409e9358d7e6c507d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -39,6 +39,10 @@ variables:
   CPPINT: ""
   MYSQLBACKEND: ""
 
+workflow:
+  rules:
+    - if: $CI_PIPELINE_SOURCE != "merge_request_event" && $CI_COMMIT_REF_NAME != $CI_COMMIT_TAG
+
 image: $CI_REGISTRY_IMAGE
 stages:
   - info
@@ -70,8 +74,11 @@ build-testenv:
   image: docker:20.10
   stage: setup
   timeout: 3h
-  only:
-    - schedules
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "schedule"
+    - if: $CI_PIPELINE_SOURCE != "schedule"
+      changes:
+        - src/test/docker/Dockerfile
   script:
     - cd src/test/docker
     - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
@@ -136,9 +143,8 @@ trigger_inttest:
 pages_prepare: &pages_prepare
   tags: [ cached-dind ]
   stage: deploy
-  only:
-    refs:
-      - /^release-.*$/i
+  rules:
+    - if: $CI_COMMIT_REF_NAME =~ /^release-.*$/i
   script:
     - echo "Deploying..."
     - make doc
@@ -148,6 +154,5 @@ pages_prepare: &pages_prepare
       - public
 pages:
   <<: *pages_prepare
-  only:
-    refs:
-      - main
+  rules:
+    - if: $CI_COMMIT_REF_NAME == 'main'
diff --git a/.gitlab/issue_templates/Default.md b/.gitlab/issue_templates/Default.md
new file mode 100644
index 0000000000000000000000000000000000000000..aa1a65aca363b87aff50280e1a86824009d2098b
--- /dev/null
+++ b/.gitlab/issue_templates/Default.md
@@ -0,0 +1,28 @@
+## Summary
+
+*Please give a short summary of what the issue is.*
+
+## Expected Behavior
+
+*What did you expect how the software should behave?*
+
+## Actual Behavior
+
+*What did the software actually do?*
+
+## Steps to Reproduce the Problem
+
+*Please describe, step by step, how others can reproduce the problem.  Please try these steps for yourself on a clean system.*
+
+1.
+2.
+3.
+
+## Specifications
+
+- Version: *Which version of this software?*
+- Platform: *Which operating system, which other relevant software versions?*
+
+## Possible fixes
+
+*Do you have ideas how the issue can be resolved?*
diff --git a/.gitlab/merge_request_templates/Default.md b/.gitlab/merge_request_templates/Default.md
new file mode 100644
index 0000000000000000000000000000000000000000..35c6d01c5904289b77fc7f1de9419ef91a1510e9
--- /dev/null
+++ b/.gitlab/merge_request_templates/Default.md
@@ -0,0 +1,54 @@
+# Summary
+
+*Insert a meaningful description for this merge request here:  What is the new/changed behavior?
+Which bug has been fixed? Are there related issues?*
+
+
+# Focus
+
+*Point the reviewer to the core of the code change. Where should they start reading? What should
+they focus on (e.g. security, performance, maintainability, user-friendliness, compliance with the
+specs, finding more corner cases, concrete questions)?*
+
+
+# Test Environment
+
+*How to set up a test environment for manual testing?*
+
+
+# Check List for the Author
+
+Please, prepare your MR for a review. Be sure to write a summary and a focus and create gitlab
+comments for the reviewer. They should guide the reviewer through the changes, explain your changes
+and also point out open questions. For further good practices have a look at [our review
+guidelines](https://gitlab.com/caosdb/caosdb/-/blob/dev/REVIEW_GUIDELINES.md)
+
+- [ ] All automated tests pass
+- [ ] Reference related issues
+- [ ] Up-to-date CHANGELOG.md (or not necessary)
+- [ ] Up-to-date JSON schema (or not necessary)
+- [ ] Appropriate user and developer documentation (or not necessary)
+  - How do I use the software?  Assume "stupid" users.
+  - How do I develop or debug the software?  Assume novice developers.
+- [ ] Annotations in code (Gitlab comments)
+  - Intent of new code
+  - Problems with old code
+  - Why this implementation?
+
+
+# Check List for the Reviewer
+
+- [ ] I understand the intent of this MR
+- [ ] All automated tests pass
+- [ ] Up-to-date CHANGELOG.md (or not necessary)
+- [ ] Appropriate user and developer documentation (or not necessary)
+- [ ] The test environment setup works and the intended behavior is reproducible in the test
+  environment
+- [ ] In-code documentation and comments are up-to-date.
+- [ ] Check: Are there specifications? Are they satisfied?
+
+For further good practices have a look at [our review guidelines](https://gitlab.com/caosdb/caosdb/-/blob/dev/REVIEW_GUIDELINES.md).
+
+
+/assign me
+/target_branch dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3567f09ce83e8e25452e6a71e1af54be2735a2ae..2c1f5481af947c60e4f3192a7935183537ff3a05 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,59 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [0.10.0] - 2023-06-02 ##
+(Florian Spreckelsen)
+
+### Changed ###
+
+* The default behavior of the query `FIND SomeName [...]` (as well as COUNT and SELECT) is being
+  made configurable and changes:
+  * `FIND SomeName` will be interpreted as `FIND <FIND_QUERY_DEFAULT_ROLE>
+    SomeName` from now on where `FIND_QUERY_DEFAULT_ROLE` is a newly introduced
+    server property.
+  * The new `FIND_QUERY_DEFAULT_ROLE` server property defaults to `RECORD`
+    which is why the behavior of the server api has a **breaking change**.
+  * The semantics of `FIND *` are affected as well. `FIND *` is equivalent to
+    `FIND <FIND_QUERY_DEFAULT_ROLE>`.
+  * Of course, administrators can choose to retain the old behavior by setting
+    `FIND_QUERY_DEFAULT_ROLE=ENTITY`.
+* CQL now treats `WITH` and `WITH A` equivalently. Issue: [#192](https://gitlab.com/caosdb/caosdb-server/-/issues/192)
+* The InsertFilesInDir FlagJob now creates File entities without a name.  The previous behavior
+  caused severe performance problems for very large numbers of files. Issue: [#197](https://gitlab.com/caosdb/caosdb-server/-/issues/197)
+
+### Fixed ###
+
+* Unexpected Server Error when inserting an Entity.
+  [#216](https://gitlab.com/caosdb/caosdb-server/-/issues/216)
+* Bad performance due to the execution of unnecessary jobs during retrieval.
+  [#189](https://gitlab.com/caosdb/caosdb-server/-/issues/189)
+* Query Language: Parentheses change filter to subproperty filter
+  [#203](https://gitlab.com/caosdb/caosdb-server/-/issues/203)
+* Searching for values in scientific notation
+  [#143](https://gitlab.com/caosdb/caosdb-server/-/issues/143)
+* Denying a role permission has no effect
+  [#196](https://gitlab.com/caosdb/caosdb-server/-/issues/196). See security
+  notes below.
+* Missing RecordType leads to unexpected server error
+  [#166](https://gitlab.com/caosdb/caosdb-server/-/issues/166)
+
+### Security ###
+
+* Fixed [#196](https://gitlab.com/caosdb/caosdb-server/-/issues/196). This was
+  an error in the authorization procedure which allowed unprivileged users
+  execute insert, update or delete transactions on entities. However, the
+  unprivileged users would also need the correct entity permissions to do that.
+
+  Without backup, this means possible data loss. Also there was the possibility
+  to spam the database by creating unwanted entities.
+
+### Documentation ###
+
+- Nested queries.
+- Global entity permissions.
+- DOC: Data model tutorial.
+- Removed old documentation directory `/doc/`, migrated non-duplicate content to `/src/doc/`.
+
 ## [0.9.0] - 2023-01-19
 
 ### Added
diff --git a/CITATION.cff b/CITATION.cff
new file mode 100644
index 0000000000000000000000000000000000000000..a45e422c288822d0c34e1f5df2bcb83ceedd8e23
--- /dev/null
+++ b/CITATION.cff
@@ -0,0 +1,28 @@
+cff-version: 1.2.0
+message: "If you use this software, please cite it as below."
+authors:
+  - family-names: Fitschen
+    given-names: Timm
+    orcid: https://orcid.org/0000-0002-4022-432X
+  - family-names: Schlemmer
+    given-names: Alexander
+    orcid: https://orcid.org/0000-0003-4124-9649
+  - family-names: Hornung
+    given-names: Daniel
+    orcid: https://orcid.org/0000-0002-7846-6375
+  - family-names: tom Wörden
+    given-names: Henrik
+    orcid: https://orcid.org/0000-0002-5549-578X
+  - family-names: Spreckelsen
+    given-names: Florian
+    orcid: https://orcid.org/0000-0002-6856-2910
+  - family-names: Parlitz
+    given-names: Ulrich
+    orcid: https://orcid.org/0000-0003-3058-1435
+  - family-names: Luther
+    given-names: Stefan
+    orcid: https://orcid.org/0000-0001-7214-8125
+title: "CaosDB - Server"
+version: 0.10.0
+doi: 10.3390/data4020083
+date-released: 2023-06-02
diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md
index d772f4b392b782e7bcb9a82f77898402218660c1..fbcb186e45ff5bff20ca7ff20fa321f547048527 100644
--- a/DEPENDENCIES.md
+++ b/DEPENDENCIES.md
@@ -7,6 +7,7 @@
 * `>=Java 11`
 * `>=Apache Maven 3.6.0`
 * `>=Make 4.2`
+* `>=gcc 8` (if PAM authentication is required)
 * `libpam` (if PAM authentication is required)
 * More dependencies are being pulled and installed automatically by Maven. See the complete list of dependencies in the [pom.xml](pom.xml)
 
diff --git a/README_SETUP.md b/README_SETUP.md
index ce6f03d7c287f3842eac6af2d017eed5a7d8bcb5..acb3a79ad256fbba6a0d0a69887bb7c7ba7b28b9 100644
--- a/README_SETUP.md
+++ b/README_SETUP.md
@@ -15,12 +15,18 @@ See [DEPENDENCIES.md](DEPENDENCIES.md).
 
 On Debian, the required packages can be installed with:
 
-    apt-get install git make mariadb-server maven openjdk-11-jdk-headless \
-      python3-pip screen libpam0g-dev unzip
+    apt-get install make mariadb-server maven openjdk-11-jdk-headless \
+      python3-pip libpam0g-dev unzip
 
 Note that installing MariaDB will uninstall existing MySQL packages and vice
 versa.
 
+#### Install the requirements on Fedora
+
+On Fedora, the required packages can be installed with:
+
+    sudo dnf install make pam-devel mariadb-server mariadb python3 java-17-openjdk-headless unzip gcc
+
 ### System
 
 * `>=Linux 4.0.0`, `x86_64`, e.g. Ubuntu 18.04
@@ -160,20 +166,47 @@ sources (if you called `make run` previously).
 
 ## Setup Eclipse
 
-1. Open Eclipse (recommended version: Oxygen.1a Release (4.7.1a))
-2. `File > New > Java Project`: Choose a project name and specify the location
-   of this repo. The JRE and Project layout should be configured automatically.
-   Now, the project should initially have two source-folders: `./src/main/java`
-   and `./src/test/java`. After a build, another one,
-   `./target/generated-sources/antlr4` should be generated. If there are more
-   than these three source-folders, reconfigure the projects source folders
-   appropriately with `Project > Properties > Java Build Path > Source`.
-3. In the `Package Explorer` view, right-click on the project and `Configure >
-   Convert to Maven Project`.
-4. In the `Package Explorer` view, right-click on the project and `Maven >
-   Update Project`.
-5. Usually a build of the project is started automatically. Otherwise `Project >
-   Build Project`.
+1. Open Eclipse (tested with 2022-R12)
+2. File > Import > Maven > Existing Maven Projects: Specify location.
+3. You will most likely encounter "Plugin execution not covered by lifecycle
+   configuration: ..." errors. Adapt the file
+   `<eclipse-workspace>/.metadata/.plugins/org.eclipse.m2e.core/lifecycle-mapping-metadata.xml`.
+
+   Example:
+
+   ```xml 
+   <?xml version="1.0" encoding="UTF-8"?>
+   <lifecycleMappingMetadata>
+     <pluginExecutions>
+       <pluginExecution>
+         <pluginExecutionFilter>
+           <groupId>com.coveo</groupId>
+           <artifactId>fmt-maven-plugin</artifactId>
+           <versionRange>2.5.1</versionRange>
+           <goals>
+             <goal>format</goal>
+           </goals>
+         </pluginExecutionFilter>
+         <action>
+           <ignore />
+         </action>
+       </pluginExecution>
+       <pluginExecution>
+         <pluginExecutionFilter>
+           <groupId>org.codehaus.mojo</groupId>
+           <artifactId>buildnumber-maven-plugin</artifactId>
+           <versionRange>1.4</versionRange>
+           <goals>
+             <goal>create-metadata</goal>
+           </goals>
+         </pluginExecutionFilter>
+         <action>
+           <ignore />
+         </action>
+       </pluginExecution>
+     </pluginExecutions>
+   </lifecycleMappingMetadata>
+   ```
 
 Done!
 
diff --git a/RELEASE_GUIDELINES.md b/RELEASE_GUIDELINES.md
index 58484d51565a87d98929a37e842c7040fc08cabf..1b5ae48906d4e8328064ecaf7e7c4f7a4a2bd20f 100644
--- a/RELEASE_GUIDELINES.md
+++ b/RELEASE_GUIDELINES.md
@@ -22,6 +22,7 @@ guidelines of the CaosDB Project
   * [pom.xml](./pom.xml) (probably this means to remove the `-SNAPSHOT`)
   * `src/doc/conf.py`
   * `CHANGELOG.md`
+  * `CITATION.cff` (update version and date)
 
 5. Merge the release branch into the main branch.
 
diff --git a/caosdb-webui b/caosdb-webui
index 421b2dce5199a5a2c96bcc638543c1fd51d48870..e6fef9f35da49dfea5b11f99b872d15c35fd043d 160000
--- a/caosdb-webui
+++ b/caosdb-webui
@@ -1 +1 @@
-Subproject commit 421b2dce5199a5a2c96bcc638543c1fd51d48870
+Subproject commit e6fef9f35da49dfea5b11f99b872d15c35fd043d
diff --git a/conf/core/server.conf b/conf/core/server.conf
index 57744250a7ef88285b343aa5c037de9cbbf97097..c030d6eb63d61ad2d9adc6a174877b1006396537 100644
--- a/conf/core/server.conf
+++ b/conf/core/server.conf
@@ -67,7 +67,7 @@ MYSQL_DATABASE_NAME=caosdb
 # User name for connecting to mysql
 MYSQL_USER_NAME=caosdb
 # Password for the user
-MYSQL_USER_PASSWORD=caosdb
+MYSQL_USER_PASSWORD=random1234
 # Schema of mysql procedures and tables which is required by this CaosDB instance
 MYSQL_SCHEMA_VERSION=v5.0
 
@@ -211,6 +211,15 @@ USER_NAME_INVALID_MESSAGE=User names must have a length from 1 to 32 characters.
 PASSWORD_VALID_REGEX=^((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\p{Punct}]).{8,128})$
 PASSWORD_INVALID_MESSAGE=Passwords must have a length from 8 to 128 characters. THe must contain at least one [A-Z], one [a-z], one [0-9] and a special character e.g. [!§$%&/()=?.;,:#+*+~].
 
+# --------------------------------------------------
+# Query Settings
+# --------------------------------------------------
+
+# FIND blablabla is short for FIND $FIND_QUERY_DEFAULT_ROLE blablabla. Should be
+# either ENTITY or RECORD. RECORDTYPE, FILE, and PROPERTY will work as well but
+# are rather unexpected for human users.
+FIND_QUERY_DEFAULT_ROLE=RECORD
+
 # --------------------------------------------------
 # Extensions
 # --------------------------------------------------
@@ -220,4 +229,4 @@ ENTITY_VERSIONING_ENABLED=true
 
 
 # Enabling the state machine extension
-# EXT_STATE_ENTITY=ENABLE
+# EXT_STATE_ENTITY=ENABLE
\ No newline at end of file
diff --git a/doc/Authentication.md b/doc/Authentication.md
deleted file mode 100644
index a7e424b4c321156a009d8a7d9631f32dd296ce1a..0000000000000000000000000000000000000000
--- a/doc/Authentication.md
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-Author: Timm Fitschen
-
-Email: timm.fitschen@ds.mpg.de
-
-Date: Older than 2016
-
- Some features of CaosDB are available to registered users only. Making any changes to the data stock via HTTP requires authentication by `username` _plus_ `password`. They are to be send as a HTTP header, while the password is to be hashed by the sha512 algorithm:
-
-| `username:` | `$username` | 
-|-------------|-------------|-
-| `password:` | `$SHA512ed_password` |
-
-
-# Sessions
-
-## Login
-
-### Request Challenge
-
- * `GET http://host:port/login?username=$username`
- * `GET http://host:port/login` with `username` header
-
-*no password required to be sent over http*
-
-The request returns an AuthToken with a login challenge as a cookie. The AuthToken is a dictionary of the following form:
-
-
-        {scope=$scope;
-        mode=LOGIN;
-        offerer=$offerer;
-        auth=$auth
-        expires=$expires;
-        date=$date;
-        hash=$hash;
-        session=$session;
-        }
-
- $scope:: A uri pattern string. Example: ` {**/*} `
- $mode:: `ONETIME`, `SESSION`, or `LOGIN`
- $offerer:: A valid username
- $auth:: A valid username
- $expires:: A `YYYY-MM-DD HH:mm:ss[.nnnn]` date string
- $date:: A `YYYY-MM-DD HH:mm:ss[.nnnn]` date string
- $hash:: A string
- $session:: A string
-
-The challenge is solved by concatenating the `$hash` string and the user's `$password` string and calculating the sha512 hash of both. Pseudo code:
-
-
-        $solution = sha512($hash + sha512($password))
-
-### Send Solution
-
-The old $hash string in the cookie has to be replaces by $solution and the cookie is to be send with the next request:
-
-`PUT http://host:port/login`
-
-The server will return the user's entity in the HTTP body, e.g.
-
-
-        <Response ...>
-          <User name="$username" ...>
-            ...
-          </User>
-        </Response>
-
-and a new AuthToken with `$mode=SESSION` and a new expiration date and so on. This AuthToken cookie is to be send with every request.
-
-### Logout
-
-Send 
-
-`PUT http://host:port/logout`
-
-with a valid AuthToken cookie. No new AuthToken will be returned and no AuthToken with that `$session` will be accepted anymore.
-
-
-
-
diff --git a/doc/Datatype.md b/doc/Datatype.md
deleted file mode 100644
index 246f52e103eeb57e1bee355788260508a3df8619..0000000000000000000000000000000000000000
--- a/doc/Datatype.md
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-# TEXT
-* Description: TEXT stores stores any text values.
-* Range: Any [utf-8](https://en.wikipedia.org/wiki/UTF-8) encodable sequence of characters with maximal 65,535 bytes. (Simply put: In most cases, any text with less than 65,535 letters and spaces will work. But if you use special characters like `à`, `€` or non-latin letters then the number of bytes, which are needed to store it, increases. Then the effective maximal length is smaller than 65,535. A bad case scenario would be a text in Chinese. Chinese characters need about three times the space of letters from the latin alphabet. Therefore, only 21845 Chinese characters can be stored within this datatype. Which is still quite a lot I guess :D)
-* Examples: 
-  * `Am Faßberg 17, D-37077 Göttingen, Germany`
-  * `Experiment went well until the problem with the voltmeter occured. Don't use the results after that.`
-  * `someone@email.org`
-  * `Abstract: bla bla bla ...`
-  * `Head of Group`
-  * `http://www.bmp.ds.mpg.de`
-  * 
-
-        A. Schlemmer, S. Berg, TK Shajahan, S. Luther, U. Parlitz,
-           Quantifying Spatiotemporal Complexity of Cardiac Dynamics using Ordinal Patterns,
-           37th Annual International Conference of the IEEE Engineering in Medicine and Biology Society (EMBC), 2015, doi: 10.1109/EMBC.2015.7319283
-
-----
-
-# BOOLEAN
-* Description: BOOLEAN stores boolean `TRUE` or `FALSE`. It is therefore suitable for any variable that represents that something is the case or not.
-* Accepted Values: `TRUE` or `FALSE`, case insensitive (i.e. it doesn't matter if you use capitals or small letters).
-* Note: You could also use a TEXT datatype to represent booleans (or even INTEGER or DOUBLE). But it makes a lot of sense to use this special datatype as it ensures that only the two possible values, `TRUE` or `FALSE` are inserted into the database. Every other input would be rejected. This helps to keep the database understandable and to avoid mistakes.
-
-----
-
-# INTEGER
-* Description: INTEGER stores integer numbers. If you need floating point variables, take a look at DOUBLE.
-* Range: `-2147483648` to `2147483647`, `-0` is interpreted and stored as `0`.
-* Note: This rather limited range is just provisional. It can be extended with low effort as soon as requested.
-
-----
-
-# DOUBLE
-* Description: DOUBLE stores floating point numbers with a double precision as defined by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).
-* Range: 
-  * From `2.2250738585072014E-308` to `1.7976931348623157E308` (negative and positive) with a precision of 15 decimals. 
-  * Any other decimal number _might work_ but it is not guaranteed.
-  * `-0`, `0`, `NaN`, `-inf` and `inf`
-* Note: The server generates a warning when the precision of the submitted DOUBLE value is to high to be preserved.
-
-----
-
-# DATETIME
-The DateTime data type exists in (currently) three flavors which are dynamically chosen during parsing on the the serverside. The flavors have different ranges, support of time zones and intended use cases. Only the first two flavors are actually implemented for storage and queries. The third one is implemented for queries exclusively.
-
-## UTCDateTime
-* Description: This DATETIME flavor stores values which represent a single point of time according to [UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time) with the format specified by [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) (Combined date and time). It does support [UTC Leap Seconds](https://en.wikipedia.org/wiki/Leap_second) and time zones.
-* Range: From `-9999-01-01T00:00:00.0UTC` to `9999-12-31T23:59:59.999999999UTC` with nanosecond precision.
-* Examples:
-  * `2016-01-01T13:23:00.0CEST` which means _January 1, 2016,  1:23 PM, Central European Summer Time_.
-  * `-800-01-01T13:23:00.0` which means _January 1, 800 BC,  1:23 PM, UTC_.
-* Note:
-  * It is allowed to ommit the nanosecond part of a UTCDateTime (`2016-01-01T13:23:00CEST`). This indicates a precision of seconds for a UTCDateTime value.
-
-## Date
- Description:: This DATETIME flavor stores values which represent a single date, month or year according to the [gregorian calendar](https://en.wikipedia.org/wiki/Gregorian_Calendar). A month/year is conceived as a single date with the presion of a month/year. This concept is useful if you try to understand the query semantics which are explained [elsewhere](./QueryLanguage#POVDateTime).
- Format:: `Y[YYY][-MM[-dd]]` (where square brackets mean that the expression is optional).
- Range:: Any valid date according to the gregorian calendar from `-9999-01-01` to `9999-12-31` (and respective dates with lower precision. E.g. the year `-9999`). There is no year `0`.
-* Note: Date is a specialization of [#SemiCompleteDateTime]. 
-
-## SemiCompleteDateTime
-* Description: A generalization of the _Date_ and _UTCDateTime_ flavors. In general, there is no time zone support. Although this flavor is not yet storable in general, it is implemented for search queries yet. I.e. you might search for `FIND ... date>2015-04-03T20:15` yet.
-* Format: `Y[YYY]['-MM[-dd[Thh:[mm[:ss[.ns]]]]]]]`. 
-* Special Properties: For every SemiCompleteDateTime _d_ there exists a _Inclusive Lower Bound_ (`d.ILB`) and a _Exclusive Upper Bound_ (`d.EUB`). That means, a SemiCompleteDateTime can be interpreted as an interval of time. E.g. `2015-01` is the half-open interval `[2015-01-01T00:00:00.0, 2016-01-01T00:00:00.0)`. ILB and EUB are UTCDateTimes respectively. These properties are important for the semantics of the the query language, especialy the [operators](./QueryLanguage#POVDateTime). 
-
-## Future Flavors
-Please file a new feature request as soon as you need them.
-* Time:: For a time of the day (without the date). Supports time zones.
-* FragmentaryDateTime:: For any fragmentary DateTime. That is an arbitrary combination of year, month, day of week, day of month, day of year, hour of day, minute, seconds (and nanoseconds). This flavor is useful for recurrent events like a bus schedule (_Saturday, 7:30_) or the time of a standing order for money transfer (_third day of the month_).
-
-----
-
-# REFERENCE
-* Description: REFERENCE values store the [Valid ID](./Glossary#valid-id) of an existing entity. The are useful to establish links between two entities. 
-* Accepted Values: Any [Valid ID](./Glossary#valid-id) or [Valid Unique Existing Name](./Glossary#valid-unique-existing-name) or [Valid Unique Temporary ID](./Glossary#valid-unique-temporary-id) or [Valid Unique Prospective Name](./Glossary#valid-unique-prospective-pame).
-* Note:
-  * After beeing processed successfully by the server the REFERENCE value is normalized to a [Valid ID](./Glossary#valid-id). I.e. it is guaranteed that a REFERENCE value of a valid property is a positive integer.
-
-## FILE
-* Description: A FILE is a special REFERENCE. It only allows entity IDS which belong to a File.
-
-## RecordType as a data type
-* Furthermore, any RecordType can be used as a data type. This is a variant of the REFERENCE data type where any entity is a valid value which is a child of the RecordType in question.
-* Example:
-  * Let `Person` be a RecordType, `Bertrand Russel` be a child of `Person`. Then `Bertrand Russel` is a valid value for a property with a `Person` data type.
-
-# LIST
-* Description: A LIST is always a list of something which has another data type. E.g. A LIST of TEXT values, a LIST of REFERENCES value, etc. Here we call TEXT resp. REFERENCE the **Element Data Type**. The LIST data type allows you to store an arbitrary empty or non-empty ordered set (with duplicates) of values of the *same* data type into one property. Each value must be a valid value of the Element Data Type.
-* Example:
-  * LIST of INTEGER: ```[0, 2, 4, 5, 8, 2, 3, 6, 7]```
-  * LIST of Person, while `Person` is a RecordType: ```['Bertrand Russel', 'Mahatma Ghandi', 'Mother Therese']```
-
-
diff --git a/doc/Entity.md b/doc/Entity.md
deleted file mode 100644
index c2ff4acc733638f964f6d6343ef4dfd4db05ebc1..0000000000000000000000000000000000000000
--- a/doc/Entity.md
+++ /dev/null
@@ -1,190 +0,0 @@
-Version: 0.1.0r1
-
-Author: Timm Fitschen
-
-Email: timm.fitschen@ds.mpg.de
-
-Date: 2017-12-17
-
-# Introduction
-
-CaosDB is a database management system that stores it's data into `Entities`. An `Entity` can be thought of as the equivalent to tables, rows, columns and the tuples that fill the tables of a traditional RDBMS. Entities are not only used to store the data they also define the structure of the data.
-
-# Formal Definition
-
-An `Entity` may have 
-
-* a `domain`
-* an `id`
-* a `role`
-* a `name`
-* a `data type`
-* a `Set of Values`
-* a `Set of Properties`
-* a `Set of Parents`
-
-A `domain` contains an `Entity`.
-
-An `id` is an arbitrary string. 
-
-A `role` is an arbitrary string. Especially, it may be one of the following strings:
-
-* `RecordType`
-* `Record`
-* `Relation`
-* `Property`
-* `File`
-* `QueryTemplate`
-* `Domain`
-* `Unit`
-* `Rule`
-* `DataType`
-* `Remote`
-
-A `name` is an arbitrary string.
-
-A `data type` contains an `Entity`. Note: this is not necessarily a `Data Type`.
-
-## Set of Values
-
-A `Set of Values` is a mapping from a `indices` to a finite set of `Values`.
-
-An `index` is an interval of non-negative integers starting with zero.
-
-### Value
-
-A `Value` may have a `data type` and/or a `unit`.
-
-A `data type` is an `Entity`. Note: this is not necessarily a `Data Type`.
-
-A `unit` is an arbitrary string.
-
-## Data Type
-
-A `Data Type` is an `Entity` with role `DataType`.
-
-### Reference Data Type
-
-A `Reference Data Type` is a `Data Type`. It may have a `scope`. 
-
-A `scope` contains an `Entity`.
-
-### Collection Data Type
-
-A `Collection Data Type` is a `Data Type`. It may have an ordered set of `elements`.
-
-## Record Type
-
-A `Record Type` is an `Entity` with role `RecordType`.
-
-## Record
-
-A `Record` is an `Entity` with role `Record`.
-
-## Relation
-
-A `Relation` is an `Entity` with role `Relation`.
-
-## Property
-
-A `Property` is an `Entity` with role `Property`. It is also refered to as `Abstract Property`.
-
-## File
-
-A `File` is an `Entity` with role `File`.
-
-A `File` may have 
-
-* a `path`
-* a `size`
-* a `checksum`
-
-A `path` is an arbitrary string.
-
-A `size` is a non-negative integer.
-
-A `checksum` is an ordered pair (`method`,`result`).
-
-A `method` is an arbitrary string. 
-
-A `result` is an arbitrary string.
-
-## QueryTemplate
-
-A `QueryTemplate` is an `Entity` with role `QueryTemplate`.
-
-## Domain
-
-A `Domain` is an `Entity` with role `Domain`.
-
-## Unit
-
-A `Unit` is an `Entity` with role `Unit`.
-
-## Rule
-
-A `Rule` is an `Entity` with role `Rule`.
-
-## Remote
-
-A `Remote` is an `Entity` with role `Remote`.
-
-## Set of Parents
-
-A `Set of Parents` is a set of `Parents`.
-
-### Parent
-
-A `Parent` may contain another `Entity`. 
-
-A `Parent` may have an `affiliation`.
-
-An `affiliation` may contain of the following strings:
-
-* `subtyping`
-* `instantiation`
-* `membership`
-* `parthood`
-* `realization`
-
-## Set of Properties
-
-A `Set of Properties` is a tripple (`index`, set of `Implemented Properties`, `Phrases`).
-
-An `index` is a bijective mapping from an interval of non-negative integer numbers starting with zero to the set of `Implemented Properties`.
-
-### Implemented Property
-
-An `Implemented Property` contains another `Entity`.
-
-An `Implemented Property` may have an `importance`.
-
-An `Implemented Property` may have a `maximum cardinality`.
-
-An `Implemented Property` may have a `minimum cardinality`.
-
-An `Implemented Property` may have an `import`.
-
-An `importance` is an arbitrary string. It may contain of the following strings:
-
-* `obligatory`
-* `recommended`
-* `suggested`
-* `fix`
-
-A `maximum cardinality` is a non-negative integer.
-
-A `minimum cardinality` is a non-negative integer.
-
-An `import` is an arbitrary string. It may contain of the following strings:
-
-* `fix`
-* `none`
-
-### Phrases
-
-`Phrases` are a mapping from the cartesian product of the `index` with itself to a `predicate`.
-
-A `predicate` is an arbitrary string.
-
-
diff --git a/doc/FileServer.md b/doc/FileServer.md
deleted file mode 100644
index 64be8ef910d76ba6c1a304ddbdd64e4e25d31d56..0000000000000000000000000000000000000000
--- a/doc/FileServer.md
+++ /dev/null
@@ -1,132 +0,0 @@
-
-Author: Timm Fitschen
-
-Email: timm.fitschen@ds.mpg.de
-
-Date: 2014-06-17
-
-
-# Info
-There are several ways to utilize the file server component of CaosDB. It is possible to upload a file or a whole folder including subfolders via HTTP and the _drop off box_. It is possible to download a file via HTTP identified by its ID or by its path in the internal file system. Furthermore, it is possible to get the files metadata via HTTP as an xml. 
-
-# File upload
-## Drop off box
-
-The drop off box is a directory on the CaosDB server's local file system, specified in the `server.conf` file in the server's basepath (something like `~/CaosDB/server/server.conf`). The key in the `server.conf` is called `dropoffbox`. Since the drop off box directory is writable for all, users can push their files or complete folders via a `mv` or a `cp` (recommended!) in that folder. The server deletes files older than their maximum lifetime (24 hours by default, specified `in server.conf`). But within their lifetime a user can prompt the server to pick up the file (or folder) from the drop off box in order to transfer it to the internal file system. 
-
-Now, the user may send a pick up request to `POST http://host:port/FilesDropOff` with a similar body:
-
-        <Post>
-          <File pickup="$path_dropoffbox" destination="$path_filesystem" description="$description" generator="$generator"/>
-          ...
-        </Post>
-
-whereby 
-* $path_dropoffbox is the actual relative path of the dropped file or folder in the DropOffBox,
-* $path_filesystem is the designated relative path of that object in the internal file system,
-* $description is a description of the file to be uploaded,
-* $generator is the tool or client used for pushing this file.
-  
-After a successful pick up the server will return:
-
-        <Response>
-          <File description="$description" path="$path" id="$id" checksum="$checksum" size="$size" />
-          ...
-        </Response>
-
-whereby 
-* $id is the new generated id of that file and 
-* $path is the path of the submitted file or folder relative to the file system's root.
-
-## HTTP upload stream
-### Files
-
-File upload via HTTP is implemented in a [rfc1867](http://www.ietf.org/rfc/rfc1867.txt) consistent way. This is a de-facto standard that defines a file upload as a part of an HTML form submission. This concept shall not be amplified here. But it has to be noticed that this protocol is not designed for uploads of complete structured folders. Therefore the CaosDB file components have to impose that structure on the upload protocol. 
-
-CaosDB's file upload resource does exclusively accept POST requests of MIME media type `multipart/form-data`. The first part of each POST body is expected to be a form-data text field, containing information about the files to be uploaded. It has to meet the following requirements:
-* `Content-type: text/plain; charset=UTF-8`
-* `Content-disposition: form-data; name="FileRepresentation"`
-
-If the content type of the first part is not `text/plain; charset=UTF-8` the server will return error 418. If the body is not actually encoded in UTF-8 the servers behaviour is not defined. If the field name of the first part is not `FileRepresentation` the server will return error 419.
-
-The body of that first part is to be an xml document of the following form: 
-
-
-        <Post>
-          <File upload="$temporary_identifier" destination="$path_filesystem" description="$description" checksum="$checksum" size="$size"/>
-          ...
-        </Post>
-
-whereby 
-* $temporary_identifier is simply a arbitrary name, which will be used to identify this `<File>` tag with a uploaded file in the other form-data parts.
-* $path_filesystem is the designated relative path of that object in the internal file system,
-* $description is a description of the file to be uploaded,
-* $size is the files size in bytes,
-* $checksum is a SHA-512 Hash of the file.
-
-The other parts (which must be at least one) may have any appropriate media type. `application/octet-stream` is a good choice for it is the default for any upload file according to [rfc1867](http://www.ietf.org/rfc/rfc1867.txt). Their field name may be any name meeting the requirements of [rfc1867](http://www.ietf.org/rfc/rfc1867.txt) (most notably they must be unique within this POST). But in order to identify the corresponding xml file representation of each file the `filename` parameter of the content-disposition header has to be set to the proper $temporary_identifier. The Content-disposition type must be `form-data`:
-* `Content-disposition: form-data; name="$any_name"; filename="$temporary_identifier"`
-
-Finally the body of these parts have to contain the file encoded in the proper `Content-Transfer-Encoding`.
-
-
-If a file part has a `filename` parameter which doesn't occur in the xml file representation the server will return error 420. The file will not be stored anywhere. If an xml file representation has no corresponding file to be uploaded (i.e. there is no part with the same `filename`) the server will return error 421. Some other error might occur if the checksum, the size, the destination etc. are somehow corrupted. 
-
-### Folders
-
-Uploading folders works in a similar way. The first part of the `multipart/form-data` document is to be the representation of the folders:
-
-
-        <Post>
-          <File upload="$temporary_identifier" destination="$path_filesystem" description="$description" checksum="$checksum" size="$size"/>
-          ...
-        </Post>
-
-The root folder is represented by a part which has a header of the form:
-* `Content-disposition: form-data; name="$any_name"; filename="$temporary_identifier/"`
-The slash at the end of the `filename` indicates that this is a folder, not a file. Consequently, the body of this part will be ignored and should be empty.
-Any file with the name `$filename` in the root folder is represented by a part which has a header of the form:
-* `Content-disposition: form-data; name="$any_name"; filename="$temporary_identifier/$filename"`
-Any sub folder with the name `$subfolder` is represented by a part which has a header of the form: 
-* `Content-disposition: form-data; name="$any_name"; filename="$temporary_identifier/$subfolder/"`
-
-Likewise, a complete directory tree can be transfered by appending the structure to the `filename` header field.
-
-**Example**:
-Given the structure
-
-        rootfolder/
-        rootfolder/file1
-        rootfolder/subfolder/
-        rootfolder/subfolder/file2
-
-an upload document would have the following form:
-
-        ... (HTTP Header)
-        Content-type: multipart/form-data, boundary=AaB03x
-        
-        --AaB03x
-        content-disposition: form-data; name="FileRepresentation"
-        
-        <Post>
-          <File upload="tmp1234" destination="$path_filesystem" description="$description" checksum="$checksum" size="$size"/>
-        </Post>
-        
-        --AaB03x
-        content-disposition: form-data; name="random_name1"; filename="temp1234/"
-        
-        --AaB03x
-        content-disposition: form-data; name="random_name1"; filename="temp1234/file1"
-        
-        Hello, world! This is file1.
-        
-        --AaB03x
-        content-disposition: form-data; name="random_name1"; filename="temp1234/subfolder/"
-        
-        --AaB03x
-        content-disposition: form-data; name="random_name1"; filename="temp1234/subfolder/file2"
-        
-        Hello, world! This is file2.
-        
-        --AaB03x--
-
diff --git a/doc/Message.md b/doc/Message.md
deleted file mode 100644
index 5c5198d80974a6114d32c37224b22ff8ffb47b47..0000000000000000000000000000000000000000
--- a/doc/Message.md
+++ /dev/null
@@ -1,166 +0,0 @@
-# Introduction
-
-API Version 0.1.0
-
-A Message is a way of communication between the server and a client. The main purpose is to inform the clients about errors which occured during transactions, issue warnings when entities have a certain state or just explicitly confirm that a transaction was successful. Messages represents information that is not persistent or just the reproducible outcome of a transaction. Messages are not stored aside from logging.
-
-# Message Classes And Their Properties
-
-## Message (generic super class)
-
-A `Message` must be either a `Server Message` or a `Client Message`. 
-
-A `Message` must have a `description`. A `description` is a string and a human-readable explanation of the meaning and/or purpose of the message. The description must not have leading or trailing whitespaces. The description should be kept in English. For the time being there is no mechanism to indicate that the description is written in other languages. This could be changed in later versions of this API. 
-
-## Server Message
-
-A `Server Message` is a Message issued by the server. It must not be issued by clients. 
-
-A `Server Message` may be either a `Standard Server Message` or a `Non-Standard Server Message`
-
-### Standard Server Message
-
-A `Standard Server Message` is one of a set of predefined messages with a certain meaning. The set of these `Standard Server Messages` is maintained and documented in the Java code of the server. There should be a server resource for these definitions in order to have a always up-to-date documentation of the messages on every server.
-
-A `Standard Server Message` must have an `id`. An `id` is a non-empty string that uniquely identifies a standard server message. An id should consist only of ASCII compliant upper-case Latin alphabetic letters from `A` to `Z` and the underscore character `_`.
-An `id` of a `Standard Server Message` must not start with the string `NSSM_`.
-
-A `Standard Server Message` must have a `type`. A `type` is one these strings: `Info`, `Warning`, `Error`, or `Success`.
-
-#### Error Message
-
-A `Server Message` with type `Error` is also called `Error Message` and sometimes just `Error`. An `Error Message` indicates that a request has *failed*. It informs about the reasons for that failure or the nature of the problems which occurred. The description of each error message should explain the error and indicate if and how the client can remedy the problems with her request.
-
-#### Warning Message
-
-A `Server Message` with type `Error` is also called `Warning Message` and sometime just `Warning`. A `Warning Message` indicates that certain *irregularities* occurred during the processing of the request or that the client requested something that is *not recommended but not strictly forbidden*.
-
-#### Info Message
-
-A `Server Message` with type `Info` is also called `Info Message` and sometimes just `Info`. An `Info Message` is a means to inform the client about *arbitrary events* which occurred during the processing of the request and which are *not* to be considered *erroneous* or *non-recommended*. These info messages are primarily intended to make the processing of the request more understandable for the client. Info messages are not meant to be used for debugging.
-
-#### Success Message
-
-A `Server Message` with type `Success` is also called a `Success Message`. A `Success Message` indicates the successful *state change* due to portions of a request or the whole request. A success message must not be issued if the request fails.
-
-### Non-Standard Server Message
-
-A `Non-Standard Server Message` may be issued by any non-standard server plugin or extension. It is a placeholder for extensions to the Message API. 
-
-A `Non-Standard Server Message` may have an `id`. An `id` is a non-empty string. It should consist only of ASCII compliant upper-case Latin alphabetic letters from `A` to `Z` and the underscore character `_`. However, the id should not be equal to any id from the set of predefined standard server messages. Furthermore, the id of a non-standard server message should start with the string `NSSM_`.
-
-A `Non-Standard Server Message` may have a `type`. A `type` is a non-empty string. It should consist only of ASCII compliant upper-case or lower-case Latin alphabetic letters from `a` to `z`, from `A` to `Z`, and the underscore character `_`. If the type is equal to one of the above-mentioned types, it must have the same meaning and the same effects on the request as the respective type from above. Especially, a message with type `Error` must not be issued unless the request actually fails. Likewise a `Success` must not be issued unless the request actually caused a *state change* of the server.
-
-## Client Message
-
-A `Client Message` may have an `ignore` flag. The `ignore` flag can have one of these values: `no`, `yes`, `warn`, `silent`
-
-A `Client Message` is a message issued by a client. It should not be issued by the server. A `Client Message` may be completely ignored by clients. A client message must not be ignored by the server. A `Client Message` which cannot be understood by the server must result in an error, unless the `ignore` flag states otherwise. 
-
-### Ignore Flag
-
-If the `ignore` flag is set to `no` the server must not ignore the client message. If the server cannot understand the client message an error must be issued. This will cause the transaction to fail.
-
-If the `ignore` flag is set to `yes` the server must ignore the client message.
-
-If the `ignore` flag is set to `warn` the server should not ignore the message. If the server cannot understand the client message, a warning must be issued. The transaction will not fail due to this warning.
-
-## Message Parameters
-
-A `Message` may have zero or more parameters. A `Message Parameter` is a a triple of a `key`, a `value`. It is intended to facilitate the processing and representation of messages by clients and the server. For example, consider an `Error Message` which states that a certain server state cannot be reached and the reason be that there is an entity with certain features. Then it is useful to refer to the entity via the
-parameters. A client can now resolve the entity and just show it or generate a URI for this entity.
-
-A `key` is a non-empty string which should consist only of ASCII compliant lower-case Latin alphabetic letters from `a` to `z` and the minus character `-`. A `key` must be unique among the keys of the message parameters. 
-
-A `value` is a possibly empty, arbitrary string which must not have leading or trailing white spaces.
-
-A `Message Parameter` may have a `type`. The `type` of a `Message Parameter` is also called a `Message Parameter Type`. A `Message Parameter Type` is a non-empty string which should consist only of ASCII compliant lower-case Latin alphabetic letters from `a` to `z` and the minus character `-`. A message parameter type may be one these string: `entity-id`, `entity-name`, `entity-cuid`, `property-index`, `parent-id`, `parent-name`.
-
-A `Message Parameter` with a type which begins with `entity-` is also called an `Entity Message Parameter`. The value of an `Entity Message Parameter` must refer to an entity—via its id, name, or cuid, respectively.
-
-A `Message Parameter` with a type which begins with `property-` is also called a `Property Message Parameter`. The value of such a parameter must refer to an entity's property. In the case of the `property-index` type the value refers to a property via a zero-based index (among the list of properties of that entity). The list of properties in question must belong to the `Message Bearer` which must in turn be an `Entity`.
-
-A `Message Parameter` with a type which begins with `parent-` is also called a `Parent Message Parameter`. The value of such a parameter must refer to an entity's parent via its id or name, respectively.
-
-## Message Bearer
-
-A `Message` must have a single `Message Bearer`, or, equivalently, a `Message` `belongs to` a single `Message Bearer`. The message is usually considered to carry information about the message bearer if not stated otherwise. The message's subject should be the message bearer itself, so to speak. Although, possibly indicated by a `Message Parameter` the message may be additionally or solely concerned with other things than the message bearer. Please note: The message bearer may also indicate the context of evaluation of the message parameters, e.g. when the type of the message parameter is `property-index`. 
-
-A `Message Bearer` may be an `Entity`, a `Property`, a `Container`, a `Request`, a `Response`, or a `Transaction`.
-
-# Representation and Serialization
-
-Messages can be serialized, deserialized by the means of XML.
-
-## XML Representation
-
-A `Message` is serialized into a single XML Element Node (hereafter the *root element* with zero or more Child Nodes. 
-
-#### Root Element Tag
-
-The root element's tag of a `Server Message` must be equal to its `type` if and only if the type is equal to one of the allowed types of a `Standard Server Message` (even if it is a Non-Standard Server Message). Otherwise the root tag is just 'ServerMessage'.
-
-```xml
-<Error/><!--an Error Message-->
-<Warning/><!--a Warning Message-->
-<Info/><!--an Info Message-->
-<Success/><!--a Success Message-->
-<ServerMessage/> <!--a Non-Standard Server Message with a non-standard type-->
-```
-
-The root element's tag of a `Client Message` must be 'ClientMessage'. E.g.
-```xml
-<ClientMessage/><!--a Client Message-->
-```
-
-#### Root Element Attributes
-
-The root element must have the attributes nodes `id`, and/or `ignore` if and only if the messages have corresponding properties. The root element must have a 'type' attribute only if the message has a type property and if the type is not equal to the root element's tag. The values of the attributes must equal the corresponding properties. E.g.
-
-```xml
-<Error id="ENTITY_DOES_NOT_EXIST" type="Error"/><!--this and the next element are equivalent-->
-<Error id="ENTITY_DOES_NOT_EXIST"/>
-<ServerMessage type="CustomType"/><!--has no id-->
-<ServerMessage id="NSSM_MY_ID"/><!--has no type-->
-```
-
-or
-
-```xml
-<ClientMessage id="CM_MY_ID" ignore="warn"/>
-```
-
-All other Attributes should be ignored.
-
-#### Description Element
-
-The root element must have exactly one Child Element Node with tag 'Description' if and only if the message has a `description` property. The string value of the message's description must be the first Child Text Node of the 'Description' Element. E.g.
-
-```xml
-<ServerMessage>
-  <Description>This is a description.</Description>
-</ServerMessage>
-```
-
-Please note: Any leading or trailing whitespaces of the Text Node must be stripped during the deserialization.
-
-All other Attributes and Child Nodes should be ignored.
-
-#### Parameters Element
-
-The root element must have exactly one Child Element Node with tag 'Parameters' if the message has at least one `parameter`. The 'Parameters' Element in turn must have a single Child Element Node for each parameter which are called `Parameter Elements`. 
-
-A `Parameter Element` must have a tag equal to the `key` of the parameter.
-It must have a `type` attribute equal to the `type` property of the parameter if and only if the parameter has a type. And it must have a first Child Text Node which is equal to the parameter's `value`. E.g.
-
-```xml
-<ClientMessage>
-  <Parameters>
-    <param-one type="entity-name">Experiment</param-one><!--One parameter with key="param-one", value="Experiment", and type="entity-name"-->
-  </Parameters>
-</ClientMessage>
-```
-
-Please note: Any leading or trailing whitespaces of the Text Node must be stripped during the deserialization. 
-
-All other Attributes and Child Nodes below the 'Parameters' Element should be ignored.
diff --git a/doc/Paging.md b/doc/Paging.md
deleted file mode 100644
index 608ebc0489d35e5e60ff9cb0c5c28846d729a1ca..0000000000000000000000000000000000000000
--- a/doc/Paging.md
+++ /dev/null
@@ -1,24 +0,0 @@
-The Paging flag splits the retrieval of a (possibly huge) number entities into pages.
-
-# Syntax
-
-
-          flag   = name, [":", value];
-          name   = "P";
-          value  = [ index ], ["L", length]];
-          index  =  ? any positive integer ?;
-          length =  ? any positive integer ?;
-
-# Semantics
-
-The `index` (starting with zero) denotes the index of the first entity to be retrieved. The `length` is the number of entities on that page. If `length` is omitted, the default number of entities is returned (as configured by a server constant called ...). If only the `name` is given the paging behaves as if the `index` has been zero.
-
-# Examples
-
-`https://caosdb/Entities/all?flags=P:24L50` returns 50 entities starting with the 25th entity which would be retrieved without paging.
-
-`https://caosdb/Entities/all?flags=P:24` returns the default number of entities starting with the 25th entity which would be retrieved without paging.
-
-`https://caosdb/Entities/all?flags=P:L50` returns 50 entities starting with the first entity which would be retrieved without paging.
-
-`https://caosdb/Entities/all?flags=P` returns the default number of entities starting with the first entity which would be retrieved without paging.
\ No newline at end of file
diff --git a/doc/Query.md b/doc/Query.md
deleted file mode 100644
index 1d7748438cd7f1a4a84f0ab66215564cbc5ad36d..0000000000000000000000000000000000000000
--- a/doc/Query.md
+++ /dev/null
@@ -1,349 +0,0 @@
-
-# Example queries
-
-## Simple FIND Query
-The following query will return any entity which has the name _ename_ and all its children.
-`FIND ename`
-
-The following queries are equivalent and will return any entity which has the name _ename_ and all its children, but only if they are genuin records. Of course, the returned set of entities (henceforth referred to as _resultset_) can also be restricted to recordtypes, properties and files.
-
-`FIND RECORD ename`
-
-`FIND RECORDS ename`
-
-Wildcards use `*` for any characters or none at all. Wildcards for single characters (like the '_' wildcard from mysql) are not implemented yet.
-
-`FIND RECORD en*` returns any entity which has a name beginning with _en_.
-
-Regular expressions must be surrounded by _<<_ and '>>':
-
-`FIND RECORD <<e[aemn]{2,5}>>`
-
-`FIND RECORD <<[cC]am_[0-9]*>>`
-
-*TODO* (Timm):
-Describe escape sequences like `\\`, `\*`, `\<<` and `\>>`.
-
-Currently, wildcards and regular expressions are only available for the _simple-find-part_ of the query, i. e. no wildcards/regexps for filters.
-
-## Simple COUNT Query
-
-This query counts entities which have certain properties.
-
-`COUNT ename`
-will return the number of entities which have the name _ename_ and all their children.
-
-The syntax of the COUNT queries is equivalent to the FIND queries in any respect (this also applies to wildcards and regular expressions) but one: The prefix is to be `COUNT` instead of `FIND`. 
-
-Unlike the FIND queries, the COUNT queries do not return any entities. The result of the query is the number of entities which _would be_ returned if the query was a FIND query.
-
-## Filters
-
-### POV - Property-Operator-Value
-
-The following queries are equivalent and will restrict the result set to entities which have a property named _pname1_ that has a value _val1_.
-
-`FIND ename.pname1=val1`
-
-`FIND ename WITH pname1=val1`
-
-`FIND ename WHICH HAS A PROPERTY pname1=val1`
-
-`FIND ename WHICH HAS A pname1=val1`
-
-Again, the resultset can be restricted to records:
-
-`FIND RECORD ename WHICH HAS A pname1=val1`
-
-_currently known operators:_ `=, !=, <=, <, >=, >` (and cf. next paragraphes!)
-
-#### Special Operator: LIKE
-
-The _LIKE_ can be used with wildcards. The `*` is a wildcard for any (possibly empty) sequence of characters. Examples: 
-
-`FIND RECORD ename WHICH HAS A pname1 LIKE va*`
-
-`FIND RECORD ename WHICH HAS A pname1 LIKE va*1`
-
-`FIND RECORD ename WHICH HAS A pname1 LIKE *al1`
-
-_Note:_ The _LIKE_ operator is will only produce expectable results with text properties.
-
-#### Special Case: References
-
-In general a reference can be addressed just like a POV filter. So 
-
-`FIND ename1.pname1=ename2`
-
-will also return any entity named _ename1_ which references the entity with name or id _ename2_ via a reference property named _pname1_. However, it will also return any entity with a text property of that name with the string value _ename2_. In order to restrict the result set to reference properties one may make use of special reference operators:
-
-_reference operators:_ `->, REFERENCES, REFERENCE TO`
-
-
-The query looks like this:
-
-`FIND ename1 WHICH HAS A pname1 REFERENCE TO ename2`
-
-`FIND ename1 WHICH HAS A pname1->ename2`
-
-#### Time Special Case: DateTime
-
-_DateTime operators:_ `=, !=, <, >, IN, NOT IN`
-
-##### `d1=d2`: Equivalence relation. 
-* ''True'' iff d1 and d2 are equal in every respect (same DateTime flavor, same fields are defined/undefined and all defined fields are equal respectively). 
-* ''False'' iff they have the same DateTime flavor but have different fields defined or fields with differing values.
-* ''Undefined'' otherwise.
-
-Examples:
-* `2015-04-03=2015-04-03T00:00:00` is undefined.
-* `2015-04-03T00:00:00=2015-04-03T00:00:00.0` is undefined (second precision vs. nanosecond precision).
-* `2015-04-03T00:00:00.0=2015-04-03T00:00:00.0` is true.
-* `2015-04-03T00:00:00=2015-04-03T00:00:00` is true.
-* `2015-04=2015-05` is false.
-* `2015-04=2015-04` is true. 
-
-##### `d1!=d2`: Intransitive, symmetric relation. 
-* ''True'' iff `d1=d2` is false. 
-* ''False'' iff `d1=d2` is true. 
-* ''Undefined'' otherwise.
-
-Examples:
-* `2015-04-03!=2015-04-03T00:00:00` is undefined.
-* `2015-04-03T00:00:00!=2015-04-03T00:00:00.0` is undefined.
-* `2015-04-03T00:00:00.0!=2015-04-03T00:00:00.0` is false.
-* `2015-04-03T00:00:00!=2015-04-03T00:00:00` is false.
-* `2015-04!=2015-05` is true.
-* `2015-04!=2015-04` is false. 
-
-##### `d1>d2`: Transitive, non-symmetric relation.
-Semantics depend on the flavors of d1 and d2. If both are... 
-###### [UTCDateTime](Datatype#datetime) 
-* ''True'' iff the time of d1 is after the the time of d2 according to [https://en.wikipedia.org/wiki/Coordinated_Universal_Time](UTC)
-* ''False'' otherwise.
-
-###### [SemiCompleteDateTime](Datatype#datetime)
-* ''True'' iff `d1.ILB>d2.EUB` is true or `d1.ILB=d2.EUB` is true.
-* ''False'' iff `d1.EUB<d2.ILB}} is true or {{{d1.EUB=d2.ILB` is true.
-* ''Undefined'' otherwise.
-
-Examples:
-* `2015>2014` is true.
-* `2015-04>2014` is true.
-* `2015-01-01T20:15.00>2015-01-01T20:14` is true.
-* `2015-04>2015` is undefined.
-* `2015>2015-04` is undefined.
-* `2015-01-01T20:15>2015-01-01T20:15:15` is undefined.
-* `2014>2015` is false.
-* `2014-04>2015` is false.
-* `2014-01-01>2015-01-01T20:15:30` is false.
-
-##### `d1<d2`: Transitive, non-symmetric relation.
-Semantics depend on the flavors of d1 and d2. If both are... 
-###### [UTCDateTime](Datatype#datetime)
-* ''True'' iff the time of d1 is before the the time of d2 according to [UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time)
-* ''False'' otherwise.
-
-###### [SemiCompleteDateTime](Datatype#datetime)
-* ''True'' iff `d1.EUB<d2.ILB` is true or `d1.EUB=d2.ILB` is true.
-* ''False'' iff `d1.ILB>d2.EUB}} is true or {{{d1.ILB=d2.EUB` is true.
-* ''Undefined'' otherwise.
-
-Examples:
-* `2014<2015` is true.
-* `2014-04<2015` is true.
-* `2014-01-01<2015-01-01T20:15:30` is true.
-* `2015-04<2015` is undefined.
-* `2015<2015-04` is undefined.
-* `2015-01-01T20:15<2015-01-01T20:15:15` is undefined.
-* `2015<2014` is false.
-* `2015-04<2014` is false.
-* `2015-01-01T20:15.00<2015-01-01T20:14` is false.
-
-##### `d1 IN d2`: Transitive, non-symmetric relation.
-Semantics depend on the flavors of d1 and d2. If both are... 
-###### [SemiCompleteDateTime](Datatype#datetime)
-* ''True'' iff (`d1.ILB>d2.ILB` is true or `d1.ILB=d2.ILB` is true) and (`d1.EUB<d2.EUB` is true or `d1.EUB=d2.EUB` is true).
-* ''False'' otherwise.
-
-Examples:
-* `2015-01-01 IN 2015` is true.
-* `2015-01-01T20:15:30 IN 2015-01-01` is true.
-* `2015-01-01T20:15:30 IN 2015-01-01T20:15:30` is true.
-* `2015 IN 2015-01-01` is false.
-* `2015-01-01 IN 2015-01-01T20:15:30` is false.
-
-##### `d1 NOT IN d2`:  Transitive, non-symmetric relation.
-Semantics depend on the flavors of d1 and d2. If both are... 
-###### [SemiCompleteDateTime](Datatype#datetime)
-* ''True'' iff (`d1.ILB IN d2.ILB` is false.
-* ''False'' otherwise.
-
-Examples:
-* `2015 NOT IN 2015-01-01` is true.
-* `2015-01-01 NOT IN 2015-01-01T20:15:30` is true.
-* `2015-01-01 NOT IN 2015` is false.
-* `2015-01-01T20:15:30 NOT IN 2015-01-01` is false.
-* `2015-01-01T20:15:30 NOT IN 2015-01-01T20:15:30` is false.
-
-##### Note
-These semantics follow a three-valued logic with ''true'', ''false'' and ''undefined'' as truth values. Only ''true'' is truth preserving. I.e. only those expressions which evaluate to ''true'' pass the POV filter. `FIND ... WHICH HAS A somedate=2015-01` only returns entities for which `somedate=2015-01` is true. On the other hand, `FIND ... WHICH DOESN'T HAVE A somedate=2015-01` returns entities for which `somedate=2015-01` is false or undefined. Shortly put, `NOT d1=d2` is not equivalent to `d1!=d2`. The latter assertion is stronger.
-
-#### Omitting the Property or the Value
-
-One doesn't have to specify the property or the value at all. The following query filters the result set for entities which have any property with a value greater than _val1_.
-
-`FIND ename WHICH HAS A PROPERTY > val1`
-
-`FIND ename . > val1`
-
-`FIND ename.>val1`
-
-
-And for references...
-
-`FIND ename1 WHICH HAS A REFERENCE TO ename2`
-
-`FIND ename1 WHICH REFERENCES ename2`
-
-`FIND ename1 . -> ename2`
-
-`FIND ename1.->ename2`
-
-
-The following query returns entities which have a _pname1_ property with any value.
-
-`FIND ename WHICH HAS A PROPERTY pname1`
-
-`FIND ename WHICH HAS A pname1`
-
-`FIND ename WITH pname1`
-
-`FIND ename . pname1`
-
-`FIND ename.pname1`
-
-### TransactionFilter
-
-*Definition*
- sugar:: `HAS BEEN` | `HAVE BEEN` | `HAD BEEN` | `WAS` | `IS`
- negated_sugar:: `HAS NOT BEEN` | `HASN'T BEEN` | `WAS NOT` | `WASN'T` | `IS NOT` | `ISN'T`  | `HAVN'T BEEN` | `HAVE NOT BEEN` | `HADN'T BEEN` | `HAD NOT BEEN`
- by_clause:: `BY (ME | username | SOMEONE ELSE (BUT ME)? | SOMEONE ELSE BUT username)`
- datetime:: A datetime string of the form `YYYY[-MM[-DD(T| )[hh[:mm[:ss[.nnn][(+|-)zzzz]]]]]]`
- time_clause:: `[AT|ON|IN|BEFORE|AFTER|UNTIL|SINCE] (datetime) `
-
-`FIND ename WHICH (sugar|negated_sugar)? (NOT)? (CREATED|INSERTED|UPDATED) (by_clause time_clause?| time_clause by_clause?)`
-
-*Examples*
-
-`FIND ename WHICH HAS BEEN CREATED BY ME ON 2014-12-24`
-
-`FIND ename WHICH HAS BEEN CREATED BY SOMEONE ELSE ON 2014-12-24`
-
-`FIND ename WHICH HAS BEEN CREATED BY erwin ON 2014-12-24`
-
-`FIND ename WHICH HAS BEEN CREATED BY SOMEONE ELSE BUT erwin ON 2014-12-24`
-
-`FIND ename WHICH HAS BEEN CREATED BY erwin`
-
-`FIND ename WHICH HAS BEEN INSERTED SINCE 2021-04`
-
-Note that `SINCE` and `UNTIL` are inclusive, while `BEFORE` and `AFTER` are not.
-
-
-### File Location
-
-Search for file objects by their location:
-
-`FIND FILE WHICH IS STORED AT a/certain/path/`
-
-#### Wildcards
-
-_STORED AT_ can be used with wildcards similar to unix wildcards.
- * `*` matches any characters or none at all, but not the directory separator `/`
- * `**` matches any character or none at all.
- * A leading `*` is short cut for `/**`
- * A star directly between two other stars is ignored: `***` is the same as `**`.
- * Escape character: `\` (E.g. `\\` is a literal backslash. `\*` is a literal star. But `\\*` is a literal backslash followed by a wildcard.) 
-
-Examples:
-
-Find any files ending with `.acq`:
-`FIND FILE WHICH IS STORED AT *.acq` or
-`FIND FILE WHICH IS STORED AT **.acq` or
-`FIND FILE WHICH IS STORED AT /**.acq`
-
-Find files stored one directory below `/data/`, ending with `.acq`:
-`FIND FILE WHICH IS STORED AT /data/*/*.acq`
-
-Find files stored in `/data/`, ending with `.acq`:
-`FIND FILE WHICH IS STORED AT /data/*.acq`
-
-Find files stored in a directory at any depth in the tree below `/data/`, ending with `.acq`:
-`FIND FILE WHICH IS STORED AT /data/**.acq`
-
-Find any file in a directory which begins with `2016-02`:
-`FIND FILE WHICH IS STORED AT */2016-02*/*`
-
-
-### Back References
-
-The back reference filters for entities that are referenced by another entity. The following query returns entities of the type _ename1_ which are referenced by _ename2_ entities via the reference property _pname1_. 
-
-* `FIND ename1 WHICH IS REFERENCED BY ename2 AS A pname1`
-* `FIND ename1 WITH @ ename2 / pname1`
-* `FIND ename1 . @ ename2 / pname1`
-
-One may omit the property specification:
-
-* `FIND ename1 WHICH IS REFERENCED BY ename2`
-* `FIND ename1 WHICH HAS A PROPERTY @ ename2`
-* `FIND ename1 WITH @ ename2`
-* `FIND ename1 . @ ename2`
-
-### Combining Filters with Propositional Logic
-
-Any result set can be filtered by logically combining POV filters or back reference filters:
-
-#### Conjunction (AND)
-
-* `FIND ename1 WHICH HAS A PROPERTY pname1=val1 AND A PROPERTY pname2=val2 AND A PROPERTY...`
-* `FIND ename1 WHICH HAS A PROPERTY pname1=val1 AND A pname2=val2 AND ...`
-* `FIND ename1 . pname1=val1 & pname2=val2 & ...`
-
-#### Disjunction (OR)
-
-* `FIND ename1 WHICH HAS A PROPERTY pname1=val1 OR A PROPERTY pname2=val2 Or A PROPERTY...`
-* `FIND ename1 WHICH HAS A PROPERTY pname1=val1 OR A pname2=val2 OR ...`
-* `FIND ename1 . pname1=val1 | pname2=val2 | ...`
-
-#### Negation (NOT)
-
-* `FIND ename1 WHICH DOES NOT HAVE A PROPERTY pname1=val1`
-* `FIND ename1 WHICH DOESN'T HAVE A pname1=val1`
-* `FIND ename1 . NOT pname2=val2`
-* `FIND ename1 . !pname2=val2`
-
-#### ... and combinations with parentheses
-
-* `FIND ename1 WHICH HAS A pname1=val1 AND DOESN'T HAVE A pname2<val2 AND ((WHICH HAS A pname3=val3 AND A pname4=val4) OR DOES NOT HAVE A (pname5=val5 AND pname6=val6))`
-* `FIND ename1 . pname1=val1 & !pname2<val2 & ((pname3=val3 & pname4=val4) | !(pname5=val5 & pname6=val6))`
-* `FIND ename1.pname1=val1&!pname2<val2&((pname3=val3&pname4=val4)|!(pname5=val5&pname6=val6))`
-
-### A Few Important Expressions
-
-*  A:: The indistinct article. This is only syntactic suger. Equivalent expressions: `A, AN`
-*  AND:: The logical _and_. Equivalent expressions: `AND, &`
-*  FIND:: The beginning of the query.
-*  NOT:: The logical negation. Equivalent expressions: `NOT, DOESN'T HAVE A PROPERTY, DOES NOT HAVE A PROPERTY, DOESN'T HAVE A, DOES NOT HAVE A, DOES NOT, DOESN'T, IS NOT, ISN'T, !`
-*  OR:: The logical _or_. Equivalent expressions: `OR, |`
-*  RECORD,RECORDTYPE,FILE,PROPERTY:: Role expression for restricting the result set to a specific role.
-*  WHICH:: The marker for the beginning of the filters. Equivalent expressions: `WHICH, WHICH HAS A, WHICH HAS A PROPERTY, WHERE, WITH, .`
-*  REFERENCE:: This one is tricky: `REFERENCE TO` expresses a the state of _having_ a reference property. `REFERENCED BY` expresses the state of _being_ referenced by another entity.
-*  COUNT:: `COUNT` works like `FIND` but doesn't return the entities.
-
-# Future
-
- * *Sub Queries* (or *Sub Properties*): `FIND ename WHICH HAS A pname WHICH HAS A subpname=val`. This is like: `FIND AN experiment WHICH HAS A camera WHICH HAS A 'serial number'= 1234567890`
- * *More Logic*, especially `ANY`, `ALL`, `NONE`, and `SUCH THAT` key words (and equivalents) for logical quantisation: `FIND ename1 SUCH THAT ALL ename2 WHICH HAVE A REFERENCE TO ename1 HAVE A pname=val`. This is like `FIND experiment SUCH THAT ALL person WHICH ARE REFERENCED BY THIS experiment AS conductor HAVE AN 'academic title'=professor.`
- 
diff --git a/doc/User_Administration.md b/doc/User_Administration.md
deleted file mode 100644
index a51894cd87126b07f56addccba3f635e04872d71..0000000000000000000000000000000000000000
--- a/doc/User_Administration.md
+++ /dev/null
@@ -1,34 +0,0 @@
-Author: Timm Fitschen
-
-Email: timm.fitschen@ds.mpg.de
-
-Date: 2013-02-23
-
-# No Proposal
-http://caosdb/register
-
-# Proposal
-
-## Add User
-
-* POST Request is to be send to `http://host:port/User`.
-* This requires authetication as user _admin_ (default password: _adminpw_).
-* Http body:
-
-
-        <Post>
-          <User name="${username}" password="${md5ed_password} />
-        </Post>
-
-## Delete User
-
-* DELETE Request
-* admin authentication required.
-* Http body:
-
-
-        <Delete>
-          <User name="${username}/>
-        </Delete>
-
-The user to be deleted may also be identified by his id (`id="${id}"`) instead of his name.
diff --git a/doc/devel/Benchmarking.md b/doc/devel/Benchmarking.md
deleted file mode 100644
index 8a3eff2addb927eab425f7e755e3a181a53b9d18..0000000000000000000000000000000000000000
--- a/doc/devel/Benchmarking.md
+++ /dev/null
@@ -1,316 +0,0 @@
-
-
-# Benchmarking CaosDB #
-
-Benchmarking CaosDB may encompass several distinct areas: How much time is spent in the server's
-Java code, how much time is spent inside the SQL backend, are the same costly methods called more
-than once?  This documentation tries to answer some questions connected with these benchmarking
-aspects and give you the tools to answer your own questions.
-
-
-## Before you start ##
-In order to obtain meaningful results, you should disable caching.
-
-### MariaDB
-Set the corresponding variable to 0: `SET GLOBAL query_cache_type = 0;`
-
-### Java Server
-In the config:
-```conf
-CACHE_DISABLE=true
-```
-
-
-## Tools for the benchmarking ##
-
-For averaging over many runs of comparable requests and for putting the database into a
-representative state, Python scripts are used.  The scripts can be found in the `caosdb-dev-tools`
-repository, located at [https://gitlab.indiscale.com/caosdb/src/caosdb-dev-tools](https://gitlab.indiscale.com/caosdb/src/caosdb-dev-tools) in the folder
-`benchmarking`:
-
-### Python Script `fill_database.py` ###
-
-This commandline script is meant for filling the database with enough data to represeny an actual
-real-life case, it can easily create hundreds of thousands of Entities.
-
-The script inserts predefined amounts of randomized Entities into the database, RecordTypes,
-Properties and Records.  Each Record has a random (but with defined average) number of Properties,
-some of which may be references to other Records which have been inserted before.  Actual insertion
-of the Entities into CaosDB is done in chunks of a defined size.
-
-Users can tell the script to store times needed for the insertion of each chunk into a tsv file.
-
-### Python Script  `measure_execution_time.py` ###
-
-A somewhat outdated script which executes a given query a number of times and then save statistics
-about the `TransactionBenchmark` readings (see below for more information about the transaction
-benchmarks) delivered by the server.
-
-
-### Python Script  `sql_routine_measurement.py` 
-
-
-
-Simply call `./sql_routine_measurement.py` in the scripts directory. An sql
-file is automatically executed which enables the correct `performance_schema`
-tables. However, the performance_schema of mariadb needs to be enabled. Add
-`performance_schema=ON` to the configuration file of mariadb as it needs to be
-enabled on start up.
-This script expects the MariaDB server to be accessible on 127.0.0.1 with the default caosdb user
-and password (caosdb;random1234).
-
-You might consider to increase `performance_schema_events_transactions_history_long_size`.
-```
-performance_schema_events_transactions_history_long_size=1000000
-```
-The performance schema must be enabled (see below).
-
-### MariaDB General Query Log ###
-
-MariaDB and MySQL have a feature to enable the logging of SQL queries' times.  This logging must be
-turned on on the SQL server as described in the [upstream documentation](https://mariadb.com/kb/en/general-query-log/):
-Add to the mysql configuration:
-```
-log_output=TABLE
-general_log
-```
-or calling
-```sql
-SET GLOBAL log_output = 'TABLE';
-SET GLOBAL general_log = 'ON';
-```
-
-In the Docker environment LinkAhead, this can conveniently be 
-done with `linkahead mysqllog {on,off,store}`.
-
-### MariaDB Slow Query Log ###
-See [slow query log docs](https://mariadb.com/kb/en/slow-query-log-overview/)
-
-### MariaDB Performance Schema ###
-The most detailed information on execution times can be acquired using the performance schema.
-
-To use it, the `performance_schema` setting in the MariaDB server must be enabled([docs](https://mariadb.com/kb/en/performance-schema-overview/#enabling-the-performance-schema), for example by setting
-this in the config files:
-```
-[mysqld]
-
-performance_schema=ON
-```
-
-The performance schema provides many different tables in the `performance_schema`. You can instruct MariaDB to create
-those tables by setting the appropriate `instrument` and `consumer` variables. E.g. 
-```SQL
-update performance_schema.setup_instruments set enabled='YES', timed='YES' WHERE NAME LIKE '%statement%';
-update performance_schema.setup_consumers set enabled='YES' WHERE NAME LIKE '%statement%';
-```
-This can also be done via the configuration. 
-```
-[mysqld]
-
-performance_schema=ON
-performance-schema-instrument='statement/%=ON'
-performance-schema-consumer-events-statements-history=ON                        
-performance-schema-consumer-events-statements-history-long=ON
-```
-You may want to look at the result of the following commands:
-```sql
-
-select * from performance_schema.setup_consumers;
-select * from performance_schema.setup_instruments;
-```
-
-Note, that the `base_settings.sql` enables appropriate instruments and consumers.
-
-Before you start a measurement, you will want to empty the tables. E.g.:
-```sql
-truncate table  performance_schema.events_statements_history_long ;
-```
-The procedure `reset_stats` in `base_settings.sql` clears the typically used ones.
-
-The tables contain many columns. An example to get an informative view is
-```sql
-select left(sql_text,50), left(digest_text,50), ms(timer_wait) from performance_schema.events_statements_history_long order by ms(timer_wait);
-```
-where the function `ms` is defined in `base_settings.sql`.
-Or a very useful one:
-```sql
-select  left(digest_text,100) as digest,ms(sum_timer_wait) as time_ms, count_star from performance_schema.events_statements_summary_by_digest order by time_ms;
-```
-
-### Useful SQL configuration with docker
-In order to allow easy testing and debugging the following is useful when using docker.
-Change the docker-compose file to include the following for the mariadb service:
-```
-    networks:
-      # available on port 3306, host name 'sqldb'
-      - caosnet
-    ports:
-      - 3306:3306
-```
-Check it with `mysql -ucaosdb -prandom1234 -h127.0.0.1 caosdb`
-Add the appropriate changes (e.g. `performance_schema=ON`) to `profiles/empty/custom/mariadb.conf.d/mariadb.cnf` (or in the profile folder that you use).
-
-### Manual Java-side benchmarking #
-
-Benchmarking can be done using the `TransactionBenchmark` class (in package
-`org.caosdb.server.database.misc`).
-
-- Single timings can be added to instances of that class via the
-  `addBenchmark(object, time)` method.  Multiple benchmarks for the same object
-  (typically just strings) can be averaged.
-- Benchmarks can be serialized into XML, `Container` and `Query` objects already
-  use this with their included benchmarks to output benchmarking results.
-- To work with the benchmarks of often used objects, use these methods:
-  - `Container.getTransactionBenchmark().addBenchmark()`
-  - `Query.addBenchmark()`
-
-
-To enable transaction benchmarks and disable caching in the server, set these
-server settings:
-```conf
-TRANSACTION_BENCHMARK_ENABLED=true
-CACHE_DISABLE=true
-```
-Additionally, the server should be started via `make run-debug` (instead of
-`make run-single`), otherwise the benchmarking will not be active.
-
-#### Notable benchmarks and where to find them ##
-
-| Name                                 | Where measured                               | What measured                 |
-|--------------------------------------|----------------------------------------------|-------------------------------|
-| `Retrieve.init`                      | transaction/Transaction.java#135             | transaction/Retrieve.java#48  |
-| `Retrieve.transaction`               | transaction/Transaction.java#174             | transaction/Retrieve.java#133 |
-| `Retrieve.post_transaction`          | transaction/Transaction.java#182             | transaction/Retrieve.java#77  |
-| `EntityResource.httpGetInChildClass` | resource/transaction/EntityResource.java#118 | all except XML generation     |
-| `ExecuteQuery`                       | ?                                            | ?                             |
-|                                      |                                              |                               |
-
-### External JVM profilers ###
-
-Additionally to the transaction benchmarks, it is possible to benchmark the server execution via
-external Java profilers.  For example, [VisualVM](https://visualvm.github.io/) can connect to JVMs running locally or remotely
-(e.g. in a Docker container).  To enable this in LinkAhead's Docker environment, set
-
-```yaml
-devel:
-  profiler: true
-```
-Alternatively, start the server (without docker) with the `run-debug-single` make target, it will expose
-the JMX interface, by default on port 9090.
-
-Most profilers, like as VisualVM, only gather cumulative data for call trees, they do not provide
-complete call graphs (as callgrind/kcachegrind would do).  They also do not differentiate between
-calls with different query strings, as long as the Java process flow is the same (for example, `FIND
-Record 1234` and `FIND Record A WHICH HAS A Property B WHICH HAS A Property C>100` would be handled
-equally).
-
-
-#### Example settings for VisualVM 
-
-In the sampler settings, you may want to add these expressions to the blocked
-packages: `org.restlet.**, com.mysql.**`.  Branches on the call tree which are
-entirely inside the blacklist, will become leaves.  Alternatively, specify a
-whitelist, for example with `org.caosdb.server.database.backend.implementation.**`,
-if you only want to see the time spent for certain MySQL calls.
-
-
-## How to set up a representative database ##
-For reproducible results, it makes sense to start off with an empty database and fill it using the
-`fill_database.py` script, for example like this:
-
-```sh
-./fill_database.py -t 500 -p 700 -r 10000 -s 100 --clean
-```
-
-The `--clean` argument is not strictly necessary when the database was empty before, but it may make
-sense when there have been previous runs of the command.  This example would create 500 RecordTypes,
-700 Properties and 10000 Records with randomized properties, everything is inserted in chunks of 100
-Entities.
-
-## How to measure request times ##
-
-If the execution of the Java components is of interest, the VisualVM profiler should be started and
-connected to the server before any requests to the server are started.
-
-When doing performance tests which are used for detailed analysis, it is important that
-
-1. CaosDB is in a reproducible state, which should be documented
-2. all measurements are repeated several times to account for inevitable variance in access (for
-   example file system caching, network variablity etc.)
-
-### Filling the database ###
-
-By simply adding the option `-T logfile.tsv` to the `fill_database.py` command above, the times for
-inserting the records are stored in a tsv file and can be analyzed later.
-
-### Obtain statistics about a query ###
-
-To repeat single queries a number of times, `measure_execution_time.py` can be used, for example:
-
-```sh
-./measure_execution_time.py -n 120 -q "FIND MusicalInstrument WHICH IS REFERENCED BY Analysis"
-```
-
-This command executes the query 120 times, additional arguments could even plot the
-TransactionBenchmark results directly.
-
-## On method calling order and benchmarked events ##
-
-- `Transaction.execute()` :: Logs benchmarks for events like:
-  - `INIT` :: The transaction's `init()` method.
-  - `PRE_CHECK`
-  - `CHECK`
-  - `POST_CHECK`
-  - `PRE_TRANSACTION`
-  - `TRANSACTION` -> typically calls
-    `database.backend.transaction.[BackendTransaction].execute()`, which in turn
-    calls, some levels deeper, `backend.transaction.....execute(<k extends
-    BackendTransaction> t)` -> see next point
-  - ...
-- `backend.transaction.[...].execute(transaction)` :: This method is benchmarked
-  again (via parent class `BackendTransaction`), this is probably the deepest
-  level of benchmarking currently (Benchmark is logged as
-  e.g. `<RetrieveFullEntity>...</>`).  It finally calls
-  `[MySQLTransaction].execute()`.
-- `[MySQLTransaction].execute()` :: This is the deepest backend implementation
-  part, it typically creates a prepared statement and executes it.
-- Currently not benchmarked separately:
-  - Getting the actual implementation (probably fast?)
-  - Preparing the SQL statement
-  - Executing the SQL statement
-  - Java-side caching
-
-## What is measured ##
-
-For a consistent interpretation, the exact definitions of the measured times are as follows:
-
-### SQL logs ###
-
-As per https://mariadb.com/kb/en/general-query-log, the logs store only the time at which the SQL
-server received a query, not the duration of the query.
-
-#### Possible future enhancements ####
-
-- The `query_response_time` plugin may be additionally used in the future, see
-  https://mariadb.com/kb/en/query-response-time-plugin
-
-### Transaction benchmarks ###
-
-Transaction benchmarking manually collects timing information for each transaction.  At defined
-points, different measurements can be made, accumulated and will finally be returned to the client.
-Benchmark objects may consist of sub benchmarks and have a number of measurement objects, which
-contain the actual statistics.
-
-Because transaction benchmarks must be manually added to the server code, they only monitor those
-code paths where they are added.  On the other hand, their manual nature allows for a more
-abstracted analysis of performance bottlenecks.
-
-### Java profiler ###
-
-VisualVM records for each thread the call tree, specifically which methods were called how often and
-how much time was spent inside these methods.
-
-### Global requests ###
-
-Python scripts may measure the global time needed for the execution of each request.
-`fill_database.py` obtains its numbers this way.
diff --git a/doc/devel/Development.md b/doc/devel/Development.md
deleted file mode 100644
index 246f80db14eeadfd1b95e062f0b43636d5f6960c..0000000000000000000000000000000000000000
--- a/doc/devel/Development.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: Development
-author: Daniel Hornung
-...
-
-
-# Developing the CaosDB server #
-This file contains information about server development, it is aimed at those
-who want to debug, understand or enhance the CaosDB server.
-
-## Testing ##
-Whether developing new features, refacturing code or fixing bugs, the server
-code should be thoroughly tested for correct and incorrect behvaiour, on correct
-and incorrect input.
-
-### Writing tests ###
-Tests go into `src/test/java/caosdb/`, the files there can serve as examples for
-writing tests.
-
-### Running tests with Maven ###
-- Automatic testing can be done with `make test` or, after compilation, `mvn
-  test`.
-- Tests of single modules can be started with `mvn test -Dtest=TestClass`
-- Test of a single method `footest`: `mvn test -Dtest=TestClass#footest`
diff --git a/doc/devel/Logging.md b/doc/devel/Logging.md
deleted file mode 100644
index f9b1680e61b207379ff513e4828befca5df8ec31..0000000000000000000000000000000000000000
--- a/doc/devel/Logging.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# Logging
-
-## Framework
-
-We use the SLF4J API with a log4j2 backend for all of our Code. Please do not use log4j2 directly or any other logging API.
-
-Note that some libraries on the classpath use the `java.util.logging` API and log4j1 logging framework instead. These loggers cannot be configurated with the help of this README by now.
-
-## Configuration
-
-The configuration of the log4j2 backend is done via `properties` files which
-comply with the [log4j2
-specifications](https://logging.apache.org/log4j/2.x/manual/configuration.html#Properties).
-XML, YAML, or JSON files are not supported.  The usual mechanisms for automatic
-configuration with such files is disabled.  Instead, files have to be placed
-into the `conf` subdirs, as follows:
-
-### Default and Debug Logging
-
-The default configuration is located at `conf/core/log4j2-default.properties`. For the debug mode, the configuration from `conf/core/log4j2-debug.properties` is merged with the default configuration. These files should not be changed by the user.
-
-### User Defined Logging
-
-The default and debug configuration can be overridden by the user with `conf/ext/log4j2.properties` and any file in the directory `conf/ext/log4j2.properties.d/` which is suffixed by `.properties`. All loggin configuration files are merged using the standard merge strategy of log4:
-
-> # Composite Configuration
-> Log4j allows multiple configuration files to be used by specifying them as a list of comma separated file paths on log4j.configurationFile. The merge logic can be controlled by specifying a class that implements the MergeStrategy interface on the log4j.mergeStrategy property. The default merge strategy will merge the files using the following rules:
-> 1. The global configuration attributes are aggregated with those in later configurations replacing those in previous configurations, with the exception that the highest status level and the lowest monitorInterval greater than 0 will be used.
-> 2. Properties from all configurations are aggregated. Duplicate properties replace those in previous configurations.
-> 3. Filters are aggregated under a CompositeFilter if more than one Filter is defined. Since Filters are not named duplicates may be present.
-> 4. Scripts and ScriptFile references are aggregated. Duplicate definiations replace those in previous configurations.
-> 5. Appenders are aggregated. Appenders with the same name are replaced by those in later configurations, including all of the Appender's subcomponents.
-> 6. Loggers are all aggregated. Logger attributes are individually merged with duplicates being replaced by those in later configurations. Appender references on a Logger are aggregated with duplicates being replaced by those in later configurations. Filters on a Logger are aggregated under a CompositeFilter if more than one Filter is defined. Since Filters are not named duplicates may be present. Filters under Appender references included or discarded depending on whether their parent Appender reference is kept or discarded.
-
-[2](https://logging.apache.org/log4j/2.x/manual/configuration.html#CompositeConfiguration)
-
-## Some Details and Examples
-
-### Make Verbose
-
-To make the server logs on the console more verbose, insert `rootLogger.level = DEBUG` or even `rootLogger.level = TRACE` into a properties file in the `conf/ext/log4j2.properties.d/` directory or the `conf/ext/log4j2.properties` file.
-
-### Log Directory
-
-By default, log files go to `./log/`, e.g. `./log/request_errors/current.log`. The log directory in `DEBUG_MODE` is located at `./testlog/`.
-
-To change that, insert `property.LOG_DIR = /path/to/my/logs` into a properties file in the `conf/ext/log4j2.properties.d/` directory or the `conf/ext/log4j2.properties` file
-
-### Special loggers
-
-* `REQUEST_ERRORS_LOGGER` for logging server errors with SRID, full request and full response. WARNING: This logger stores unencrypted content of request with possibly confidential content.
-* `REQUEST_TIME_LOGGER` for timing the requests.
-
-These loggers are defined in the `conf/core/log4j2-default.properties` file.
-
-#### Enable Request Time Logger
-
-The `REQUEST_TIME_LOGGER` is disabled by default, its log level is set to `OFF`. To enable it and write logs to the directory denoted by `property.LOG_DIR`, create a `properties` file under `conf/ext/log4j2.properties.d/` which contains at least
-
-```properties
-property.REQUEST_TIME_LOGGER_LEVEL = TRACE
-```
-
-### debug.log
-
-When in `DEBUG_MODE`, e.g. when started with `make run-debug`, the server also writes all logs to `debug.log` in the log directory.
-
diff --git a/doc/faq.md b/doc/faq.md
deleted file mode 100644
index 09e8adb7f3072ea94042e43d962c33345c2482d6..0000000000000000000000000000000000000000
--- a/doc/faq.md
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-# How do I declare a LIST property?
-
-Use the datatype parameter (available with Property constructors and with the ```add_property``` method and the ```LIST``` function.
-
-```python
-#with constructor
-p = caosdb.Property(name="ListOfDoubles", datatype=caosdb.LIST(caosdb.DOUBLE))
-
-# with add_property method
-my_entity.add_property(name="ListOfIntegers", datatype=caosdb.LIST(caosdb.INTEGER))
-my_entity.add_property(name="ListOfThings", datatype=caosdb.LIST("Thing"))
-my_entity.add_property(name="ListOfThings", datatype=caosdb.LIST(caosdb.RecordType('Thing'))
-```
-
-# Which data types are there?
-
-There are 7 basic data types:
-
-* `INTEGER`
-* `DOUBLE`
-* `DATETIME`
-* `TEXT`
-* `BOOLEAN`
-* `FILE`
-* `REFERENCE`
-
-There is (so far) 1 data type for collections:
-
-* `LIST` (Well, LIST-of-another-data-type, e.g. `LIST(INTEGER)`)
-
-And furthermore,... 
-
-* Any RecordType can be used as a `REFERENCE` data type with a limited scope. That is, a property
-
-    ```python
-    p = caosdb.Property(name="Conductor", datatype="Person")
-    ```
-
-    will only accept those Entities as value which have a "Person" RecordType as a direct or indirect parent.
-
-See also: [Datatype](Datatype)
diff --git a/pom.xml b/pom.xml
index ea47a9e516122019c06146a61538b5957d1d5b0f..835de2d3eebef06cb10e9efd2e4aaf6890287357 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,7 +25,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.caosdb</groupId>
   <artifactId>caosdb-server</artifactId>
-  <version>0.9.0</version>
+  <version>0.10.0</version>
   <packaging>jar</packaging>
   <name>CaosDB Server</name>
   <scm>
diff --git a/src/doc/CaosDB-Query-Language.md b/src/doc/CaosDB-Query-Language.md
index 0e05a56b259cb7f99cba7ad4d1dd6d1856117050..6cbe64f1582b53f9e5c6dc60e21d988fd193d476 100644
--- a/src/doc/CaosDB-Query-Language.md
+++ b/src/doc/CaosDB-Query-Language.md
@@ -1,49 +1,107 @@
-# CaosDB Query Language
-**WIP This is going to be the specification. CQL tutorials are in the webui**
-
-## Example queries
-
-### Simple FIND Query
-The following query will return any entity which has the name _ename_ and all its children.
-`FIND ename`
-
-The following queries are equivalent and will return any entity which has the name _ename_ and all its children, but only if they are genuin records. Of course, the returned set of entities (henceforth referred to as _resultset_) can also be restricted to recordtypes, properties and files.
-
-`FIND RECORD ename`
-
-`FIND RECORDS ename`
-
-Wildcards use `*` for any characters or none at all. Wildcards for single characters (like the '_' wildcard from mysql) are not implemented yet.
-
-`FIND RECORD en*` returns any entity which has a name beginning with _en_.
-
-Regular expressions must be surrounded by _<<_ and '>>':
-
-`FIND RECORD <<e[aemn]{2,5}>>`
-
-`FIND RECORD <<[cC]am_[0-9]*>>`
-
-*TODO* (Timm):
-Describe escape sequences like `\\  `, `\*`, `\<<` and `\>>`.
-
-Currently, wildcards and regular expressions are only available for the _simple-find-part_ of the query, i. e. no wildcards/regexps for filters.
-
-### Simple COUNT Query
-
-This query counts entities which have certain properties.
-
-`COUNT ename`
-will return the number of entities which have the name _ename_ and all their children.
-
-The syntax of the COUNT queries is equivalent to the FIND queries in any respect (this also applies to wildcards and regular expressions) but one: The prefix is to be `COUNT` instead of `FIND`. 
-
-Unlike the FIND queries, the COUNT queries do not return any entities. The result of the query is the number of entities which _would be_ returned if the query was a FIND query.
-
-## Filters
+# CaosDB Query Language Examples
+
+See syntax specification in [CaosDB Query Language Syntax](query-syntax).
+
+In this chapter, the CaosDB Query Language (CQL) is presented as a means of
+formulating search commands, commonly referred to as queries. It is highly
+recommended that you experiment with the examples provided, such as those found
+on https://demo.indiscale.com. An interactive tour is also available on this
+public instance, which includes a comprehensive overview of the query language.
+Therefore, it is suggested that you begin there and subsequently proceed with
+this more detailed explanation.
+
+## Introduction
+
+Queries typically start with the keyword `FIND`, followed by a description of
+what you want to find. For example, you can search for all musical instruments
+with `FIND MusicalInstrument`.
+
+*Note*, the CQL is case **in**sensitive. We will write keywords of CQL in all
+caps to illustrate what parts are part of the language.
+
+The most common way is to provide a RecordType name after `FIND` (as in the
+example above). However, you can also use the name of some other entity:
+`FIND 'My first guitar'`.
+
+*Note*, that we put the name here in quotes. Spaces are used in CQL as separator
+of words. Thus, if something contains quotes, like the name here, it needs to be
+quoted.
+
+While queries like the last one are great to get an impression of the data,
+often we need to be more specific. Therefore, queries can include various
+conditions to restrict the result set.
+
+Example: `FIND MusicalAnalysis WITH quality_factor>0.5 AND date IN
+2019`. The keyword `WITH` signifies that for each Record of the type
+`MusicalAnalysis`, an assessment is made to determine whether it possesses a
+Property labelled `quality_factor` that exceeds 0.5, as well as another
+Property labelled `date` that may correspond to any day within the year 2019.
+
+In order to make CQL easier to learn and to remember we designed it to be close
+to natural spoken English language. For example, you can write
+`FIND Guitar WHICH HAS A PROPERTY price`. Here, "HAS A PROPERTY" is what we call
+syntactic sugar. It lets the query role off the tongue more easily than
+`FIND Guitar WHICH price` but it is actually not needed and does not change
+the meaning of the query. In fact, you could also write `FIND Guitar WITH
+price`.
+
+If you are only interested in the number of Entities that match your query, you
+can replace `FIND` with `COUNT` and the query will only return the number of
+Entities in the result set.
+
+Sometimes the list of Records that you get using a `FIND` query is not what you
+need; especially if you want to export a subset of the data for the analysis
+with some external tool.
+`SELECT` queries offer to represent the query result in a tabular form.
+
+If you replace the `FIND` keyword of a query with `SELECT x, y, z FROM`, then
+CaosDB will return the result as tabular data.
+
+For example, instead of `FIND Guitar`, try out
+`SELECT name, electric FROM Guitar`
+
+As you can see, those queries are design to allow very specific data requests.
+If you do not want/need to be as specific you can omit the first keyword (`FIND`
+or `SELECT`) which creates a search for anything that has a text Property with
+something like your expression. For example, the query "John" will search for
+any Records that has a text property that contains this string.
+
+With this, we conclude our introduction of CQL. You now know about the basic
+elements. The following will cover the various aspects in more detail and you
+will for example learn how you can use references among Records, or meta data
+like the creation time of a Record to restrict the query result set.
+
+## What am I searching for?
+
+We already learned, that we can provide the name of a RecordType after the `FIND`
+keyword. Let's call this part of the query "entity expression". In general, we
+need to identify with the entity expression one or more entities via their name, CaosDB ID
+or a pattern.
+- `FIND Guitar`
+- `FIND Guit*` ('*' represents none, one or more characters)
+- `FIND <<[gG]ui.*>>` (a regular expression surrounded by _<<_ and '>>'. see below)
+- `FIND 110`
+
+The result set will contain Entities that are either identified by the entity expression
+directly (i.e. they have the name or the given ID) or the have such an Entity as
+parent.
+
+As you know, CaosDB distincts among different Entity roles:
+- Entity
+- Record
+- RecordType
+- Property
+- File
+
+You can provide the role directly after the `FIND` keyword and before the
+entity expression: `FIND RECORD Guitar`. The result set will then restricted
+to Entities with that role.
+
+## Conditions / Filters
 
 ### POV - Property-Operator-Value
 
-The following queries are equivalent and will restrict the result set to entities which have a property named _pname1_ that has a value _val1_.
+The following queries are equivalent and will restrict the result set to records which have a property named _pname1_ that has a value _val1_.
 
 `FIND ename.pname1=val1`
 
@@ -53,31 +111,33 @@ The following queries are equivalent and will restrict the result set to entitie
 
 `FIND ename WHICH HAS A pname1=val1`
 
-Again, the resultset can be restricted to records:
+Again, the resultset can be restricted to any other entity role as well:
 
-`FIND RECORD ename WHICH HAS A pname1=val1`
+`FIND RECORDTYPE ename WHICH HAS A pname1=val1`
 
 _currently known operators:_ `=, !=, <=, <, >=, >` (and cf. next paragraphes!)
 
 #### Special Operator: LIKE
 
-The _LIKE_ can be used with wildcards. The `*` is a wildcard for any (possibly empty) sequence of characters. Examples: 
+The _LIKE_ can be used with wildcards. The `*` is a wildcard for any (possibly empty) sequence of characters.
 
-`FIND RECORD ename WHICH HAS A pname1 LIKE va*`
+Examples:
 
-`FIND RECORD ename WHICH HAS A pname1 LIKE va*1`
+`FIND ename WHICH HAS A pname1 LIKE va*`
 
-`FIND RECORD ename WHICH HAS A pname1 LIKE *al1`
+`FIND ename WHICH HAS A pname1 LIKE va*1`
 
-_Note:_ The _LIKE_ operator is will only produce expectable results with text properties.
+`FIND ename WHICH HAS A pname1 LIKE *al1`
+
+_Note:_ The _LIKE_ operator will only produce expectable results with text properties.
 
 #### Special Case: References
 
-In general a reference can be addressed just like a POV filter. So 
+In general a reference can be addressed just like a POV filter. So
 
-`FIND ename1.pname1=ename2`
+`FIND ename1 WITH pname1=ename2`
 
-will also return any entity named _ename1_ which references the entity with name or id _ename2_ via a reference property named _pname1_. However, it will also return any entity with a text property of that name with the string value _ename2_. In order to restrict the result set to reference properties one may make use of special reference operators:
+will also return any record named _ename1_ which references the entity with name or id _ename2_ via a reference property named _pname1_. However, it will also return any entity with a text property of that name with the string value _ename2_. In order to restrict the result set to reference properties one may make use of special reference operators:
 
 _reference operators:_ `->, REFERENCES, REFERENCE TO`
 
@@ -88,12 +148,12 @@ The query looks like this:
 
 `FIND ename1 WHICH HAS A pname1->ename2`
 
-#### Time Special Case: DateTime
+#### Special Case: DateTime
 
 _DateTime operators:_ `=, !=, <, >, IN, NOT IN`
 
-##### `d1=d2`: Equivalence relation. 
-* ''True'' iff d1 and d2 are equal in every respect (same DateTime flavor, same fields are defined/undefined and all defined fields are equal respectively). 
+##### `d1=d2`: Equivalence relation.
+* ''True'' iff d1 and d2 are equal in every respect (same DateTime flavor, same fields are defined/undefined and all defined fields are equal respectively).
 * ''False'' iff they have the same DateTime flavor but have different fields defined or fields with differing values.
 * ''Undefined'' otherwise.
 
@@ -103,11 +163,11 @@ Examples:
 * `2015-04-03T00:00:00.0=2015-04-03T00:00:00.0` is true.
 * `2015-04-03T00:00:00=2015-04-03T00:00:00` is true.
 * `2015-04=2015-05` is false.
-* `2015-04=2015-04` is true. 
+* `2015-04=2015-04` is true.
 
-##### `d1!=d2`: Intransitive, symmetric relation. 
-* ''True'' iff `d1=d2` is false. 
-* ''False'' iff `d1=d2` is true. 
+##### `d1!=d2`: Intransitive, symmetric relation.
+* ''True'' iff `d1=d2` is false.
+* ''False'' iff `d1=d2` is true.
 * ''Undefined'' otherwise.
 
 Examples:
@@ -116,15 +176,19 @@ Examples:
 * `2015-04-03T00:00:00.0!=2015-04-03T00:00:00.0` is false.
 * `2015-04-03T00:00:00!=2015-04-03T00:00:00` is false.
 * `2015-04!=2015-05` is true.
-* `2015-04!=2015-04` is false. 
+* `2015-04!=2015-04` is false.
 
 ##### `d1>d2`: Transitive, non-symmetric relation.
-Semantics depend on the flavors of d1 and d2. If both are... 
-###### [UTCDateTime](specification/Datatype.html#datetime) 
+
+Semantics depend on the flavors of d1 and d2. If both are...
+
+###### [UTCDateTime](specification/Datatype.html#datetime)
+
 * ''True'' iff the time of d1 is after the the time of d2 according to [UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time).
 * ''False'' otherwise.
 
 ###### [SemiCompleteDateTime](specification/Datatype.html#datetime)
+
 * ''True'' iff `d1.ILB>d2.EUB` is true or `d1.ILB=d2.EUB` is true.
 * ''False'' iff `d1.EUB<d2.ILB}} is true or {{{d1.EUB=d2.ILB` is true.
 * ''Undefined'' otherwise.
@@ -141,12 +205,16 @@ Examples:
 * `2014-01-01>2015-01-01T20:15:30` is false.
 
 ##### `d1<d2`: Transitive, non-symmetric relation.
-Semantics depend on the flavors of d1 and d2. If both are... 
+
+Semantics depend on the flavors of d1 and d2. If both are...
+
 ###### [UTCDateTime](specification/Datatype.html#datetime)
+
 * ''True'' iff the time of d1 is before the the time of d2 according to [UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time)
 * ''False'' otherwise.
 
 ###### [SemiCompleteDateTime](specification/Datatype.html#datetime)
+
 * ''True'' iff `d1.EUB<d2.ILB` is true or `d1.EUB=d2.ILB` is true.
 * ''False'' iff `d1.ILB>d2.EUB}} is true or {{{d1.ILB=d2.EUB` is true.
 * ''Undefined'' otherwise.
@@ -163,8 +231,11 @@ Examples:
 * `2015-01-01T20:15.00<2015-01-01T20:14` is false.
 
 ##### `d1 IN d2`: Transitive, non-symmetric relation.
+
 Semantics depend on the flavors of d1 and d2. If both are... 
+
 ###### [SemiCompleteDateTime](specification/Datatype.html#datetime)
+
 * ''True'' iff (`d1.ILB>d2.ILB` is true or `d1.ILB=d2.ILB` is true) and (`d1.EUB<d2.EUB` is true or `d1.EUB=d2.EUB` is true).
 * ''False'' otherwise.
 
@@ -175,9 +246,12 @@ Examples:
 * `2015 IN 2015-01-01` is false.
 * `2015-01-01 IN 2015-01-01T20:15:30` is false.
 
-##### `d1 NOT IN d2`: Non-symmetric relation.
+##### `d1 NOT IN d2`: Transitive, non-symmetric relation.
+
 Semantics depend on the flavors of d1 and d2. If both are... 
+
 ###### [SemiCompleteDateTime](specification/Datatype.html#datetime)
+
 * ''True'' iff `d1.ILB IN d2.ILB` is false.
 * ''False'' otherwise.
 
@@ -189,11 +263,19 @@ Examples:
 * `2015-01-01T20:15:30 NOT IN 2015-01-01T20:15:30` is false.
 
 ##### Note
-These semantics follow a three-valued logic with ''true'', ''false'' and ''undefined'' as truth values. Only ''true'' is truth preserving. I.e. only those expressions which evaluate to ''true'' pass the POV filter. `FIND ... WHICH HAS A somedate=2015-01` only returns entities for which `somedate=2015-01` is true. On the other hand, `FIND ... WHICH DOESN'T HAVE A somedate=2015-01` returns entities for which `somedate=2015-01` is false or undefined. Shortly put, `NOT d1=d2` is not equivalent to `d1!=d2`. The latter assertion is stronger.
+
+These semantics follow a three-valued logic with `true`, `false` and `undefined` as truth
+values. Only `true` is truth preserving. I.e. only those expressions which evaluate to `true`
+pass the POV filter.
+
+`FIND ... WHICH HAS A somedate=2015-01` only returns entities for which `somedate=2015-01` is
+true. On the other hand, `FIND ... WHICH DOESN'T HAVE A somedate=2015-01` returns entities for which
+`somedate=2015-01` is false or undefined. Shortly put, `NOT d1=d2` is not equivalent to
+`d1!=d2`. The latter assertion is stronger.
 
 #### Omitting the Property or the Value
 
-One doesn't have to specify the property or the value at all. The following query filters the result set for entities which have any property with a value greater than _val1_.
+One doesn't have to specify the property or the value at all. The following query filters the result set for records which have any property with a value greater than _val1_.
 
 `FIND ename WHICH HAS A PROPERTY > val1`
 
@@ -213,7 +295,7 @@ And for references...
 `FIND ename1.->ename2`
 
 
-The following query returns entities which have a _pname1_ property with any value.
+The following query returns records which have a _pname1_ property with any value.
 
 `FIND ename WHICH HAS A PROPERTY pname1`
 
@@ -221,28 +303,29 @@ The following query returns entities which have a _pname1_ property with any val
 
 `FIND ename WITH pname1`
 
+`FIND ename WITH A pname1`
+
+`FIND ename WITH A PROPERTY pname1`
+
+`FIND ename WITH PROPERTY pname1`
+
 `FIND ename . pname1`
 
 `FIND ename.pname1`
 
 ### TransactionFilter
 
+`FIND ename WHICH (sugar|negated_sugar)? (NOT)? (CREATED|INSERTED|UPDATED) (by_clause time_clause?| time_clause by_clause?)`
+
 *Definition*
 
- sugar:: `HAS BEEN` | `HAVE BEEN` | `HAD BEEN` | `WAS` | `IS` | 
+ sugar:: `HAS BEEN` | `HAVE BEEN` | `HAD BEEN` | `WAS` | `IS`
 
- negated_sugar:: `HAS NOT BEEN` | `HASN'T BEEN` | `WAS NOT` | `WASN'T` | `IS NOT` | `ISN'T`  | `HAVN'T BEEN` | 
-`HAVE NOT BEEN` | `HADN'T BEEN` | `HAD NOT BEEN`
+ negated_sugar:: `HAS NOT BEEN` | `HASN'T BEEN` | `WAS NOT` | `WASN'T` | `IS NOT` | `ISN'T`  | `HAVN'T BEEN` | `HAVE NOT BEEN` | `HADN'T BEEN` | `HAD NOT BEEN`
 
  by_clause:: `BY (ME | username | SOMEONE ELSE (BUT ME)? | SOMEONE ELSE BUT username)`
-
- date:: A date string of the form `YYYY-MM-DD`
-
- datetime:: A datetime string of the form `YYYY-MM-DD hh:mm:ss`
-
- time_clause:: `ON ($date|$datetime) ` Here is plenty of room for more syntactic sugar, e.g. a `TODAY` keyword, and more funcionality, e.g. ranges.  
-
-`FIND ename WHICH ($sugar|$negated_sugar)? (NOT)? (CREATED|INSERTED|UPDATED|DELETED) (by_clause time_clause?| time_clause by_clause?)`
+ datetime:: A datetime string of the form `YYYY[-MM[-DD(T| )[hh[:mm[:ss[.nnn][(+|-)zzzz]]]]]]` or `TODAY`.
+ time_clause:: `[AT|ON|IN|BEFORE|AFTER|UNTIL|SINCE] (datetime) `
 
 *Examples*
 
@@ -252,12 +335,13 @@ The following query returns entities which have a _pname1_ property with any val
 
 `FIND ename WHICH HAS BEEN CREATED BY erwin ON 2014-12-24`
 
-`FIND ename WHICH HAS BEEN CREATED BY SOMEONE ELSE BUT erwin ON 2014-12-24`
+`FIND ename WHICH HAS BEEN UPDATED BY SOMEONE ELSE BUT erwin ON 2014-12-24`
 
-`FIND ename WHICH HAS BEEN CREATED BY erwin`
+`FIND ename WHICH HAS BEEN INSERTED BY erwin`
 
-`FIND ename . CREATED BY erwin ON `
+`FIND ename WHICH HAS BEEN INSERTED SINCE 2021-04`
 
+Note that `SINCE` and `UNTIL` are inclusive, while `BEFORE` and `AFTER` are not.
 
 
 ### File Location
@@ -297,7 +381,7 @@ Find any file in a directory which begins with `2016-02`:
 
 ### Back References
 
-The back reference filters for entities that are referenced by another entity. The following query returns entities of the type _ename1_ which are referenced by _ename2_ entities via the reference property _pname1_. 
+The back reference filters for entities that are referenced by another entity. The following query returns records of the type _ename1_ which are referenced by _ename2_ entities via the reference property _pname1_. 
 
 * `FIND ename1 WHICH IS REFERENCED BY ename2 AS A pname1`
 * `FIND ename1 WITH @ ename2 / pname1`
@@ -310,30 +394,66 @@ One may omit the property specification:
 * `FIND ename1 WITH @ ename2`
 * `FIND ename1 . @ ename2`
 
+### Nested queries, or filtering by sub-properties ###
+
+Nested queries can easily be searched by simply concatenating `WHICH` or `WITH` expressions:
+
+* `FIND ename WHICH HAS A pname WHICH HAS A subpname=val`
+* For example: `FIND AN experiment WHICH HAS A camera WHICH HAS A 'serial number'= 1234567890`
+
 ### Combining Filters with Propositional Logic
 
 Any result set can be filtered by logically combining POV filters or back reference filters:
 
 #### Conjunction (AND)
 
-* `FIND ename1 WHICH HAS A PROPERTY pname1=val1 AND A PROPERTY pname2=val2 AND A PROPERTY...`
-* `FIND ename1 WHICH HAS A PROPERTY pname1=val1 AND A pname2=val2 AND ...`
-* `FIND ename1 . pname1=val1 & pname2=val2 & ...`
+As we saw above, we can combine conditions:
+
+`FIND MusicalAnalysis WHICH HAS quality_factor>0.5 AND date IN 2019`
+
+In general, the conjunction takes the form `FIND <eexpr> WHICH <filter1> AND <filter2>`. You can
+also use `&` instead of `AND` or chain more than two conditions.  If you mix conjunctions with
+disjunctions, you need to add brackets to define the priority. For example: `FIND <eexpr> WHICH
+(<filter1> AND <filter2>) OR <filter3>`.
+
+`FIND Guitar WHICH REFERENCES Manufacturer AND price` is a combination of a reference filter and a
+POV filter. For readability, you can also write  
+`FIND Guitar WHICH REFERENCES Manufacturer AND WHICH HAS A price`. However, the additional "WHICH
+HAS A" is purely cosmetic (syntactic sugar).
 
 #### Disjunction (OR)
 
+The rules for disjunctions (`OR` or `|`) are the same as for conjunctions, see above.
+
 * `FIND ename1 WHICH HAS A PROPERTY pname1=val1 OR A PROPERTY pname2=val2 Or A PROPERTY...`
 * `FIND ename1 WHICH HAS A PROPERTY pname1=val1 OR A pname2=val2 OR ...`
 * `FIND ename1 . pname1=val1 | pname2=val2 | ...`
 
 #### Negation (NOT)
 
+You can negate any filter by prefixing the filter with `NOT` or `!`:
+`FIND <eexpr> WHICH NOT <filter1>`.
+
+There are many syntactic sugar alternatives which are treated the same as "NOT":
+- `DOES NOT HAVE`
+- `ISN'T`
+- and many more
+
 * `FIND ename1 WHICH DOES NOT HAVE A PROPERTY pname1=val1`
 * `FIND ename1 WHICH DOESN'T HAVE A pname1=val1`
 * `FIND ename1 . NOT pname2=val2`
 * `FIND ename1 . !pname2=val2`
 
-#### ... and combinations with parentheses
+#### Parentheses
+Basically, you can put parantheses around filter expressions and con- or
+disjunctions.
+- `FIND Guitar WHICH (REFERENCES Manufacturer AND WHICH HAS A price)`.
+- `FIND Guitar WHICH (REFERENCES Manufacturer) AND (WHICH HAS A price)`.
+
+For better readability, the above query can be written as:
+- `FIND Guitar WHICH (REFERENCES Manufacturer AND HAS A price)`.
+Note, that without syntactic sugar this query looks like:
+- `FIND Guitar WHICH (REFERENCES Manufacturer AND price)`.
 
 * `FIND ename1 WHICH HAS A pname1=val1 AND DOESN'T HAVE A pname2<val2 AND ((WHICH HAS A pname3=val3 AND A pname4=val4) OR DOES NOT HAVE A (pname5=val5 AND pname6=val6))`
 * `FIND ename1 . pname1=val1 & !pname2<val2 & ((pname3=val3 & pname4=val4) | !(pname5=val5 & pname6=val6))`
@@ -347,7 +467,7 @@ Any result set can be filtered by logically combining POV filters or back refere
 *  NOT:: The logical negation. Equivalent expressions: `NOT, DOESN'T HAVE A PROPERTY, DOES NOT HAVE A PROPERTY, DOESN'T HAVE A, DOES NOT HAVE A, DOES NOT, DOESN'T, IS NOT, ISN'T, !`
 *  OR:: The logical _or_. Equivalent expressions: `OR, |`
 *  RECORD,RECORDTYPE,FILE,PROPERTY:: Role expression for restricting the result set to a specific role.
-*  WHICH:: The marker for the beginning of the filters. Equivalent expressions: `WHICH, WHICH HAS A, WHICH HAS A PROPERTY, WHERE, WITH, .`
+*  WHICH:: The marker for the beginning of the filters. Equivalent expressions: `WHICH, WHICH HAS A, WHICH HAS A PROPERTY, WHERE, WITH (A), .`
 *  REFERENCE:: This one is tricky: `REFERENCE TO` expresses a the state of _having_ a reference property. `REFERENCED BY` expresses the state of _being_ referenced by another entity.
 *  COUNT:: `COUNT` works like `FIND` but doesn't return the entities.
 
@@ -356,7 +476,7 @@ Any result set can be filtered by logically combining POV filters or back refere
 
 In contrast to `FIND` queries, which always return the complete entity, there are `SELECT` queries which only return the entity with only those properties which are specified in the query. The syntax is very similar to `FIND` queries - just replace the `FIND` by `SELECT <comma separated list of selectors> FROM`:
 
-`SELECT p1, p2, p3 FROM Record ename`
+`SELECT p1, p2, p3 FROM ename`
 
 However, the `SELECT` query can also return properties of referenced entities and thereby are a means of joining entities together and return a custom view or projection:
 
@@ -391,14 +511,22 @@ Since Caosdb 0.2 entities are optionally version controlled. The query language
 * The `ANY VERSION OF` modifier currently the only expression for taking the versioning into account when using the query language.
 * Subproperties are not supported yet, e.g. `FIND ANY VERSION OF ENTITY WHICH IS REFERENCED BY ename WITH ...`. This applies to all cases where you specify properties of *referenced* entities or *referencing* entities.
 
-### Future
+## Configuration
 
-* Add `(LATEST|LAST|OLDEST|NEWEST|FIRST) VERSION OF` modifiers.
-* Add `(ANY|LATEST|LAST|OLDEST|NEWEST|FIRST) VERSION (BEFORE|AFTER) (<timestamp>|<transaction id>|<entity@version>) OF` modifier.
-* Add support for subproperties, e.g. `FIND ANY VERSION OF ENTITY WHICH IS REFERENCED BY ename WITH ...`.
+In CaosDB Server implementations before version 0.9.0, the `FIND ename` query
+would return any entity with that name and all children, regardless of the
+entity's role. Basically, `FIND ename` *was* equivalent to `FIND ENTITY ename`.
+Since 0.9.0 the default behavior has changed and now `FIND ename` is equivalent
+to `FIND RECORD ename`. This default is, however, configurable via the
+`FIND_QUERY_DEFAULT_ROLE` server property. See [Server Configuration](./administration/configuration).
 
 ## Future
 
- * *Sub Queries* (or *Sub Properties*): `FIND ename WHICH HAS A pname WHICH HAS A subpname=val`. This is like: `FIND AN experiment WHICH HAS A camera WHICH HAS A 'serial number'= 1234567890`
- * *More Logic*, especially `ANY`, `ALL`, `NONE`, and `SUCH THAT` key words (and equivalents) for logical quantisation: `FIND ename1 SUCH THAT ALL ename2 WHICH HAVE A REFERENCE TO ename1 HAVE A pname=val`. This is like `FIND experiment SUCH THAT ALL person WHICH ARE REFERENCED BY THIS experiment AS conductor HAVE AN 'academic title'=professor.`
- 
+* Additional versioning queries:
+  * Add `(LATEST|LAST|OLDEST|NEWEST|FIRST) VERSION OF` modifiers.
+  * Add `(ANY|LATEST|LAST|OLDEST|NEWEST|FIRST) VERSION (BEFORE|AFTER) (<timestamp>|<transaction
+    id>|<entity@version>) OF` modifier.
+  * Add support for subproperties, e.g. `FIND ANY VERSION OF ENTITY WHICH IS REFERENCED BY ename
+    WITH ...`.
+  * Find deleted entities: `FIND ename WHICH WAS DELETED (BY ME | ON 2014-12-24)`
+* *More Logic*, especially `ANY`, `ALL`, `NONE`, and `SUCH THAT` key words (and equivalents) for logical quantisation: `FIND ename1 SUCH THAT ALL ename2 WHICH HAVE A REFERENCE TO ename1 HAVE A pname=val`. This is like `FIND experiment SUCH THAT ALL person WHICH ARE REFERENCED BY THIS experiment AS conductor HAVE AN 'academic title'=professor.`
diff --git a/src/doc/Data-Model.md b/src/doc/Data-Model.md
index d11a88f67141e366a28ed84895903df7ff062822..b471b8241301644b7484376a6e87f72c7f04d3bb 100644
--- a/src/doc/Data-Model.md
+++ b/src/doc/Data-Model.md
@@ -15,11 +15,10 @@ contain information about the Record. The following is a more detailed
 explanation (also see this
 [paper](https://www.mdpi.com/2306-5729/4/2/83)).
 
-> Record Types and Abstract Properties are used to define the ontology
-> for a particular domain in which the RDMS is used. Records are used
-> to store the actual data and therefore represent individuals or
-> particular things, e.g. a particular experiment, a particular time
-> series, etc.
+> Record Types and Abstract Properties are used to define the ontology for a particular domain in
+> which the RDMS (research data management) is used. Records are used to store the actual data and
+> therefore represent individuals or particular things, e.g. a particular experiment, a particular
+> time series, etc.
 
 ## Record Types
 
diff --git a/src/doc/FAQ.rst b/src/doc/FAQ.rst
new file mode 100644
index 0000000000000000000000000000000000000000..54bfb296fa96e645034504e94368b34e76448b75
--- /dev/null
+++ b/src/doc/FAQ.rst
@@ -0,0 +1,57 @@
+====
+FAQs
+====
+
+These FAQs (frequently asked questions) can be extended, if *you* help us.  Please `submit an issue
+<https://gitlab.com/caosdb/caosdb-server/issues/new>`__ if you have a question that should be
+answered here.
+
+.. contents:: Select your question:
+   :local:
+
+How do I declare a LIST property?
+=================================
+
+Use the datatype parameter (available with Property constructors and
+with the ``add_property`` method and the ``LIST`` function.
+
+.. code:: python
+
+   # with constructor
+   p = caosdb.Property(name="ListOfDoubles", datatype=caosdb.LIST(caosdb.DOUBLE))
+
+   # with add_property method
+   my_entity.add_property(name="ListOfIntegers", datatype=caosdb.LIST(caosdb.INTEGER))
+   my_entity.add_property(name="ListOfThings", datatype=caosdb.LIST("Thing"))
+   my_entity.add_property(name="ListOfThings", datatype=caosdb.LIST(caosdb.RecordType('Thing'))
+
+Which data types are there?
+===========================
+
+There are 7 basic data types:
+
+-  ``INTEGER``
+-  ``DOUBLE``
+-  ``DATETIME``
+-  ``TEXT``
+-  ``BOOLEAN``
+-  ``FILE``
+-  ``REFERENCE``
+
+There is (so far) 1 data type for collections:
+
+-  ``LIST`` (Actually, LIST-of-another-data-type, e.g. ``LIST(INTEGER)``)
+
+And furthermore,…
+
+-  Any RecordType can be used as a ``REFERENCE`` data type with a
+   limited scope. That is, a property
+
+   .. code:: python
+
+      p = caosdb.Property(name="Conductor", datatype="Person")
+
+   will only accept those Entities as value which have a “Person”
+   RecordType as a direct or indirect parent.
+
+See also: :any:`Datatype<specification/Datatype>`.
diff --git a/src/doc/conf.py b/src/doc/conf.py
index b0c958c03bbb23b9642a36f91a4d62cbe373f6e6..3c062b94cff76b69ac234ab7512a02c0b6d27247 100644
--- a/src/doc/conf.py
+++ b/src/doc/conf.py
@@ -17,17 +17,18 @@
 # sys.path.insert(0, os.path.abspath('../caosdb'))
 
 import sphinx_rtd_theme
+from os.path import dirname, abspath
 
 # -- Project information -----------------------------------------------------
 
 project = 'caosdb-server'
-copyright = '2022, IndiScale GmbH'
+copyright = '2023, IndiScale GmbH'
 author = 'Daniel Hornung, Timm Fitschen'
 
 # The short X.Y version
-version = '0.9.0'
+version = '0.10.0'
 # The full version, including alpha/beta/rc tags
-release = '0.9.0'
+release = '0.10.0'
 
 
 # -- General configuration ---------------------------------------------------
@@ -48,6 +49,7 @@ extensions = [
     "sphinx.ext.autosectionlabel",  # Allow reference sections using its title
     "sphinx_rtd_theme",
     "sphinxcontrib.plantuml",  # PlantUML diagrams
+    "sphinx_a4doc",            # antlr4
 ]
 
 # Add any paths that contain templates here, relative to this directory.
@@ -223,3 +225,7 @@ autodoc_default_options = {
 # -- Options for autosectionlabel --------------------------------------------
 
 autosectionlabel_prefix_document = True
+
+# -- Options for sphinx_a4doc ------------------------------------------------
+
+a4_base_path = abspath(dirname(__file__) + '/../main/java/org/caosdb/server/query')
diff --git a/src/doc/development/benchmarking.md b/src/doc/development/benchmarking.md
deleted file mode 100644
index 0be781453a6f85577dd95f89844fd95f2b4141ba..0000000000000000000000000000000000000000
--- a/src/doc/development/benchmarking.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# Benchmarking CaosDB #
-
-Please refer to the file `doc/devel/Benchmarking.md` in the CaosDB sources for developer resources
-how to do benchmarking and profiling of CaosDB.
diff --git a/src/doc/development/benchmarking.rst b/src/doc/development/benchmarking.rst
new file mode 100644
index 0000000000000000000000000000000000000000..60d36d125b3749cff3538f837c8bd4f299233602
--- /dev/null
+++ b/src/doc/development/benchmarking.rst
@@ -0,0 +1,422 @@
+Benchmarking CaosDB
+===================
+
+Benchmarking CaosDB may encompass several distinct areas: How much time
+is spent in the server’s Java code, how much time is spent inside the
+SQL backend, are the same costly methods called more than once? This
+documentation tries to answer some questions connected with these
+benchmarking aspects and give you the tools to answer your own
+questions.
+
+Before you start
+----------------
+
+In order to obtain meaningful results, you should disable caching.
+
+MariaDB
+~~~~~~~
+
+Set the corresponding variable to 0: ``SET GLOBAL query_cache_type = 0;``
+
+Java Server
+~~~~~~~~~~~
+
+In the config:
+
+.. code:: cfg
+
+   CACHE_DISABLE=true
+
+Tools for the benchmarking
+--------------------------
+
+For averaging over many runs of comparable requests and for putting the
+database into a representative state, Python scripts are used. The
+scripts can be found in the ``caosdb-dev-tools`` repository, located at
+https://gitlab.indiscale.com/caosdb/src/caosdb-dev-tools in the folder
+``benchmarking``:
+
+Python Script ``fill_database.py``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This commandline script is meant for filling the database with enough
+data to represeny an actual real-life case, it can easily create
+hundreds of thousands of Entities.
+
+The script inserts predefined amounts of randomized Entities into the
+database, RecordTypes, Properties and Records. Each Record has a random
+(but with defined average) number of Properties, some of which may be
+references to other Records which have been inserted before. Actual
+insertion of the Entities into CaosDB is done in chunks of a defined
+size.
+
+Users can tell the script to store times needed for the insertion of
+each chunk into a tsv file.
+
+Python Script ``measure_execution_time.py``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A somewhat outdated script which executes a given query a number of
+times and then save statistics about the ``TransactionBenchmark``
+readings (see below for more information about the transaction
+benchmarks) delivered by the server.
+
+Python Script ``sql_routine_measurement.py``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Simply call ``./sql_routine_measurement.py`` in the scripts directory.
+An sql file is automatically executed which enables the correct
+``performance_schema`` tables. However, the performance_schema of
+mariadb needs to be enabled. Add ``performance_schema=ON`` to the
+configuration file of mariadb as it needs to be enabled on start up.
+This script expects the MariaDB server to be accessible on 127.0.0.1
+with the default caosdb user and password (caosdb;random1234).
+
+You might consider to increase
+``performance_schema_events_transactions_history_long_size``.
+
+::
+
+   performance_schema_events_transactions_history_long_size=1000000
+
+The performance schema must be enabled (see below).
+
+MariaDB General Query Log
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+MariaDB and MySQL have a feature to enable the logging of SQL queries’
+times. This logging must be turned on on the SQL server as described in
+the `upstream
+documentation <https://mariadb.com/kb/en/general-query-log/>`__: Add to
+the mysql configuration:
+
+::
+
+   log_output=TABLE
+   general_log
+
+or calling
+
+.. code:: sql
+
+   SET GLOBAL log_output = 'TABLE';
+   SET GLOBAL general_log = 'ON';
+
+In the Docker environment LinkAhead, this can conveniently be done with
+``linkahead mysqllog {on,off,store}``.
+
+MariaDB Slow Query Log
+~~~~~~~~~~~~~~~~~~~~~~
+
+See `slow query log
+docs <https://mariadb.com/kb/en/slow-query-log-overview/>`__
+
+MariaDB Performance Schema
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The most detailed information on execution times can be acquired using
+the performance schema.
+
+To use it, the ``performance_schema`` setting in the MariaDB server must
+be
+enabled(`docs <https://mariadb.com/kb/en/performance-schema-overview/#enabling-the-performance-schema>`__,
+for example by setting this in the config files:
+
+::
+
+   [mysqld]
+
+   performance_schema=ON
+
+The performance schema provides many different tables in the
+``performance_schema``. You can instruct MariaDB to create those tables
+by setting the appropriate ``instrument`` and ``consumer`` variables.
+E.g.
+
+.. code:: sql
+
+   update performance_schema.setup_instruments set enabled='YES', timed='YES' WHERE NAME LIKE '%statement%';
+   update performance_schema.setup_consumers set enabled='YES' WHERE NAME LIKE '%statement%';
+
+This can also be done via the configuration.
+
+::
+
+   [mysqld]
+
+   performance_schema=ON
+   performance-schema-instrument='statement/%=ON'
+   performance-schema-consumer-events-statements-history=ON                        
+   performance-schema-consumer-events-statements-history-long=ON
+
+You may want to look at the result of the following commands:
+
+.. code:: sql
+
+
+   select * from performance_schema.setup_consumers;
+   select * from performance_schema.setup_instruments;
+
+Note, that the ``base_settings.sql`` enables appropriate instruments and
+consumers.
+
+Before you start a measurement, you will want to empty the tables. E.g.:
+
+.. code:: sql
+
+   truncate table  performance_schema.events_statements_history_long ;
+
+The procedure ``reset_stats`` in ``base_settings.sql`` clears the
+typically used ones.
+
+The tables contain many columns. An example to get an informative view
+is
+
+.. code:: sql
+
+   select left(sql_text,50), left(digest_text,50), ms(timer_wait) from performance_schema.events_statements_history_long order by ms(timer_wait);
+
+where the function ``ms`` is defined in ``base_settings.sql``. Or a very
+useful one:
+
+.. code:: sql
+
+   select  left(digest_text,100) as digest,ms(sum_timer_wait) as time_ms, count_star from performance_schema.events_statements_summary_by_digest order by time_ms;
+
+Useful SQL configuration with docker
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In order to allow easy testing and debugging the following is useful
+when using docker. Change the docker-compose file to include the
+following for the mariadb service:
+
+::
+
+       networks:
+         # available on port 3306, host name 'sqldb'
+         - caosnet
+       ports:
+         - 3306:3306
+
+Check it with ``mysql -ucaosdb -prandom1234 -h127.0.0.1 caosdb`` Add the
+appropriate changes (e.g. ``performance_schema=ON``) to
+``profiles/empty/custom/mariadb.conf.d/mariadb.cnf`` (or in the profile
+folder that you use).
+
+Manual Java-side benchmarking
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Benchmarking can be done using the ``TransactionBenchmark`` class (in
+package ``org.caosdb.server.database.misc``).
+
+-  Single timings can be added to instances of that class via the
+   ``addBenchmark(object, time)`` method. Multiple benchmarks for the
+   same object (typically just strings) can be averaged.
+-  Benchmarks can be serialized into XML, ``Container`` and ``Query``
+   objects already use this with their included benchmarks to output
+   benchmarking results.
+-  To work with the benchmarks of often used objects, use these methods:
+
+   -  ``Container.getTransactionBenchmark().addBenchmark()``
+   -  ``Query.addBenchmark()``
+
+To enable transaction benchmarks and disable caching in the server, set
+these server settings:
+
+.. code:: cfg
+
+   TRANSACTION_BENCHMARK_ENABLED=true
+   CACHE_DISABLE=true
+
+Additionally, the server should be started via ``make run-debug``
+(instead of ``make run-single``), otherwise the benchmarking will not be
+active.
+
+Notable benchmarks and where to find them
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
++----------------------+---------------------------+------------------+
+| Name                 | Where measured            | What measured    |
++======================+===========================+==================+
+| ``Retrieve.init``    | transac                   | transaction/     |
+|                      | tion/Transaction.java#135 | Retrieve.java#48 |
++----------------------+---------------------------+------------------+
+| ``Re                 | transac                   | transaction/R    |
+| trieve.transaction`` | tion/Transaction.java#174 | etrieve.java#133 |
++----------------------+---------------------------+------------------+
+| ``Retriev            | transac                   | transaction/     |
+| e.post_transaction`` | tion/Transaction.java#182 | Retrieve.java#77 |
++----------------------+---------------------------+------------------+
+| ``EntityResource.h   | resource/transactio       | all except XML   |
+| ttpGetInChildClass`` | n/EntityResource.java#118 | generation       |
++----------------------+---------------------------+------------------+
+| ``ExecuteQuery``     | ?                         | ?                |
++----------------------+---------------------------+------------------+
+|                      |                           |                  |
++----------------------+---------------------------+------------------+
+
+External JVM profilers
+~~~~~~~~~~~~~~~~~~~~~~
+
+Additionally to the transaction benchmarks, it is possible to benchmark
+the server execution via external Java profilers. For example,
+`VisualVM <https://visualvm.github.io/>`__ can connect to JVMs running
+locally or remotely (e.g. in a Docker container). To enable this in
+LinkAhead’s Docker environment, set
+
+.. code:: yaml
+
+   devel:
+     profiler: true
+
+Alternatively, start the server (without docker) with the
+``run-debug-single`` make target, it will expose the JMX interface, by
+default on port 9090.
+
+Most profilers, like as VisualVM, only gather cumulative data for call
+trees, they do not provide complete call graphs (as
+callgrind/kcachegrind would do). They also do not differentiate between
+calls with different query strings, as long as the Java process flow is
+the same (for example, ``FIND Record 1234`` and
+``FIND Record A WHICH HAS A Property B WHICH HAS A Property C>100``
+would be handled equally).
+
+Example settings for VisualVM
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In the sampler settings, you may want to add these expressions to the
+blocked packages: ``org.restlet.**, com.mysql.**``. Branches on the call
+tree which are entirely inside the blacklist, will become leaves.
+Alternatively, specify a whitelist, for example with
+``org.caosdb.server.database.backend.implementation.**``, if you only
+want to see the time spent for certain MySQL calls.
+
+How to set up a representative database
+---------------------------------------
+
+For reproducible results, it makes sense to start off with an empty
+database and fill it using the ``fill_database.py`` script, for example
+like this:
+
+.. code:: sh
+
+   ./fill_database.py -t 500 -p 700 -r 10000 -s 100 --clean
+
+The ``--clean`` argument is not strictly necessary when the database was
+empty before, but it may make sense when there have been previous runs
+of the command. This example would create 500 RecordTypes, 700
+Properties and 10000 Records with randomized properties, everything is
+inserted in chunks of 100 Entities.
+
+How to measure request times
+----------------------------
+
+If the execution of the Java components is of interest, the VisualVM
+profiler should be started and connected to the server before any
+requests to the server are started.
+
+When doing performance tests which are used for detailed analysis, it is
+important that
+
+1. CaosDB is in a reproducible state, which should be documented
+2. all measurements are repeated several times to account for inevitable
+   variance in access (for example file system caching, network
+   variablity etc.)
+
+Filling the database
+~~~~~~~~~~~~~~~~~~~~
+
+By simply adding the option ``-T logfile.tsv`` to the
+``fill_database.py`` command above, the times for inserting the records
+are stored in a tsv file and can be analyzed later.
+
+Obtain statistics about a query
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To repeat single queries a number of times,
+``measure_execution_time.py`` can be used, for example:
+
+.. code:: sh
+
+   ./measure_execution_time.py -n 120 -q "FIND MusicalInstrument WHICH IS REFERENCED BY Analysis"
+
+This command executes the query 120 times, additional arguments could
+even plot the TransactionBenchmark results directly.
+
+On method calling order and benchmarked events
+----------------------------------------------
+
+-  ``Transaction.execute()`` :: Logs benchmarks for events like:
+
+   -  ``INIT`` :: The transaction’s ``init()`` method.
+   -  ``PRE_CHECK``
+   -  ``CHECK``
+   -  ``POST_CHECK``
+   -  ``PRE_TRANSACTION``
+   -  ``TRANSACTION`` -> typically calls
+      ``database.backend.transaction.[BackendTransaction].execute()``,
+      which in turn calls, some levels deeper,
+      ``backend.transaction.....execute(<k extends   BackendTransaction> t)``
+      -> see next point
+   -  …
+
+-  ``backend.transaction.[...].execute(transaction)`` :: This method is
+   benchmarked again (via parent class ``BackendTransaction``), this is
+   probably the deepest level of benchmarking currently (Benchmark is
+   logged as e.g. ``<RetrieveFullEntity>...</>``). It finally calls
+   ``[MySQLTransaction].execute()``.
+-  ``[MySQLTransaction].execute()`` :: This is the deepest backend
+   implementation part, it typically creates a prepared statement and
+   executes it.
+-  Currently not benchmarked separately:
+
+   -  Getting the actual implementation (probably fast?)
+   -  Preparing the SQL statement
+   -  Executing the SQL statement
+   -  Java-side caching
+
+What is measured
+----------------
+
+For a consistent interpretation, the exact definitions of the measured
+times are as follows:
+
+SQL logs
+~~~~~~~~
+
+As per https://mariadb.com/kb/en/general-query-log, the logs store only
+the time at which the SQL server received a query, not the duration of
+the query.
+
+Possible future enhancements
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+-  The ``query_response_time`` plugin may be additionally used in the
+   future, see https://mariadb.com/kb/en/query-response-time-plugin
+
+Transaction benchmarks
+~~~~~~~~~~~~~~~~~~~~~~
+
+Transaction benchmarking manually collects timing information for each
+transaction. At defined points, different measurements can be made,
+accumulated and will finally be returned to the client. Benchmark
+objects may consist of sub benchmarks and have a number of measurement
+objects, which contain the actual statistics.
+
+Because transaction benchmarks must be manually added to the server
+code, they only monitor those code paths where they are added. On the
+other hand, their manual nature allows for a more abstracted analysis of
+performance bottlenecks.
+
+Java profiler
+~~~~~~~~~~~~~
+
+VisualVM records for each thread the call tree, specifically which
+methods were called how often and how much time was spent inside these
+methods.
+
+Global requests
+~~~~~~~~~~~~~~~
+
+Python scripts may measure the global time needed for the execution of
+each request. ``fill_database.py`` obtains its numbers this way.
diff --git a/src/doc/development/devel.rst b/src/doc/development/devel.rst
index 141b045594fe6f8a58c86f758734e160e5a8c2fe..cf0ba37e75c967b755bc2951e803110b15f23baf 100644
--- a/src/doc/development/devel.rst
+++ b/src/doc/development/devel.rst
@@ -6,6 +6,8 @@ Developing CaosDB
    :maxdepth: 2
 
    Structure of the Java code <structure>
+   Testing the server code <testing>
+   Logging server output <logging>
    Benchmarking CaosDB <benchmarking>
 
 CaosDB is an Open-Source project, so anyone may modify the source as they like. These pages aim to
diff --git a/src/doc/development/logging.rst b/src/doc/development/logging.rst
new file mode 100644
index 0000000000000000000000000000000000000000..1b0a94935a0c701fd9d8ba28a604f11b357d1a89
--- /dev/null
+++ b/src/doc/development/logging.rst
@@ -0,0 +1,126 @@
+Logging
+=======
+
+Framework
+---------
+
+We use the SLF4J API with a log4j2 backend for all of our Code. Please
+do not use log4j2 directly or any other logging API.
+
+Note that some libraries on the classpath use the ``java.util.logging``
+API and log4j1 logging framework instead. These loggers cannot be
+configurated with the help of this README by now.
+
+Configuration
+-------------
+
+The configuration of the log4j2 backend is done via ``properties`` files which comply with the
+`log4j2 specifications
+<https://logging.apache.org/log4j/2.x/manual/configuration.html#Properties>`__.
+XML, YAML, or JSON files are not supported. The usual mechanisms for
+automatic configuration with such files is disabled. Instead, files have
+to be placed into the ``conf`` subdirs, as follows:
+
+Default and Debug Logging
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The default configuration is located at
+``conf/core/log4j2-default.properties``. For the debug mode, the
+configuration from ``conf/core/log4j2-debug.properties`` is merged with
+the default configuration. These files should not be changed by the
+user.
+
+User Defined Logging
+~~~~~~~~~~~~~~~~~~~~
+
+The default and debug configuration can be overridden by the user with
+``conf/ext/log4j2.properties`` and any file in the directory
+``conf/ext/log4j2.properties.d/`` which is suffixed by ``.properties``.
+All logging configuration files are merged using the standard merge
+strategy of log4:
+
+   .. rubric:: Composite Configuration
+      :name: composite-configuration
+
+   Log4j allows multiple configuration files to be used by specifying
+   them as a list of comma separated file paths on
+   log4j.configurationFile. The merge logic can be controlled by
+   specifying a class that implements the MergeStrategy interface on the
+   log4j.mergeStrategy property. The default merge strategy will merge
+   the files using the following rules:
+
+   1. The global configuration attributes are aggregated with those in later configurations
+      replacing those in previous configurations, with the exception that the highest status level
+      and the lowest monitorInterval greater than 0 will be used.
+   
+   2. Properties from all configurations are aggregated.  Duplicate properties replace those in
+      previous configurations.
+
+   3. Filters are aggregated under a CompositeFilter if more than one Filter is defined. Since
+      Filters are not named duplicates may be present.
+
+   4. Scripts and ScriptFile references are aggregated.  Duplicate definiations replace those in
+      previous configurations.
+
+   5. Appenders are aggregated. Appenders with the same name are replaced by those in later
+      configurations, including all of the Appender’s subcomponents.
+
+   6. Loggers are all aggregated. Logger attributes are individually merged with duplicates being
+      replaced by those in later configurations. Appender references on a Logger are aggregated with
+      duplicates being replaced by those in later configurations. Filters on a Logger are aggregated
+      under a CompositeFilter if more than one Filter is defined. Since Filters are not named
+      duplicates may be present. Filters under Appender references included or discarded depending
+      on whether their parent Appender reference is kept or discarded.
+
+`Source <https://logging.apache.org/log4j/2.x/manual/configuration.html#CompositeConfiguration>`__
+
+Some Details and Examples
+-------------------------
+
+Make Verbose
+~~~~~~~~~~~~
+
+To make the server logs on the console more verbose, insert
+``rootLogger.level = DEBUG`` or even ``rootLogger.level = TRACE`` into a
+properties file in the ``conf/ext/log4j2.properties.d/`` directory or
+the ``conf/ext/log4j2.properties`` file.
+
+Log Directory
+~~~~~~~~~~~~~
+
+By default, log files go to ``./log/``,
+e.g. ``./log/request_errors/current.log``. The log directory in
+``DEBUG_MODE`` is located at ``./testlog/``.
+
+To change that, insert ``property.LOG_DIR = /path/to/my/logs`` into a
+properties file in the ``conf/ext/log4j2.properties.d/`` directory or
+the ``conf/ext/log4j2.properties`` file
+
+Special loggers
+~~~~~~~~~~~~~~~
+
+-  ``REQUEST_ERRORS_LOGGER`` for logging server errors with SRID, full
+   request and full response. WARNING: This logger stores unencrypted
+   content of request with possibly confidential content.
+-  ``REQUEST_TIME_LOGGER`` for timing the requests.
+
+These loggers are defined in the ``conf/core/log4j2-default.properties``
+file.
+
+Enable Request Time Logger
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``REQUEST_TIME_LOGGER`` is disabled by default, its log level is set
+to ``OFF``. To enable it and write logs to the directory denoted by
+``property.LOG_DIR``, create a ``properties`` file under
+``conf/ext/log4j2.properties.d/`` which contains at least
+
+.. code:: properties
+
+   property.REQUEST_TIME_LOGGER_LEVEL = TRACE
+
+debug.log
+~~~~~~~~~
+
+When in ``DEBUG_MODE``, e.g. when started with ``make run-debug``, the
+server also writes all logs to ``debug.log`` in the log directory.
diff --git a/src/doc/development/testing.rst b/src/doc/development/testing.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2587695d67684d132e942b8eb4f25cd1038c9907
--- /dev/null
+++ b/src/doc/development/testing.rst
@@ -0,0 +1,22 @@
+Testing the server code
+-----------------------
+
+Whether developing new features, refacturing code or fixing bugs, the server
+code should be thoroughly tested for correct and incorrect behvaiour, on correct
+and incorrect input.
+
+Writing tests
+~~~~~~~~~~~~~
+
+Tests go into ``src/test/java/caosdb/``, the files there can serve as examples for
+writing tests.
+
+Running tests with Maven
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Automatic testing can be done with ``make test`` or, after compilation, ``mvn test``.
+- Tests of single modules can be started with ``mvn test -Dtest=TestClass``.
+- Test of a single method ``footest``: ``mvn test -Dtest=TestClass#footest``
+
+
+
diff --git a/src/doc/index.rst b/src/doc/index.rst
index b5ce9f3235277b613b357dca5dfc3334d80aeb3f..e34afd382f0c4a1a5520b94a4fc00e1c0a67427b 100644
--- a/src/doc/index.rst
+++ b/src/doc/index.rst
@@ -11,6 +11,7 @@ Welcome to caosdb-server's documentation!
    Getting started <README_SETUP>
    Concepts <concepts>
    tutorials
+   FAQ
    Query Language <CaosDB-Query-Language>
    administration
    Development <development/devel>
@@ -18,7 +19,7 @@ Welcome to caosdb-server's documentation!
    Changelog <CHANGELOG>
    specification/index.rst
    Glossary
-   API documentation<_apidoc/packages>
+   Server Internals<_apidoc/packages>
 
 Welcome to the CaosDB, the flexible semantic data management toolkit!
 
diff --git a/src/doc/permissions.rst b/src/doc/permissions.rst
index 6b07f48fa469e81069b2f01559957fb76ef27f5a..3d9c5ed7c26349ca0a20dec4e89b8889d4e10bf1 100644
--- a/src/doc/permissions.rst
+++ b/src/doc/permissions.rst
@@ -124,8 +124,8 @@ How to set permissions
 ----------------------
 
 There are multiple ways to set role and entity permissions. The most
-common and best tested way currently is to set global default entity permissions
-in the ``global_entity_permissions.xml`` config file, and role-based role
+common and best tested way currently is to set global default *entity* permissions
+in the ``global_entity_permissions.xml`` config file, and role-based *role*
 permissions with the ``caosdb_admin.py`` `utility script
 <https://gitlab.com/caosdb/caosdb-pylib/-/blob/main/src/caosdb/utils/caosdb_admin.py>`__
 of CaosDB's Python library which is also used to `manage users and
@@ -138,8 +138,8 @@ find a more detailed description of the possible ways of setting permissions.
    you can set the default permissions that every entity on the server has. The
    global default permissions can **only** be set in this file; all other ways
    below can only change the permissions of individual entities. Note that you
-   can add more rules but you can never remove rules set in the
-   ``global_entity_permissions.xml``. Thus, it might not be possible to overrule
+   can add more rules in the ``global_entity_permissions.xml``, but you can not remove rules by
+   writing to this file. Thus, it might not be possible to overrule
    permissions defined here (see :ref:`Permission
    calculation<Calculation>`). Note also that, as the name suggests, only
    :ref:`entity permissions<entity-permissions>` can be set this way. The
diff --git a/src/doc/query-syntax.rst b/src/doc/query-syntax.rst
new file mode 100644
index 0000000000000000000000000000000000000000..00df440fb9cf2a175e371c3038b164643d89a84a
--- /dev/null
+++ b/src/doc/query-syntax.rst
@@ -0,0 +1,15 @@
+CaosDB Query Language Syntax
+============================
+
+This is the documentation of the CaosDB Query Language Syntax. The
+authoritative specification of the syntax is the ANTLR4 grammar you can find in
+the source code:
+`CQLParser.g4 <https://gitlab.com/caosdb/caosdb-server/-/blob/main/src/main/java/org/caosdb/server/query/CQLParser.g4>`__
+and
+`CQLLexer.g4 <https://https://gitlab.com/caosdb/caosdb-server/-/blob/main/src/main/java/org/caosdb/server/query/CQLLexer.g4>`__
+
+See examples in :doc:`Query Language<CaosDB-Query-Language>`.
+
+.. a4:autogrammar:: CQLParser.g4
+
+.. a4:autogrammar:: CQLLexer.g4
diff --git a/src/doc/specification/AbstractProperty.md b/src/doc/specification/AbstractProperty.md
index 3a2fe7583480c7467bccb0a2bf94850ea30d7be4..062ef205e048aef4142c683c9c4c1820fd89fe36 100644
--- a/src/doc/specification/AbstractProperty.md
+++ b/src/doc/specification/AbstractProperty.md
@@ -1,11 +1,12 @@
-# Note #
+# AbstractProperty Specification
 
->   This document has not been updated for a long time. Although it is concerned with the mostly
->   stable API, its content may no longer reflect the actual CaosDB behavior.
+**Warning:** This specification is outdated. It is included to serve as a starting point for a more
+up-to-date description of the `Property` entity.
 
-# AbstractProperty Specification
+## Note ##
 
-**Warning:** This specification is outdated. It is included to serve as a starting point for a more up-to-date description of the `Property` entity.
+>   This document has not been updated for a long time. Although it is concerned with the mostly
+>   stable API, its content may no longer reflect the actual CaosDB behavior.
 
 ## Introduction
 An `AbstractProperty` is one of the basal objects of CaosDB.
diff --git a/src/doc/specification/Authentication.rst b/src/doc/specification/Authentication.rst
index 93d68c20171e55dad663ece719a78008793a4191..3fcd25dad0d7fb9e591e1d4a2d845b3d353fff8b 100644
--- a/src/doc/specification/Authentication.rst
+++ b/src/doc/specification/Authentication.rst
@@ -1,98 +1,48 @@
+==============
 Authentication
 ==============
 
-Some features of CaosDB are available to registered users only. Making any
-changes to the data stock via HTTP requires authentication by ``username`` **plus**
-``password``. They are to be send as a HTTP header, while the password is to be
-hashed by the sha512 algorithm:
-
-============= ======================
-username:     password:
-============= ======================
-``$username`` ``$SHA512ed_password``
-============= ======================
+Some features of CaosDB are available to registered users only. Making any changes to the data stock
+via HTTP requires authentication.
 
 Sessions
---------
+========
 
 Login
-^^^^^
-
-Request Challenge
-^^^^^^^^^^^^^^^^^
-
-* ``GET http://host:port/mpidsserver/login?username=$username``
-* ``GET http://host:port/mpidsserver/login`` with ``username`` header
-
-**No password is required to be sent over http.**
-
-The request returns an AuthToken with a login challenge as a cookie.
-The AuthToken is a dictionary of the following form:
-
-.. code-block::
-
-   {scope=$scope;
-    mode=LOGIN;
-    offerer=$offerer;
-    auth=$auth
-    expires=$expires;
-    date=$date;
-    hash=$hash;
-    session=$session;
-   }
-
-where
-
-* ``$scope`` :: A uri pattern string. Example: ``{ **/* }``
-* ``$mode`` :: ``ONETIME``, ``SESSION``, or ``LOGIN``
-* ``$offerer`` :: A valid username
-* ``$auth`` :: A valid username
-* ``$expires`` :: A ``YYYY-MM-DD HH:mm:ss[.nnnn]`` date string
-* ``$date`` :: A ``YYYY-MM-DD HH:mm:ss[.nnnn]`` date string
-* ``$hash`` :: A string
-* ``$session`` :: A string
-
-The challenge is solved by concatenating the ``$hash`` string and
-the user's ``$password`` string and calculating the sha512 hash of both.
-Pseudo code:
-
-.. code-block::
+-----
 
-   $solution = sha512($hash + sha512($password))
+Authentication is done by ``username`` and ``password``. They must be sent as form data with a POST
+request to the `/login/` resource:
 
-Send Solution
-^^^^^^^^^^^^^
+username:
+  The user name, for example ``admin`` (on demo.indiscale.com).
 
-The old ``$hash`` string in the cookie has to be replaces by ``$solution`` and
- the cookie is to be send with the next request:
+password:
+  The password, for example ``caosdb`` (on demo.indiscale.com).
 
-``PUT http://host:port/mpidsserver/login``
-
-The server will return the user's entity in the HTTP body, e.g.
+Logout
+------
 
-.. code-block::
+The server does not invalidate AuthTokens. They invalidate after they expire or
+when the server is being restartet. Client should just delete their AuthToken
+to 'logout'.
 
-   <Response ...>
-     <User name="$username" ...>
-      ...
-     </User>
-   </Response>
+However, in order to remove the AuthToken cookie from the browsers there is a
+convenient resource which will invalidate the cookie (not the AuthToken).
 
-and a new AuthToken with ``$mode=SESSION`` and a new expiration date and so
-on. This AuthToken cookie is to be send with every request.
+Send
 
-Logout
-^^^^^^
+``GET http://host:port/logout``
 
-Send
+and the server will return an empty AuthToken cookie which immediately expires.
 
-``PUT http://host:port/mpidsserver/logout``
+Example using ``curl``
+----------------------
 
-with a valid AuthToken cookie. No new AuthToken will be returned and no
-AuthToken with that ``$session`` will be accepted anymore.
+.. _curl-login:
 
-Commandline solution with ``curl``
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Login
+~~~~~
 
 To use curl for talking with the server, first save your password into a
 variable: ``PW=$(cat)``
@@ -102,10 +52,22 @@ password visible for a short time to everyone on your system:
 
 .. code-block:: sh
 
-   curl -X POST -c cookie.txt -D head.txt -H "Content-Type: application/x-www-form-urlencoded" -d username=<USERNAME> -d password="$PW" --insecure "https://<SERVER>/login
+   curl -X POST -c cookie.txt -D head.txt -d username=<USERNAME> -d password="$PW" --insecure "https://<SERVER>/login
+
+Now ``cookie.txt`` contains the required authentication token information in the ``SessionToken``
+cookie (url-encoded json).
+
+.. rubric:: Example token content
+
+.. code-block:: json
+
+   ["S","PAM","admin",[],[],1682509668825,3600000,"Z6J4B[...]-OQ","31d3a[...]ab2c10"]
+
+Using the token
+~~~~~~~~~~~~~~~
 
 To use the cookie, pass it on with later requests:
 
 .. code-block:: sh
 
-   curl -X GET -b cookie.txt --insecure "https://<SERVER>/Entity/12345"
+   curl -X GET -b cookie.txt --insecure "https://<SERVER>/Entity/123"
diff --git a/src/doc/specification/Datatype.md b/src/doc/specification/Datatype.md
index 6a169042dce2be2e6dc939d0935f3336de264308..6354d6f2cfdb5215d94836bfe263e2d013bd71a8 100644
--- a/src/doc/specification/Datatype.md
+++ b/src/doc/specification/Datatype.md
@@ -73,7 +73,7 @@ Please file a new feature request as soon as you need them.
 ----
 
 ## REFERENCE
-* Description: REFERENCE values store the [Valid ID](../Glossary#valid-id) of an existing entity. The are useful to establish links between two entities. 
+* Description: REFERENCE values store the [Valid ID](../Glossary.html#valid-id) of an existing entity. The are useful to establish links between two entities. 
 * Accepted Values: Any [Valid ID](./Glossary#valid-id) or [Valid Unique Existing Name](./Glossary#valid-unique-existing-name) or [Valid Unique Temporary ID](./Glossary#valid-unique-temporary-id) or [Valid Unique Prospective Name](./Glossary#valid-unique-prospective-pame).
 * Note:
   * After beeing processed successfully by the server the REFERENCE value is normalized to a [Valid ID](./Glossary#valid-id). I.e. it is guaranteed that a REFERENCE value of a valid property is a positive integer.
diff --git a/src/doc/specification/Specification-of-the-Message-API.md b/src/doc/specification/Message-API.md
similarity index 99%
rename from src/doc/specification/Specification-of-the-Message-API.md
rename to src/doc/specification/Message-API.md
index fc08b343f67ca8c052395cb0979b02ab455e98fa..7a5d137bd277d9dea69df9d90ce76869d1d404c1 100644
--- a/src/doc/specification/Specification-of-the-Message-API.md
+++ b/src/doc/specification/Message-API.md
@@ -1,4 +1,4 @@
-# Specification of the Message API
+# Message API
 ## Introduction
 
 API Version 0.1.0
diff --git a/src/doc/specification/Paging.md b/src/doc/specification/Paging.md
index fb994639204704618af2b1c7a8ccb32301013af3..229e9c3bc254de5dcbe4455f4fc59b7538f811de 100644
--- a/src/doc/specification/Paging.md
+++ b/src/doc/specification/Paging.md
@@ -12,14 +12,14 @@ The Paging flag splits the retrieval of a (possibly huge) number entities into p
 
 ## Semantics
 
-The `index` (starting with zero) denotes the index of the first entity to be retrieved. The `length` is the number of entities on that page. If `length` is omitted, the default number of entities is returned (as configured by a server contant called ...). If only the `name` is given the paging behaves as if the `index` has been zero.
+The `index` (starting with zero) denotes the index of the first entity to be retrieved. The `length` is the number of entities on that page. If `length` is omitted, the default number of entities is returned (as configured by a server constant called ...). If only the `name` is given the paging behaves as if the `index` has been zero.
 
 ## Examples
 
-`http://localhost:8123/mpidsserver/Entities/all?flags=P:24L50` returns 50 entities starting with the 25th entity which would be retrieved without paging.
+`http://localhost:10080/Entities/all?flags=P:24L50` returns 50 entities starting with the 25th entity which would be retrieved without paging.
 
-`http://localhost:8123/mpidsserver/Entities/all?flags=P:24` returns the default number of entities starting with the 25th entity which would be retrieved without paging.
+`http://localhost:10080/Entities/all?flags=P:24` returns the default number of entities starting with the 25th entity which would be retrieved without paging.
 
-`http://localhost:8123/mpidsserver/Entities/all?flags=P:L50` returns 50 entities starting with the first entity which would be retrieved without paging.
+`http://localhost:10080/Entities/all?flags=P:L50` returns 50 entities starting with the first entity which would be retrieved without paging.
 
-`http://localhost:8123/mpidsserver/Entities/all?flags=P` returns the default number of entities starting with the first entity which would be retrieved without paging.
+`http://localhost:10080/Entities/all?flags=P` returns the default number of entities starting with the first entity which would be retrieved without paging.
diff --git a/src/doc/specification/index.rst b/src/doc/specification/index.rst
index 69677277fc793d513aa21f506295567340d462e1..51b0e070d5198603877ed336b353177b03a6e9f8 100644
--- a/src/doc/specification/index.rst
+++ b/src/doc/specification/index.rst
@@ -1,10 +1,11 @@
-Specification
-=============
+Specifications
+==============
+
+Specifications of assorted topics
 
 .. toctree::
-   :maxdepth: 2
+   :maxdepth: 1
    :caption: Contents:
-   :hidden:
 
    AbstractProperty
    Fileserver
@@ -13,6 +14,7 @@ Specification
    Datatype
    Paging
    RecordType
+   Query syntax <../query-syntax>
    Server side scripting <Server-side-scripting>
-   Specification of the Message API <Specification-of-the-Message-API>
-   Specification of the Entity API <entity_api>
+   Message API <Message-API>
+   Entity API <entity_api>
diff --git a/src/doc/tutorials/data_model_tutorial.rst b/src/doc/tutorials/data_model_tutorial.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c1de9b08a38623751ec3d50a38ee001fbe8619d9
--- /dev/null
+++ b/src/doc/tutorials/data_model_tutorial.rst
@@ -0,0 +1,215 @@
+Data model tutorial
+===================
+
+Data models are a central concept of research data management. The
+open-source framework LinkAhead makes it easy to create an `agile
+data model <https://docs.indiscale.com/caosdb-server/Data-Model.html>`__
+which suits your needs, so you can profit from your collected data fast.
+
+.. contents::
+   :local:
+
+Frequently asked questions about data models
+--------------------------------------------
+
+What is a data model?
+~~~~~~~~~~~~~~~~~~~~~
+
+In LinkAhead, the `data model <https://docs.indiscale.com/caosdb-server/Data-Model.html>`__
+describes in a generic way how the data is structured. This document will help you understand this
+concept and how you can adjust the data model to your needs.
+
+Let’s give one example what we mean by the data model describing the
+data structure: In experimental research, the data model may say that
+each experiment has one or more experimenters and also some lab notes.
+
+.. figure:: img/very_simple_data_model.png
+   :alt: The simplest data model consists of just one RecordType
+
+   A very simple data model, consisting of only one RecordType
+
+The data model may also say that there are cell culture experiments,
+which *inherit* all properties of generic experiments, but in addition
+have the number of dishes, the time the cell cultures were started and a
+*reference* to the cell line that was used. When we talk about
+references, we mean that there are other data sets (in this case cell
+lines) which are not embedded directly, but only pointed at. For
+example, a number of cell culture experiments may reference the same
+cell line, and when someone adds a note to that cell line, this note
+will be available to all cell culture experiments.
+
+.. figure:: img/simple_data_model.png
+   :alt: The first data model extended by inheritance and references
+
+   A simple data model, with four RecordTypes
+
+In LinkAhead, the data model consists of *RecordTypes* and *Properties*. Each `*RecordType*
+<https://docs.indiscale.com/caosdb-server/Data-Model.html#record-types>`__ corresponds to one type
+of data set, for example an experiment, a cell culture experiment or a cell line. And each data set
+can have `*Properties* <https://docs.indiscale.com/caosdb-server/Data-Model.html#properties>`__
+which define it further: for example
+the number of dishes in a cell culture experiment, a publication
+describing a cell line or the cell line which was used for an
+experiment.
+
+And what about the data?
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+The data model describes the generic structure of the data, but what
+does this mean for your actual data? When you want to store data in
+LinkAhead, you typically look for a matching *RecordType* and
+then create *Record*\ s of that type. This means for example, that a
+*Record* of type “Cell Culture” should have the *Properties* that the
+*RecordType* provides: experimenters, lab notes, number of dishes, time
+of experiment start and the used cell lines.
+
+.. figure:: img/data_model_and_data.png
+   :alt: Records are always based upon (at least) one RecordType, this defines the relationship between data model and data
+
+   A diagram showing the relationship between RecordTypes (the data
+   model) and Records (the data)
+
+Following a data model greatly simplifies your scientific research data
+management, and this is what LinkAhead is for: You know that all
+(or most) of your cell culture experiments will have the same set of
+properties, so you can search for all experiments where the properties
+match your desired criteria, for example those with cell lines which
+were described in publications of a certain author.
+
+What if I need to change my data model?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Science moves fast, and your infrastructure should be able to follow
+just as swiftly. The data model in LinkAhead was designed to be
+very flexible, so it can adapt to your needs.
+
+There are multiple ways to modify and enhance your data model, for
+example you could use the web application or program the changes with
+the Python client. This document describes how to change the data model
+with the LinkAhead web application.
+
+What happens to my data if the data model changes?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+With most systems, changing the data model is not possible without
+migrating the existing data. With LinkAhead however, your
+“legacy” data can simply stay where it is, it will not be modified. New
+data, that you enter after changing the data model, will of course
+follow your changes and adhere to your “new” data model.
+
+Modifying the data model in LinkAhead
+-------------------------------------
+
+The easiest way to change the data model is to `use the LinkAhead
+web
+application <https://docs.indiscale.com/caosdb-webui/tutorials/edit_mode.html>`__.
+But the first step is to look at the current data model (*RecordTypes*
+and *Properties*) and your current situation, to find out what you need
+changed. It may help to ask yourself these questions:
+
+- Do you want to describe data of existing types in more detail? -> :ref:`Create
+  *Properties*<new_property>` if necessary, then `add
+  <https://docs.indiscale.com/caosdb-webui/tutorials/edit_mode.html#add-properties-to-an-existing-recordtype>`__
+  these *Properties* to the existing *RecordTypes*.
+- Do you need to add a property more than once? -> Make that property `a list property
+  <https://docs.indiscale.com/caosdb-webui/tutorials/edit_mode.html#make-a-property-into-a-list>`__\
+  .
+-  Are there completely new types of data? -> :ref:`Create a new
+   *RecordType* <new_recordtype>` .
+-  Are there new types of data which would nearly fit into an existing
+   RecordType, but not quite? Do you still want to keep the existing
+   RecordType for some purposes, but require changes or additions for
+   other purposes? -> :ref:`Create a new
+   *RecordType* <new_recordtype>` which inherits from the
+   existing RecordType as a parent.
+-  Do you have a new setup, new devices, new protocols, new software? ->
+   :ref:`Create a new
+   *RecordType* <new_recordtype>` .
+- Are there *Properties* or *RecordTypes* which were created in the past, but will never be used? ->
+   `Delete them
+   <https://docs.indiscale.com/caosdb-webui/tutorials/edit_mode.html#delete-an-entity>`__.
+
+Once you know what you want to do, open the LinkAhead web application, log in and click on the “Edit
+Mode” button in the menu.  Then follow one of the instructions in the next sections or the general `Edit
+Mode documentation <https://docs.indiscale.com/caosdb-webui/tutorials/edit_mode.html>`__..
+
+.. figure:: img/edit_mode_button.png
+   :alt: The Edit Mode button appears when a user is logged in.
+
+   A screen shot of the menu, with the Edit Mode button highlighted
+
+.. _new_property:
+
+Create a new Property
+~~~~~~~~~~~~~~~~~~~~~
+
+Creating the required Properties often is the first step for changes to
+the data model.
+
+1. Check that there is no Property yet which does what you want:
+
+   -  Search for existing Properties: ``FIND PROPERTY *qualit*`` to
+      search for Properties with “qualit” in the name, ``FIND PROPERTY``
+      for all Properties.
+   -  Look at related RecordTypes, maybe they already use a Property
+      which does the thing you need.
+   -  Ask around. If possible at least two persons. Your team mates may
+      have had the same thoughts already, or may know about someone who
+      implemented your desired Property.
+
+2. Activate the *Edit Mode* in the top menu. Now the edit mode toolbox
+   on the right hand side of the screen should be visible.
+3. Click on the “Create Property” button in the toolbox. A dialog for
+   the new Property shows up.
+4. Follow the `WebUI documentation
+   <https://docs.indiscale.com/caosdb-webui/tutorials/edit_mode.html#new-property>`__ for Property
+   creation.
+
+.. _new_recordtype:
+
+Create a new RecordType
+~~~~~~~~~~~~~~~~~~~~~~~
+
+1. Check that there is no RecordType yet which does what you want:
+
+   -  Search for existing RecordTypes: ``FIND RECORDTYPE *experi*`` to
+      search for RecordTypes with “experi” in the name,
+      ``FIND RECORDTYPE`` for all RecordTypes.
+   -  Look at related RecordTypes, maybe you can inherit from one?
+   -  Ask around. If possible at least two persons. You team mates may
+      have had the same thoughts already, or may know about someone who
+      implemented your desired RecordType.
+
+2. Activate the *Edit Mode* in the top menu. Now the edit mode toolbox
+   on the right hand side of the screen should be visible.
+
+3. Click on the “Create RecordType” button in the toolbox. A dialog for
+   the new Property shows up.
+
+4. Follow the `WebUI documentation
+   <https://docs.indiscale.com/caosdb-webui/tutorials/edit_mode.html#new-recordtype>`__ for
+   RecordType creation.
+
+What about letting users only choose from a fixed set of values (a.k.a. enums)?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You may ask yourself how you can restrict users (or yourself) to choose
+property values from a fixed set. For example, entering the
+experimenters in an “Experiment” record may be cumbersome and
+error-prone. Or entering a chemical formula again and again may become
+tedious. This is where data management tools like LinkAhead can
+help you by referencing between entities.
+
+In this example, instead of having a TEXT Property “experimenter”, where
+users need to enter the name by hand, you could create a new RecordType
+“Person”. Then create a Record for each experimenter in your team. And
+finally, remove the “experimenter” TEXT Property and create a new
+REFERENCE Property which references to the “Person” records. Now all the
+users have to do is to choose the experimenter from a drop-down menu in
+LinkAhead.
+
+.. figure:: img/screenshot_dropdown.png
+   :alt: Users may choose one of multiple Persons when enums are implemented via REFERENCE Properties
+
+   A screenshot of a drop down menu where one of multiple “Person” records may be chosen
+
diff --git a/src/doc/tutorials/img/data_model_and_data.png b/src/doc/tutorials/img/data_model_and_data.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7b0d3b8c72bf5ff36a74dc50ef386977ddb2512
Binary files /dev/null and b/src/doc/tutorials/img/data_model_and_data.png differ
diff --git a/src/doc/tutorials/img/data_model_and_data.svg b/src/doc/tutorials/img/data_model_and_data.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5f6692c541e20d93513f0ef9b759506f35797185
--- /dev/null
+++ b/src/doc/tutorials/img/data_model_and_data.svg
@@ -0,0 +1,2071 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="123.13786mm"
+   height="55.646351mm"
+   viewBox="0 0 479.9487 216.88946"
+   version="1.2"
+   id="svg236"
+   sodipodi:docname="data_model_and_data.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
+   inkscape:export-filename="/home/daniel/indiscale/management/external/bmpg/management/documentation/data_model/how_to_datamodel/data_model_and_data.png"
+   inkscape:export-xdpi="412.54572"
+   inkscape:export-ydpi="412.54572">
+  <metadata
+     id="metadata240">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Qt SVG Document</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1135"
+     id="namedview238"
+     showgrid="false"
+     inkscape:zoom="2.6127896"
+     inkscape:cx="232.70147"
+     inkscape:cy="105.15846"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1"
+     inkscape:document-rotation="0" />
+  <title
+     id="title2">Qt SVG Document</title>
+  <desc
+     id="desc4">Generated with Qt</desc>
+  <defs
+     id="defs6">
+    <marker
+       style="overflow:visible"
+       id="marker3403"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path3401" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker1523"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path1521" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker1333"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend"
+       inkscape:isstock="true">
+      <path
+         transform="scale(-0.6)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path1331" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow1Mend"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Mend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-0.4,0,0,-0.4,-4,0)"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         id="path976" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker1523-5"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path1521-1" />
+    </marker>
+  </defs>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="Layer 1"
+     transform="translate(-0.37325826,-0.37362263)">
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g8"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g10"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g12"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g18"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g20"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="700"
+       font-style="normal"
+       id="g26"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g36"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g38"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g44"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g50"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g56"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g62"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g64"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g66"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g68"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g70"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g72"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(-0.992009,0,0,-0.992009,90.3118,64.4806)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g74"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(-0.992009,0,0,-0.992009,90.3118,64.4806)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g80"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g82"
+       style="fill-rule:evenodd" />
+    <g
+       id="g3044">
+      <g
+         fill="#ffffff"
+         fill-opacity="1"
+         stroke="#ff0000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="round"
+         stroke-linejoin="round"
+         transform="matrix(-0.992009,0,0,-0.992009,90.3118,64.4806)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g78"
+         style="fill-rule:evenodd;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+        <path
+           vector-effect=""
+           fill-rule="evenodd"
+           d="M -6,0 0,10 6,0 H -6"
+           id="path76"
+           style="stroke:#ff0000;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+      </g>
+      <g
+         fill="none"
+         stroke="#ff0000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="round"
+         stroke-linejoin="round"
+         transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g86"
+         style="fill-rule:evenodd;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+        <path
+           vector-effect=""
+           fill-rule="evenodd"
+           d="m -68.7281,-363.013 v -29.302"
+           id="path84"
+           style="stroke:#ff0000;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+      </g>
+    </g>
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g88"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g90"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g92"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0,0.992009,-0.992009,0,197.41,178.126)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g94"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0,0.992009,-0.992009,0,197.41,178.126)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g100"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g102"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g108"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g110"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g112"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(-0.992009,0,0,-0.992009,319.539,211.365)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g114"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(-0.992009,0,0,-0.992009,319.539,211.365)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g120"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g122"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g128"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g130"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g134"
+       style="fill-rule:evenodd;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+      <rect
+         vector-effect=""
+         x="0"
+         y="0"
+         width="135"
+         height="54"
+         id="rect132"
+         style="stroke:#ff0000;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="700"
+       font-style="normal"
+       id="g136"
+       style="fill-rule:evenodd" />
+    <text
+       fill="#000000"
+       fill-opacity="1"
+       stroke="none"
+       xml:space="preserve"
+       x="54.689575"
+       y="14.38413"
+       font-family="'Noto Sans'"
+       font-size="12.2761px"
+       font-weight="700"
+       font-style="normal"
+       id="text138"
+       style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">Experiment</text>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g144"
+       style="fill-rule:evenodd;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+      <polyline
+         fill="none"
+         vector-effect=""
+         points="0,18 135,18 "
+         id="polyline142"
+         style="stroke:#ff0000;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g146"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g148"
+       style="fill-rule:evenodd" />
+    <text
+       fill="#000000"
+       fill-opacity="1"
+       stroke="none"
+       xml:space="preserve"
+       x="29.393345"
+       y="32.240292"
+       font-family="'Noto Sans'"
+       font-size="12.2761px"
+       font-weight="400"
+       font-style="normal"
+       id="text150"
+       style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">experimenter : TEXT</text>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g154"
+       style="fill-rule:evenodd" />
+    <text
+       fill="#000000"
+       fill-opacity="1"
+       stroke="none"
+       xml:space="preserve"
+       x="29.393345"
+       y="50.096455"
+       font-family="'Noto Sans'"
+       font-size="12.2761px"
+       font-weight="400"
+       font-style="normal"
+       id="text156"
+       style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">lab_notes : FILE</text>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g160"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g162"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g164"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g166"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g168"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="700"
+       font-style="normal"
+       id="g174"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g184"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g186"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g192"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g194"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g196"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g198"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g200"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="700"
+       font-style="normal"
+       id="g206"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g216"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g218"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g224"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g226"
+       style="fill-rule:evenodd" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g228"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g230"
+       style="fill-rule:evenodd" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g232"
+       style="fill-rule:evenodd" />
+    <g
+       id="g3098">
+      <g
+         id="g3084">
+        <rect
+           vector-effect=""
+           x="0.99200898"
+           y="93.548401"
+           width="186.4977"
+           height="89.280807"
+           id="rect22"
+           style="font-style:normal;font-weight:400;font-size:12.375px;font-family:'Noto Sans';fill:#ffffc0;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.2375;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <polyline
+           fill="none"
+           vector-effect=""
+           points="0,18 188,18 "
+           id="polyline32"
+           style="font-style:normal;font-weight:400;font-size:12.375px;font-family:'Noto Sans';fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)" />
+      </g>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="31.640734"
+         y="106.94052"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="700"
+         font-style="normal"
+         id="text28"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">CellCultureExperiment</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="124.79668"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text40"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">experimenter : TEXT</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="142.65285"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text46"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">lab_notes : FILE</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="160.509"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text52"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">number_of_dishes : INTEGER</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="178.36517"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text58"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">cell_line : CellLine</text>
+      <g
+         id="g1462"
+         transform="translate(-285.2144,-71.568939)">
+        <rect
+           style="opacity:1;fill:#d7f4d7;stroke:#008000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000"
+           id="rect1456"
+           width="18.926079"
+           height="13.833775"
+           x="289.03854"
+           y="167.14027"
+           ry="4.099587" />
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="290.79922"
+           y="178.57553"
+           font-family="'Noto Sans'"
+           font-size="12.2761px"
+           font-weight="700"
+           font-style="normal"
+           id="text1460"
+           style="fill-rule:evenodd;stroke-width:0.992009"><tspan
+             style="fill:#008000"
+             id="tspan1458">RT</tspan></text>
+      </g>
+    </g>
+    <g
+       id="g1470"
+       transform="translate(-261.77311,-164.12532)">
+      <rect
+         style="opacity:1;fill:#d7f4d7;stroke:#008000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000"
+         id="rect1464"
+         width="18.926079"
+         height="13.833775"
+         x="289.03854"
+         y="167.14027"
+         ry="4.099587" />
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="290.79922"
+         y="178.57553"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="700"
+         font-style="normal"
+         id="text1468"
+         style="fill-rule:evenodd;stroke-width:0.992009"><tspan
+           style="fill:#008000"
+           id="tspan1466">RT</tspan></text>
+    </g>
+    <g
+       id="g2988">
+      <g
+         id="g2964">
+        <g
+           fill="#ffffc0"
+           fill-opacity="1"
+           stroke="#ff0000"
+           stroke-opacity="1"
+           stroke-width="1"
+           stroke-linecap="square"
+           stroke-linejoin="bevel"
+           transform="matrix(0.992009,0,0,0.992009,213.32298,2.1385369)"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="400"
+           font-style="normal"
+           id="g2922"
+           style="fill:#d5f6ff;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+          <rect
+             vector-effect=""
+             x="0"
+             y="0"
+             width="135"
+             height="54"
+             id="rect2920"
+             style="fill:#d5f6ff;stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+        </g>
+        <g
+           fill="#ffffc0"
+           fill-opacity="1"
+           stroke="#ff0000"
+           stroke-opacity="1"
+           stroke-width="1"
+           stroke-linecap="square"
+           stroke-linejoin="bevel"
+           transform="matrix(0.992009,0,0,0.992009,213.32298,2.1385369)"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="400"
+           font-style="normal"
+           id="g2926"
+           style="fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+          <polyline
+             fill="none"
+             vector-effect=""
+             points="0,18 135,18 "
+             id="polyline2924"
+             style="stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+        </g>
+      </g>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="236.03297"
+         y="14.17053"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text150-3"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">experiment 1</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="218.03311"
+         y="32.240292"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text2956"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">experimenter : Sheila</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="218.03311"
+         y="50.096455"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text2958"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">lab_notes : /data/dat3.</text>
+      <g
+         id="g3122-2"
+         transform="translate(-73.372734,-162.59558)">
+        <rect
+           style="opacity:1;fill:#ffd5d5;stroke:#ff0000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000"
+           id="rect3116-2"
+           width="15.923747"
+           height="13.833771"
+           x="289.03854"
+           y="167.14027"
+           ry="6.9168854" />
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="292.86172"
+           y="178.57553"
+           font-family="'Noto Sans'"
+           font-size="12.2761px"
+           font-weight="700"
+           font-style="normal"
+           id="text3120-3"
+           style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.992009"><tspan
+             style="fill:#ff0000"
+             id="tspan3118-1">R</tspan></text>
+      </g>
+    </g>
+    <g
+       id="g3006"
+       transform="translate(14.001362,13.026627)">
+      <g
+         id="g2998">
+        <g
+           fill="#ffffc0"
+           fill-opacity="1"
+           stroke="#ff0000"
+           stroke-opacity="1"
+           stroke-width="1"
+           stroke-linecap="square"
+           stroke-linejoin="bevel"
+           transform="matrix(0.992009,0,0,0.992009,213.32298,2.1385369)"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="400"
+           font-style="normal"
+           id="g2992"
+           style="fill:#d5f6ff;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+          <rect
+             vector-effect=""
+             x="0"
+             y="0"
+             width="135"
+             height="54"
+             id="rect2990"
+             style="fill:#d5f6ff;stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+        </g>
+        <g
+           fill="#ffffc0"
+           fill-opacity="1"
+           stroke="#ff0000"
+           stroke-opacity="1"
+           stroke-width="1"
+           stroke-linecap="square"
+           stroke-linejoin="bevel"
+           transform="matrix(0.992009,0,0,0.992009,213.32298,2.1385369)"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="400"
+           font-style="normal"
+           id="g2996"
+           style="fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+          <polyline
+             fill="none"
+             vector-effect=""
+             points="0,18 135,18 "
+             id="polyline2994"
+             style="stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+        </g>
+      </g>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="236.0329"
+         y="14.17053"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3000"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">experiment 2</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="218.03311"
+         y="32.240292"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3002"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">experimenter : Sheila</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="218.03311"
+         y="50.096455"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3004"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">lab_notes : /data/dat3.</text>
+      <g
+         id="g3164"
+         transform="translate(-73.176703,-163.02108)">
+        <rect
+           style="opacity:1;fill:#ffd5d5;stroke:#ff0000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000"
+           id="rect3158"
+           width="15.923747"
+           height="13.833771"
+           x="289.03854"
+           y="167.14027"
+           ry="6.9168854" />
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="292.86172"
+           y="178.57553"
+           font-family="'Noto Sans'"
+           font-size="12.2761px"
+           font-weight="700"
+           font-style="normal"
+           id="text3162"
+           style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.992009"><tspan
+             style="fill:#ff0000"
+             id="tspan3160">R</tspan></text>
+      </g>
+    </g>
+    <g
+       id="g3024"
+       transform="translate(28.930217,27.858633)">
+      <g
+         id="g3016">
+        <g
+           fill="#ffffc0"
+           fill-opacity="1"
+           stroke="#ff0000"
+           stroke-opacity="1"
+           stroke-width="1"
+           stroke-linecap="square"
+           stroke-linejoin="bevel"
+           transform="matrix(0.992009,0,0,0.992009,213.32298,2.1385369)"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="400"
+           font-style="normal"
+           id="g3010"
+           style="fill:#d5f6ff;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+          <rect
+             vector-effect=""
+             x="0"
+             y="0"
+             width="135"
+             height="54"
+             id="rect3008"
+             style="fill:#d5f6ff;stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+        </g>
+        <g
+           fill="#ffffc0"
+           fill-opacity="1"
+           stroke="#ff0000"
+           stroke-opacity="1"
+           stroke-width="1"
+           stroke-linecap="square"
+           stroke-linejoin="bevel"
+           transform="matrix(0.992009,0,0,0.992009,213.32298,2.1385369)"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="400"
+           font-style="normal"
+           id="g3014"
+           style="fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+          <polyline
+             fill="none"
+             vector-effect=""
+             points="0,18 135,18 "
+             id="polyline3012"
+             style="stroke:#0044aa;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+        </g>
+      </g>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="236.03297"
+         y="14.17053"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3018"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">experiment 3</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="218.03311"
+         y="32.240292"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3020"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">experimenter : Sheila</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="218.03311"
+         y="50.096455"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3022"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">lab_notes : /data/dat3.</text>
+      <g
+         id="g3164-8"
+         transform="translate(-72.586409,-163.21016)">
+        <rect
+           style="opacity:1;fill:#ffd5d5;stroke:#ff0000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000"
+           id="rect3158-3"
+           width="15.923747"
+           height="13.833771"
+           x="289.03854"
+           y="167.14027"
+           ry="6.9168854" />
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="292.86172"
+           y="178.57553"
+           font-family="'Noto Sans'"
+           font-size="12.2761px"
+           font-weight="700"
+           font-style="normal"
+           id="text3162-4"
+           style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.992009"><tspan
+             style="fill:#ff0000"
+             id="tspan3160-2">R</tspan></text>
+      </g>
+    </g>
+    <g
+       id="g3054"
+       transform="rotate(-90,117.93564,3.3018104)"
+       style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#d5f6ff;fill-opacity:1;stroke:#0044aa;stroke-width:1.2375;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1">
+      <g
+         fill="#ffffff"
+         fill-opacity="1"
+         stroke="#ff0000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="round"
+         stroke-linejoin="round"
+         transform="matrix(-0.992009,0,0,-0.992009,90.3118,64.4806)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g3048"
+         style="font-variation-settings:normal;vector-effect:none;fill:#d5f6ff;fill-opacity:1;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1">
+        <path
+           vector-effect=""
+           fill-rule="evenodd"
+           d="M -6,0 0,10 6,0 H -6"
+           id="path3046"
+           style="font-variation-settings:normal;vector-effect:none;fill:#d5f6ff;fill-opacity:1;stroke:#0044aa;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1" />
+      </g>
+      <g
+         fill="none"
+         stroke="#ff0000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="round"
+         stroke-linejoin="round"
+         transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g3052"
+         style="font-variation-settings:normal;vector-effect:none;fill:#d5f6ff;fill-opacity:1;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1">
+        <path
+           vector-effect=""
+           fill-rule="evenodd"
+           d="m -68.7281,-363.013 v -29.302"
+           id="path3050"
+           style="font-variation-settings:normal;vector-effect:none;fill:#d5f6ff;fill-opacity:1;stroke:#0044aa;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1" />
+      </g>
+    </g>
+    <g
+       id="g3124"
+       transform="translate(225.1288)">
+      <g
+         id="g3104">
+        <rect
+           vector-effect=""
+           x="0.99200898"
+           y="93.548401"
+           width="186.4977"
+           height="89.280807"
+           id="rect3100"
+           style="font-style:normal;font-weight:400;font-size:12.375px;font-family:'Noto Sans';font-variation-settings:normal;opacity:1;vector-effect:none;fill:#d5f6ff;fill-opacity:1;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.2375;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1" />
+        <polyline
+           fill="none"
+           vector-effect=""
+           points="0,18 188,18 "
+           id="polyline3102"
+           style="font-style:normal;font-weight:400;font-size:12.375px;font-family:'Noto Sans';font-variation-settings:normal;opacity:1;vector-effect:none;fill:#d5f6ff;fill-opacity:1;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
+           transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)" />
+      </g>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="31.640734"
+         y="106.94052"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="700"
+         font-style="normal"
+         id="text3106"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">my_exp 1</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="124.79668"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3108"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">experimenter : Paul</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="142.65285"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3110"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">lab_notes : /data/cc/dat3.dat</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="160.509"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3112"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">number_of_dishes : 5</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="178.36517"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3114"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">cell_line : #123</text>
+      <g
+         id="g3122"
+         transform="translate(-285.2144,-71.568939)">
+        <rect
+           style="opacity:1;fill:#ffd5d5;stroke:#ff0000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000"
+           id="rect3116"
+           width="15.923747"
+           height="13.833771"
+           x="289.03854"
+           y="167.14027"
+           ry="6.9168854" />
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="292.86172"
+           y="178.57553"
+           font-family="'Noto Sans'"
+           font-size="12.2761px"
+           font-weight="700"
+           font-style="normal"
+           id="text3120"
+           style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.992009"><tspan
+             style="fill:#ff0000"
+             id="tspan3118">R</tspan></text>
+      </g>
+    </g>
+    <g
+       id="g3259"
+       transform="translate(243.88467,15.856705)">
+      <g
+         id="g3239">
+        <rect
+           vector-effect=""
+           x="0.99200898"
+           y="93.548401"
+           width="186.4977"
+           height="89.280807"
+           id="rect3235"
+           style="font-style:normal;font-weight:400;font-size:12.375px;font-family:'Noto Sans';font-variation-settings:normal;opacity:1;vector-effect:none;fill:#d5f6ff;fill-opacity:1;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.2375;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1" />
+        <polyline
+           fill="none"
+           vector-effect=""
+           points="0,18 188,18 "
+           id="polyline3237"
+           style="font-style:normal;font-weight:400;font-size:12.375px;font-family:'Noto Sans';font-variation-settings:normal;opacity:1;vector-effect:none;fill:#d5f6ff;fill-opacity:1;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
+           transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)" />
+      </g>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="31.640734"
+         y="106.94052"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="700"
+         font-style="normal"
+         id="text3241"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">my_exp 2</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="124.79668"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3243"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">experimenter : Paul</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="142.65285"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3245"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">lab_notes : /data/cc/dat3.dat</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="160.509"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3247"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">number_of_dishes : 5</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="178.36517"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3249"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">cell_line : #123</text>
+      <g
+         id="g3257"
+         transform="translate(-285.2144,-71.568939)">
+        <rect
+           style="opacity:1;fill:#ffd5d5;stroke:#ff0000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000"
+           id="rect3251"
+           width="15.923747"
+           height="13.833771"
+           x="289.03854"
+           y="167.14027"
+           ry="6.9168854" />
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="292.86172"
+           y="178.57553"
+           font-family="'Noto Sans'"
+           font-size="12.2761px"
+           font-weight="700"
+           font-style="normal"
+           id="text3255"
+           style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.992009"><tspan
+             style="fill:#ff0000"
+             id="tspan3253">R</tspan></text>
+      </g>
+    </g>
+    <g
+       id="g3285"
+       transform="translate(259.80841,33.815492)">
+      <g
+         id="g3265">
+        <rect
+           vector-effect=""
+           x="0.99200898"
+           y="93.548401"
+           width="186.4977"
+           height="89.280807"
+           id="rect3261"
+           style="font-style:normal;font-weight:400;font-size:12.375px;font-family:'Noto Sans';font-variation-settings:normal;opacity:1;vector-effect:none;fill:#d5f6ff;fill-opacity:1;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.2375;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1" />
+        <polyline
+           fill="none"
+           vector-effect=""
+           points="0,18 188,18 "
+           id="polyline3263"
+           style="font-style:normal;font-weight:400;font-size:12.375px;font-family:'Noto Sans';font-variation-settings:normal;opacity:1;vector-effect:none;fill:#d5f6ff;fill-opacity:1;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
+           transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)" />
+      </g>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="31.640734"
+         y="106.94052"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="700"
+         font-style="normal"
+         id="text3267"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">my_exp 3</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="124.79668"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3269"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">experimenter : Paul</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="142.65285"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3271"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">lab_notes : /data/cc/dat3.dat</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="160.509"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3273"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">number_of_dishes : 5</text>
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5.952054"
+         y="178.36517"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="400"
+         font-style="normal"
+         id="text3275"
+         style="fill-rule:evenodd;stroke-width:0.992009;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">cell_line : #123</text>
+      <g
+         id="g3283"
+         transform="translate(-285.2144,-71.568939)">
+        <rect
+           style="opacity:1;fill:#ffd5d5;stroke:#ff0000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000"
+           id="rect3277"
+           width="15.923747"
+           height="13.833771"
+           x="289.03854"
+           y="167.14027"
+           ry="6.9168854" />
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="292.86172"
+           y="178.57553"
+           font-family="'Noto Sans'"
+           font-size="12.2761px"
+           font-weight="700"
+           font-style="normal"
+           id="text3281"
+           style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.992009"><tspan
+             style="fill:#ff0000"
+             id="tspan3279">R</tspan></text>
+      </g>
+    </g>
+    <g
+       id="g3295"
+       transform="rotate(-90,181.47795,44.53676)"
+       style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#d5f6ff;fill-opacity:1;stroke:#0044aa;stroke-width:1.2375;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1">
+      <g
+         fill="#ffffff"
+         fill-opacity="1"
+         stroke="#ff0000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="round"
+         stroke-linejoin="round"
+         transform="matrix(-0.992009,0,0,-0.992009,90.3118,64.4806)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g3289"
+         style="font-variation-settings:normal;vector-effect:none;fill:#d5f6ff;fill-opacity:1;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1">
+        <path
+           vector-effect=""
+           fill-rule="evenodd"
+           d="M -6,0 0,10 6,0 H -6"
+           id="path3287"
+           style="font-variation-settings:normal;vector-effect:none;fill:#d5f6ff;fill-opacity:1;stroke:#0044aa;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1" />
+      </g>
+      <g
+         fill="none"
+         stroke="#ff0000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="round"
+         stroke-linejoin="round"
+         transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g3293"
+         style="font-variation-settings:normal;vector-effect:none;fill:#d5f6ff;fill-opacity:1;fill-rule:evenodd;stroke:#0044aa;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1">
+        <path
+           vector-effect=""
+           fill-rule="evenodd"
+           d="M -68.7281,-375.23969 V -392.315"
+           id="path3291"
+           style="font-variation-settings:normal;vector-effect:none;fill:#d5f6ff;fill-opacity:1;stroke:#0044aa;stroke-width:1.24747;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
+           sodipodi:nodetypes="cc" />
+      </g>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5001px;line-height:1.25;font-family:Stanberry;-inkscape-font-specification:Stanberry;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.332398"
+       x="421.51617"
+       y="20.97814"
+       id="text1517"><tspan
+         sodipodi:role="line"
+         id="tspan1515"
+         x="421.51617"
+         y="20.97814"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5001px;font-family:Stanberry;-inkscape-font-specification:Stanberry;fill:#0000ff;stroke-width:0.332398">Records</tspan></text>
+    <path
+       style="fill:none;stroke:#0000ff;stroke-width:0.839441;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#marker1523-5);paint-order:markers fill stroke;stop-color:#000000"
+       d="m 441.22143,27.507131 c -1.42777,5.850954 -9.22389,11.574261 -17.31854,13.818563 -12.822,3.554995 -11.11495,0.07953 -31.34267,1.84685"
+       id="path1519"
+       sodipodi:nodetypes="csc" />
+    <path
+       style="fill:none;stroke:#0000ff;stroke-width:0.839441;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#marker3403);paint-order:markers fill stroke;stop-color:#000000"
+       d="m 454.89862,27.912518 c 1.72938,21.926674 0.42202,29.71883 -3.7148,37.029573 -6.55276,11.580287 -13.10909,16.963606 -26.16255,32.516469"
+       id="path3399"
+       sodipodi:nodetypes="csc" />
+  </g>
+</svg>
diff --git a/src/doc/tutorials/img/edit_entity_button.png b/src/doc/tutorials/img/edit_entity_button.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7b1421035340c3351ea4bfdc25ed7cda9579ff1
Binary files /dev/null and b/src/doc/tutorials/img/edit_entity_button.png differ
diff --git a/src/doc/tutorials/img/edit_mode_button.png b/src/doc/tutorials/img/edit_mode_button.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3764ba3af3caed2d4ae2ecf430f0c8275cd068b
Binary files /dev/null and b/src/doc/tutorials/img/edit_mode_button.png differ
diff --git a/src/doc/tutorials/img/screenshot_dropdown.png b/src/doc/tutorials/img/screenshot_dropdown.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b4e65c6ce2a70ba8a5cede12ab11bc7ef0b68d5
Binary files /dev/null and b/src/doc/tutorials/img/screenshot_dropdown.png differ
diff --git a/src/doc/tutorials/img/screenshot_edit_create_delete.png b/src/doc/tutorials/img/screenshot_edit_create_delete.png
new file mode 100644
index 0000000000000000000000000000000000000000..099efa9ff28569f494e9ef543e6396e6af10e1b1
Binary files /dev/null and b/src/doc/tutorials/img/screenshot_edit_create_delete.png differ
diff --git a/src/doc/tutorials/img/screenshot_menu.png b/src/doc/tutorials/img/screenshot_menu.png
new file mode 100644
index 0000000000000000000000000000000000000000..10288582cdddec16f59deaa69868538f31729ab4
Binary files /dev/null and b/src/doc/tutorials/img/screenshot_menu.png differ
diff --git a/src/doc/tutorials/img/screenshot_new_recordtype.png b/src/doc/tutorials/img/screenshot_new_recordtype.png
new file mode 100644
index 0000000000000000000000000000000000000000..ddb105d6d689e3b6495bdb3ec60673cb4140ca8e
Binary files /dev/null and b/src/doc/tutorials/img/screenshot_new_recordtype.png differ
diff --git a/src/doc/tutorials/img/simple_data_model.png b/src/doc/tutorials/img/simple_data_model.png
new file mode 100644
index 0000000000000000000000000000000000000000..caa783aca63aac65bfea62e3f92d830bcb1b17f5
Binary files /dev/null and b/src/doc/tutorials/img/simple_data_model.png differ
diff --git a/src/doc/tutorials/img/simple_data_model.svg b/src/doc/tutorials/img/simple_data_model.svg
new file mode 100644
index 0000000000000000000000000000000000000000..80f7ddce12d7a85ceac8952b861fb7433676b486
--- /dev/null
+++ b/src/doc/tutorials/img/simple_data_model.svg
@@ -0,0 +1,1826 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="113.145mm"
+   height="72.8646mm"
+   viewBox="0 0 441 284"
+   version="1.2"
+   id="svg236"
+   sodipodi:docname="simple_data_model.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
+   inkscape:export-filename="/home/daniel/indiscale/management/external/bmpg/management/documentation/data_model/how_to_datamodel/simple_data_model.png"
+   inkscape:export-xdpi="448.98001"
+   inkscape:export-ydpi="448.98001">
+  <metadata
+     id="metadata240">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Qt SVG Document</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1135"
+     id="namedview238"
+     showgrid="false"
+     inkscape:zoom="1.8023479"
+     inkscape:cx="156.06897"
+     inkscape:cy="185.47266"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1"
+     inkscape:document-rotation="0" />
+  <title
+     id="title2">Qt SVG Document</title>
+  <desc
+     id="desc4">Generated with Qt</desc>
+  <defs
+     id="defs6">
+    <marker
+       style="overflow:visible;"
+       id="marker1523"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="scale(1.1) rotate(180) translate(1,0)"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#0000ff;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
+         id="path1521" />
+    </marker>
+    <marker
+       style="overflow:visible;"
+       id="marker1423"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         transform="scale(1.1) rotate(180) translate(1,0)"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#0000ff;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
+         id="path1421" />
+    </marker>
+    <marker
+       style="overflow:visible;"
+       id="marker1333"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend"
+       inkscape:isstock="true">
+      <path
+         transform="scale(0.6) rotate(180) translate(0,0)"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#0000ff;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
+         id="path1331" />
+    </marker>
+    <marker
+       style="overflow:visible;"
+       id="Arrow2Lend"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         transform="scale(1.1) rotate(180) translate(1,0)"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#0000ff;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
+         id="path988" />
+    </marker>
+    <marker
+       style="overflow:visible;"
+       id="Arrow1Mend"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow1Mend"
+       inkscape:isstock="true">
+      <path
+         transform="scale(0.4) rotate(180) translate(10,0)"
+         style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         id="path976" />
+    </marker>
+  </defs>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="Layer 1">
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g8"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g10"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g12"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g18"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g20"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="round"
+       stroke-linejoin="round"
+       transform="matrix(0.992009,0,0,0.992009,158.491,454.51927)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g86"
+       style="fill-rule:evenodd;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         vector-effect=""
+         fill-rule="evenodd"
+         d="m -68.7281,-363.013 v -29.302"
+         id="path84"
+         style="stroke:#ff0000;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g24"
+       style="fill-rule:evenodd;stroke-width:1.24747354;stroke-miterlimit:4;stroke-dasharray:none">
+      <rect
+         vector-effect=""
+         x="0"
+         y="0"
+         width="188"
+         height="90"
+         id="rect22"
+         style="stroke-width:1.24747354;stroke:#ff0000;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="700"
+       font-style="normal"
+       id="g26"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,11.30455,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="700"
+       font-style="normal"
+       id="g30"
+       style="fill-rule:evenodd;">
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="20.5"
+         y="13.5"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="700"
+         font-style="normal"
+         id="text28">CellCultureExperiment</text>
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g34"
+       style="fill-rule:evenodd;stroke-width:1.24747354;stroke-miterlimit:4;stroke-dasharray:none">
+      <polyline
+         fill="none"
+         vector-effect=""
+         points="0,18 188,18 "
+         id="polyline32"
+         style="stroke-width:1.24747354;stroke:#ff0000;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g36"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g38"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g42"
+       style="fill-rule:evenodd;">
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5"
+         y="31.5"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="text40">experimenter : TEXT</text>
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g44"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g48"
+       style="fill-rule:evenodd;">
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5"
+         y="49.5"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="text46">lab_notes : FILE</text>
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g50"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g54"
+       style="fill-rule:evenodd;">
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5"
+         y="67.5"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="text52">number_of_dishes : INTEGER</text>
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g56"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g60"
+       style="fill-rule:evenodd;">
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5"
+         y="85.5"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="text58">cell_line : CellLine</text>
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g62"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g64"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g66"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,0.992009,93.5484)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g68"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g70"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g72"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(-0.992009,0,0,-0.992009,90.3118,64.4806)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g74"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffff"
+       fill-opacity="1"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="round"
+       stroke-linejoin="round"
+       transform="matrix(-0.992009,0,0,-0.992009,90.3118,65.338858)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g78"
+       style="fill-rule:evenodd;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         vector-effect=""
+         fill-rule="evenodd"
+         d="M -6,0 0,10 6,0 H -6"
+         id="path76"
+         style="stroke:#ff0000;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(-0.992009,0,0,-0.992009,90.3118,64.4806)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g80"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g82"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g88"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g90"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g92"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0,0.992009,-0.992009,0,197.41,178.126)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g94"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ff0000"
+       fill-opacity="1"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="round"
+       stroke-linejoin="round"
+       transform="matrix(0,0.992009,-0.992009,0,197.41,178.126)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g98"
+       style="fill-rule:evenodd;stroke-width:1.24747354;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         vector-effect=""
+         fill-rule="evenodd"
+         d="M 0,-12.307128 -5,-2.3071266 0,7.6928736 5,-2.3071266 0,-12.307128"
+         id="path96"
+         style="stroke:#ff0000;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0,0.992009,-0.992009,0,197.41,178.126)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g100"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g102"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="round"
+       stroke-linejoin="round"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g106"
+       style="fill-rule:evenodd;stroke-width:1.24747354;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         vector-effect=""
+         fill-rule="evenodd"
+         d="m 49.2327,-277.754 80.94846,-16.18789"
+         id="path104"
+         style="stroke:#ff0000;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none"
+         sodipodi:nodetypes="cc" />
+    </g>
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g108"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g110"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g112"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(-0.992009,0,0,-0.992009,319.539,211.365)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g114"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ff0000"
+       fill-opacity="1"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="round"
+       stroke-linejoin="round"
+       transform="matrix(-0.992009,0,0,-0.992009,319.539,212.22327)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g118"
+       style="fill-rule:evenodd;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         vector-effect=""
+         fill-rule="evenodd"
+         d="M 0,-10 -5,0 0,10 5,0 0,-10"
+         id="path116"
+         style="stroke:#ff0000;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(-0.992009,0,0,-0.992009,319.539,211.365)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g120"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g122"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="round"
+       stroke-linejoin="round"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g126"
+       style="fill-rule:evenodd;stroke-width:1.24747354;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         vector-effect=""
+         fill-rule="evenodd"
+         d="m 162.345,-234.247 v 26.22"
+         id="path124"
+         style="stroke-width:1.24747354;stroke:#ff0000;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,158.491,453.661)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g128"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g130"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g134"
+       style="fill-rule:evenodd;stroke-width:1.24747354;stroke-miterlimit:4;stroke-dasharray:none">
+      <rect
+         vector-effect=""
+         x="0"
+         y="0"
+         width="135"
+         height="54"
+         id="rect132"
+         style="stroke-width:1.24747354;stroke:#ff0000;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="700"
+       font-style="normal"
+       id="g136"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="700"
+       font-style="normal"
+       id="g140"
+       style="fill-rule:evenodd;">
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="30.5"
+         y="13.5"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="700"
+         font-style="normal"
+         id="text138">Experiment</text>
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g144"
+       style="fill-rule:evenodd;stroke-width:1.24747354;stroke-miterlimit:4;stroke-dasharray:none">
+      <polyline
+         fill="none"
+         vector-effect=""
+         points="0,18 135,18 "
+         id="polyline142"
+         style="stroke-width:1.24747354;stroke:#ff0000;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g146"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g148"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g152"
+       style="fill-rule:evenodd;">
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5"
+         y="31.5"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="text150">experimenter : TEXT</text>
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g154"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g158"
+       style="fill-rule:evenodd;">
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5"
+         y="49.5"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="text156">lab_notes : FILE</text>
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g160"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g162"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g164"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g166"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g168"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g172"
+       style="fill-rule:evenodd;stroke-width:1.24747354;stroke-miterlimit:4;stroke-dasharray:none">
+      <rect
+         vector-effect=""
+         x="0"
+         y="0"
+         width="100.93769"
+         height="36"
+         id="rect170"
+         style="stroke-width:1.24747354;stroke:#ff0000;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="700"
+       font-style="normal"
+       id="g174"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,254.24055,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="700"
+       font-style="normal"
+       id="g178"
+       style="fill-rule:evenodd;">
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="15.237368"
+         y="13.5"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="700"
+         font-style="normal"
+         id="text176">Publication</text>
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#ff0000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g182"
+       style="fill-rule:evenodd;stroke-width:1.24747354;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         id="polyline180"
+         style="stroke-width:1.24747354;stroke-miterlimit:4;stroke-dasharray:none"
+         d="m 0,18 100.87997,0"
+         sodipodi:nodetypes="cc" />
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g184"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g186"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g190"
+       style="fill-rule:evenodd;">
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="5"
+         y="31.5"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="text188">author : TEXT</text>
+    </g>
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g192"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g194"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g196"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,243.928,247.296)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g198"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g200"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="700"
+       font-style="normal"
+       id="g206"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g216"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g218"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g224"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g226"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="#ffffc0"
+       fill-opacity="1"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g228"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g230"
+       style="fill-rule:evenodd;" />
+    <g
+       fill="none"
+       stroke="#000000"
+       stroke-opacity="1"
+       stroke-width="1"
+       stroke-linecap="square"
+       stroke-linejoin="bevel"
+       font-family="'Noto Sans'"
+       font-size="12.375px"
+       font-weight="400"
+       font-style="normal"
+       id="g232"
+       style="fill-rule:evenodd;" />
+    <g
+       id="g1454"
+       transform="translate(-42.278435,82.178661)">
+      <rect
+         style="opacity:1;fill:#d7f4d7;stroke:#008000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000;"
+         id="rect1448"
+         width="18.926079"
+         height="13.833775"
+         x="289.03854"
+         y="167.14027"
+         ry="4.099587" />
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="290.79922"
+         y="178.57553"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="700"
+         font-style="normal"
+         id="text1452"
+         style="fill-rule:evenodd;stroke-width:0.992009;"><tspan
+           style="fill:#008000;"
+           id="tspan1450">RT</tspan></text>
+    </g>
+    <g
+       id="g1462"
+       transform="translate(-285.2144,-71.568939)">
+      <rect
+         style="opacity:1;fill:#d7f4d7;stroke:#008000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000;"
+         id="rect1456"
+         width="18.926079"
+         height="13.833775"
+         x="289.03854"
+         y="167.14027"
+         ry="4.099587" />
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="290.79922"
+         y="178.57553"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="700"
+         font-style="normal"
+         id="text1460"
+         style="fill-rule:evenodd;stroke-width:0.992009;"><tspan
+           style="fill:#008000;"
+           id="tspan1458">RT</tspan></text>
+    </g>
+    <g
+       id="g1470"
+       transform="translate(-261.77311,-164.12532)">
+      <rect
+         style="opacity:1;fill:#d7f4d7;stroke:#008000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000;"
+         id="rect1464"
+         width="18.926079"
+         height="13.833775"
+         x="289.03854"
+         y="167.14027"
+         ry="4.099587" />
+      <text
+         fill="#000000"
+         fill-opacity="1"
+         stroke="none"
+         xml:space="preserve"
+         x="290.79922"
+         y="178.57553"
+         font-family="'Noto Sans'"
+         font-size="12.2761px"
+         font-weight="700"
+         font-style="normal"
+         id="text1468"
+         style="fill-rule:evenodd;stroke-width:0.992009;"><tspan
+           style="fill:#008000;"
+           id="tspan1466">RT</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5001px;line-height:1;font-family:Stanberry;-inkscape-font-specification:Stanberry;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.332398;"
+       x="137.87466"
+       y="221.70712"
+       id="text1475"><tspan
+         sodipodi:role="line"
+         id="tspan1473"
+         x="137.87466"
+         y="221.70712"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5001px;font-family:Stanberry;-inkscape-font-specification:Stanberry;fill:#0000ff;stroke-width:0.332398;">Reference</tspan><tspan
+         sodipodi:role="line"
+         x="137.87466"
+         y="238.20723"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5001px;font-family:Stanberry;-inkscape-font-specification:Stanberry;fill:#0000ff;stroke-width:0.332398;"
+         id="tspan1589">Property</tspan></text>
+    <path
+       style="opacity:1;fill:none;stroke:#0000ff;stroke-width:0.839441;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#marker1423);paint-order:markers fill stroke;stop-color:#000000;"
+       d="m 186.1229,210.28948 c 0.17712,-2.11062 7.35694,-8.61449 19.32363,-10.45333 11.96668,-1.83885 12.83929,-3.99319 19.85603,-15.53642"
+       id="path965"
+       sodipodi:nodetypes="czc" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5001px;line-height:1.25;font-family:Stanberry;-inkscape-font-specification:Stanberry;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.332398;"
+       x="154.42661"
+       y="73.855499"
+       id="text1327"><tspan
+         sodipodi:role="line"
+         id="tspan1325"
+         x="154.42661"
+         y="73.855499"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5001px;font-family:Stanberry;-inkscape-font-specification:Stanberry;fill:#0000ff;stroke-width:0.332398;">Inheritance (parent-child)</tspan></text>
+    <path
+       style="opacity:1;fill:none;stroke:#0000ff;stroke-width:0.839441;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow2Lend);paint-order:markers fill stroke;stop-color:#000000;"
+       d="M 167.21,76.655873 C 152.19021,86.915727 140.56955,89.944957 126.44292,88.765028 114.95169,87.805221 104.43934,79.510241 95.374724,73.550088"
+       id="path1329"
+       sodipodi:nodetypes="cac" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5001px;line-height:1.25;font-family:Stanberry;-inkscape-font-specification:Stanberry;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.332398;"
+       x="252.52292"
+       y="112.65959"
+       id="text1517"><tspan
+         sodipodi:role="line"
+         id="tspan1515"
+         x="252.52292"
+         y="112.65959"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5001px;font-family:Stanberry;-inkscape-font-specification:Stanberry;fill:#0000ff;stroke-width:0.332398;">Properties</tspan></text>
+    <path
+       style="opacity:1;fill:none;stroke:#0000ff;stroke-width:0.839441;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#marker1523);paint-order:markers fill stroke;stop-color:#000000;"
+       d="m 248.81133,110.33043 c -2.11061,0.17712 -22.14938,1.99358 -35.25122,12.5406 -13.10185,10.54701 -23.00529,13.62042 -41.71137,14.52454"
+       id="path1519"
+       sodipodi:nodetypes="czc" />
+    <g
+       id="g4897"
+       transform="translate(0,-14.437559)">
+      <g
+         fill="#ffffc0"
+         fill-opacity="1"
+         stroke="#ff0000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="square"
+         stroke-linejoin="bevel"
+         transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g204"
+         style="fill-rule:evenodd;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+        <rect
+           vector-effect=""
+           x="0"
+           y="0"
+           width="151"
+           height="49.96944"
+           id="rect202"
+           style="stroke:#ff0000;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+      </g>
+      <g
+         fill="#ffffc0"
+         fill-opacity="1"
+         stroke="#000000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="square"
+         stroke-linejoin="bevel"
+         transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="700"
+         font-style="normal"
+         id="g210"
+         style="fill-rule:evenodd">
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="49.5"
+           y="13.5"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="700"
+           font-style="normal"
+           id="text208">CellLine</text>
+      </g>
+      <g
+         fill="#ffffc0"
+         fill-opacity="1"
+         stroke="#ff0000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="square"
+         stroke-linejoin="bevel"
+         transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g214"
+         style="fill-rule:evenodd;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none">
+        <polyline
+           fill="none"
+           vector-effect=""
+           points="0,18 151,18 "
+           id="polyline212"
+           style="stroke:#ff0000;stroke-width:1.24747;stroke-miterlimit:4;stroke-dasharray:none" />
+      </g>
+      <g
+         fill="#ffffc0"
+         fill-opacity="1"
+         stroke="#000000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="square"
+         stroke-linejoin="bevel"
+         transform="matrix(0.992009,0,0,0.992009,288.811,165.733)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g222"
+         style="fill-rule:evenodd">
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="5"
+           y="31.5"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="400"
+           font-style="normal"
+           id="text220">publication : Publication</text>
+      </g>
+      <g
+         id="g1446"
+         transform="translate(2.6045662,0.6156617)">
+        <rect
+           style="opacity:1;fill:#d7f4d7;stroke:#008000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000"
+           id="rect1441"
+           width="18.926079"
+           height="13.833775"
+           x="289.03854"
+           y="167.14027"
+           ry="4.099587" />
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="290.79922"
+           y="178.57553"
+           font-family="'Noto Sans'"
+           font-size="12.2761px"
+           font-weight="700"
+           font-style="normal"
+           id="text208-3"
+           style="fill-rule:evenodd;stroke-width:0.992009"><tspan
+             style="fill:#008000"
+             id="tspan1426">RT</tspan></text>
+      </g>
+      <g
+         fill="#ffffc0"
+         fill-opacity="1"
+         stroke="#000000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="square"
+         stroke-linejoin="bevel"
+         transform="matrix(0.992009,0,0,0.992009,288.811,180.17055)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g4881"
+         style="fill-rule:evenodd">
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="5"
+           y="31.5"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="400"
+           font-style="normal"
+           id="text4879">note : TEXT</text>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/src/doc/tutorials/img/simple_data_model.xmi b/src/doc/tutorials/img/simple_data_model.xmi
new file mode 100644
index 0000000000000000000000000000000000000000..0f427ff3bb30666fe099351b6b16dd2b616fa765
--- /dev/null
+++ b/src/doc/tutorials/img/simple_data_model.xmi
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XMI verified="false" xmlns:UML="http://schema.omg.org/spec/UML/1.4" xmi.version="1.2" timestamp="2023-03-10T13:37:51">
+ <XMI.header>
+  <XMI.documentation>
+   <XMI.exporter>umbrello uml modeller 2.32.2 http://umbrello.kde.org</XMI.exporter>
+   <XMI.exporterVersion>1.6.19</XMI.exporterVersion>
+   <XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>
+  </XMI.documentation>
+  <XMI.metamodel xmi.name="UML" href="UML.xml" xmi.version="1.4"/>
+ </XMI.header>
+ <XMI.content>
+  <UML:Model isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="m1" name="UML-Modell" isRoot="false">
+   <UML:Namespace.ownedElement>
+    <UML:Stereotype isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="folder" name="folder" isRoot="false" namespace="m1" visibility="public"/>
+    <UML:Stereotype isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="upqb4wZPdsFug" name="W" isRoot="false" namespace="m1" visibility="public"/>
+    <UML:Model isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="Logical_View" name="Logical View" isRoot="false" namespace="m1" visibility="public">
+     <UML:Namespace.ownedElement>
+      <UML:Package isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="Datatypes" name="Datatypes" isRoot="false" stereotype="folder" namespace="Logical_View" visibility="public">
+       <UML:Namespace.ownedElement>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uEHGpkgpZ5zSa" name="char" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uROhWD5rBLkN7" name="int" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uTEWbFbZg0H7d" name="float" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="u63bynaVhcKPQ" name="double" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="urNIscCDLp6YC" name="bool" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uEFDoBYDJxlwD" name="string" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uUN2gpYYSm0MQ" name="unsigned char" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uaOg7DtUmNa1O" name="signed char" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="u2j8VdnwnD5No" name="unsigned int" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uCM9wQw4MCzTh" name="signed int" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uIiIYk08Eei43" name="short int" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="utj7uju3Bcryx" name="unsigned short int" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="u8CREq18tOkat" name="signed short int" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uq9KZiLh2fPSG" name="long int" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="ul1JcLwsggvUT" name="signed long int" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="urLFa80H4C1WH" name="unsigned long int" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="u2WVtsIOXYKOE" name="long double" isRoot="false" namespace="Datatypes" visibility="public"/>
+        <UML:DataType isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="u6fN7PqC7hndQ" name="wchar_t" isRoot="false" namespace="Datatypes" visibility="public"/>
+       </UML:Namespace.ownedElement>
+      </UML:Package>
+      <UML:Class isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uvUQiWatyXkSJ" name="Experiment" isRoot="false" namespace="Logical_View" visibility="public">
+       <UML:Classifier.feature>
+        <UML:Attribute type="uefR9qLrX0KbN" isSpecification="false" xmi.id="uSJY4vfmi5BN4" name="experimenter" visibility="public"/>
+        <UML:Attribute type="u0du3dSxselXO" isSpecification="false" xmi.id="uFqEtWMUa5mCe" name="lab_notes" visibility="private"/>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uefR9qLrX0KbN" name="TEXT" isRoot="false" namespace="Logical_View" visibility="public"/>
+      <UML:Class isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="u0du3dSxselXO" name="FILE" isRoot="false" namespace="Logical_View" visibility="public"/>
+      <UML:Class isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uAFk8Yy0StoYm" name="CellCultureExperiment" isRoot="false" namespace="Logical_View" visibility="public">
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="u8oRooFrsWVhk"/>
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Attribute type="uefR9qLrX0KbN" isSpecification="false" xmi.id="uNpTs7ekpuH4I" name="experimenter" visibility="public"/>
+        <UML:Attribute type="u0du3dSxselXO" isSpecification="false" xmi.id="uL8s65ael2sWY" name="lab_notes" visibility="private"/>
+        <UML:Attribute type="ur1GkbdOwkjef" isSpecification="false" xmi.id="um6gksRKWydK1" name="number_of_dishes" visibility="public"/>
+        <UML:Attribute type="upcSaMWLBkK65" isSpecification="false" xmi.id="uVKvnnqgPsRga" name="cell_line" visibility="public"/>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="ur1GkbdOwkjef" name="INTEGER" isRoot="false" namespace="Logical_View" visibility="public"/>
+      <UML:Generalization parent="uvUQiWatyXkSJ" isSpecification="false" discriminator="" xmi.id="u8oRooFrsWVhk" child="uAFk8Yy0StoYm" name="" namespace="Logical_View" visibility="public"/>
+      <UML:Class isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="upcSaMWLBkK65" name="CellLine" isRoot="false" namespace="Logical_View" visibility="public">
+       <UML:Classifier.feature>
+        <UML:Attribute type="uO0C1L9PSx1pt" isSpecification="false" xmi.id="utENdz0EM98oE" name="publication" visibility="public"/>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Class isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="uO0C1L9PSx1pt" name="Publication" isRoot="false" namespace="Logical_View" visibility="public">
+       <UML:Classifier.feature>
+        <UML:Attribute type="uefR9qLrX0KbN" isSpecification="false" xmi.id="uBD7YB7ALmZTE" name="author" visibility="private"/>
+       </UML:Classifier.feature>
+      </UML:Class>
+     </UML:Namespace.ownedElement>
+     <XMI.extension xmi.extender="umbrello">
+      <diagrams resolution="99">
+       <diagram showscope="1" showstereotype="1" isopen="1" showpackage="1" textcolor="#000000" canvasheight="284.288" linecolor="#ff0000" canvaswidth="441.137" documentation="" backgroundcolor="#fcfcfc" xmi.id="u89npYrdhZ5hM" showopsig="1" showattribassocs="1" localid="-1" griddotcolor="#eff0f1" zoom="152.08749999999995" usefillcolor="1" showops="1" linewidth="0" name="Klassendiagramm" showatts="1" showpubliconly="0" fillcolor="#ffffc0" font="Noto Sans,9,-1,5,50,0,0,0,0,0,Regular" type="1" snapcsgrid="0" snapy="25" snapx="25" showgrid="0" snapgrid="0" showattsig="1">
+        <widgets>
+         <classwidget showscope="0" showopsigs="602" showstereotype="1" showpackage="1" textcolor="#000000" linecolor="#ff0000" xmi.id="uvUQiWatyXkSJ" usesdiagramusefillcolor="0" showattsigs="602" localid="unUcCTIMGl5Co" usesdiagramfillcolor="0" isinstance="0" usefillcolor="1" linewidth="0" showpubliconly="0" fillcolor="#ffffc0" font="Noto Sans,9,-1,5,50,0,0,0,0,0,Regular" width="135" height="54" showoperations="0" showattributes="1" x="-135.137" y="-456.315" autoresize="1"/>
+         <classwidget showscope="0" showopsigs="602" showstereotype="1" showpackage="1" textcolor="#000000" linecolor="#ff0000" xmi.id="upcSaMWLBkK65" usesdiagramusefillcolor="0" showattsigs="602" localid="ux9toAI1KGWvY" usesdiagramfillcolor="0" isinstance="0" usefillcolor="1" linewidth="0" showpubliconly="0" fillcolor="#ffffc0" font="Noto Sans,9,-1,5,50,0,0,0,0,0,Regular" width="151" height="36" showoperations="0" showattributes="1" x="131.37" y="-290.247" autoresize="1"/>
+         <classwidget showscope="0" showopsigs="602" showstereotype="1" showpackage="1" textcolor="#000000" linecolor="#ff0000" xmi.id="uAFk8Yy0StoYm" usesdiagramusefillcolor="0" showattsigs="602" localid="uCtngsW0eC2Nm" usesdiagramfillcolor="0" isinstance="0" usefillcolor="1" linewidth="0" showpubliconly="0" fillcolor="#ffffc0" font="Noto Sans,9,-1,5,50,0,0,0,0,0,Regular" width="188" height="90" showoperations="0" showattributes="1" x="-158.767" y="-363.013" autoresize="1"/>
+         <classwidget showscope="0" showopsigs="602" showstereotype="1" showpackage="1" textcolor="#000000" linecolor="#ff0000" xmi.id="uO0C1L9PSx1pt" usesdiagramusefillcolor="0" showattsigs="602" localid="udxtFf6VgSeNQ" usesdiagramfillcolor="0" isinstance="0" usefillcolor="1" linewidth="0" showpubliconly="0" fillcolor="#ffffc0" font="Noto Sans,9,-1,5,50,0,0,0,0,0,Regular" width="92" height="36" showoperations="0" showattributes="1" x="86.1255" y="-208.027" autoresize="1"/>
+        </widgets>
+        <messages/>
+        <associations>
+         <assocwidget totalcountb="2" widgetaid="uAFk8Yy0StoYm" totalcounta="2" indexb="1" textcolor="none" linecolor="#ff0000" xmi.id="u8oRooFrsWVhk" usesdiagramusefillcolor="1" localid="uP6sMUUIUwAdw" seqnum="" usesdiagramfillcolor="1" usefillcolor="1" linewidth="0" indexa="1" fillcolor="none" font="Noto Sans,9,-1,5,50,0,0,0,0,0,Regular" widgetbid="uvUQiWatyXkSJ" type="500" autoresize="1">
+          <linepath layout="Direct">
+           <startpoint startx="-68.7281" starty="-363.013"/>
+           <endpoint endx="-68.7281" endy="-402.315"/>
+          </linepath>
+         </assocwidget>
+         <assocwidget totalcountb="2" widgetaid="uAFk8Yy0StoYm" totalcounta="2" indexb="1" textcolor="none" linecolor="#ff0000" xmi.id="uVKvnnqgPsRga" usesdiagramusefillcolor="1" localid="ulyMsjM0nbs3a" seqnum="" changeabilityA="900" usesdiagramfillcolor="1" visibilityA="0" usefillcolor="1" linewidth="0" indexa="1" fillcolor="none" font="Noto Sans,9,-1,5,50,0,0,0,0,0,Regular" changeabilityB="900" widgetbid="upcSaMWLBkK65" type="510" autoresize="1" visibilityB="0">
+          <linepath layout="Direct">
+           <startpoint startx="29.2327" starty="-277.754"/>
+           <endpoint endx="131.37" endy="-277.754"/>
+          </linepath>
+          <floatingtext showstereotype="1" textcolor="none" linecolor="#ff0000" xmi.id="uVGPB1NJvP8wt" usesdiagramusefillcolor="1" localid="uckP5Ky3TvfkT" pretext="+" usesdiagramfillcolor="1" text="cell_line" isinstance="0" usefillcolor="1" linewidth="0" fillcolor="none" font="Noto Sans,9,-1,5,50,0,0,0,0,0,Regular" width="63" posttext="" height="22" x="70" y="-284" autoresize="1" role="710"/>
+         </assocwidget>
+         <assocwidget totalcountb="2" widgetaid="upcSaMWLBkK65" totalcounta="2" indexb="1" textcolor="none" linecolor="#ff0000" xmi.id="utENdz0EM98oE" usesdiagramusefillcolor="1" localid="u8A6XeV5sThX3" seqnum="" changeabilityA="900" usesdiagramfillcolor="1" visibilityA="0" usefillcolor="1" linewidth="0" indexa="1" fillcolor="none" font="Noto Sans,9,-1,5,50,0,0,0,0,0,Regular" changeabilityB="900" widgetbid="uO0C1L9PSx1pt" type="510" autoresize="1" visibilityB="0">
+          <linepath layout="Direct">
+           <startpoint startx="162.345" starty="-254.247"/>
+           <endpoint endx="162.345" endy="-208.027"/>
+          </linepath>
+          <floatingtext showstereotype="1" textcolor="none" linecolor="#ff0000" xmi.id="ufrw1SbOcMWr9" usesdiagramusefillcolor="1" localid="uY15jzXWQtNEA" pretext="+" usesdiagramfillcolor="1" text="publication" isinstance="0" usefillcolor="1" linewidth="0" fillcolor="none" font="Noto Sans,9,-1,5,50,0,0,0,0,0,Regular" width="81" posttext="" height="22" x="103" y="-235" autoresize="1" role="710"/>
+         </assocwidget>
+        </associations>
+       </diagram>
+      </diagrams>
+     </XMI.extension>
+    </UML:Model>
+    <UML:Model isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="Use_Case_View" name="Use Case View" isRoot="false" namespace="m1" visibility="public">
+     <UML:Namespace.ownedElement/>
+    </UML:Model>
+    <UML:Model isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="Component_View" name="Component View" isRoot="false" namespace="m1" visibility="public">
+     <UML:Namespace.ownedElement/>
+    </UML:Model>
+    <UML:Model isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="Deployment_View" name="Deployment View" isRoot="false" namespace="m1" visibility="public">
+     <UML:Namespace.ownedElement/>
+    </UML:Model>
+    <UML:Model isLeaf="false" isSpecification="false" isAbstract="false" xmi.id="Entity_Relationship_Model" name="Entity Relationship Model" isRoot="false" namespace="m1" visibility="public">
+     <UML:Namespace.ownedElement/>
+    </UML:Model>
+   </UML:Namespace.ownedElement>
+  </UML:Model>
+ </XMI.content>
+ <XMI.extensions xmi.extender="umbrello">
+  <docsettings viewid="u89npYrdhZ5hM" documentation="" uniqueid="u1Nwn5m62fx8p"/>
+  <listview>
+   <listitem id="Views" type="800" open="1">
+    <listitem id="Use_Case_View" type="802" open="1"/>
+    <listitem id="Entity_Relationship_Model" type="836" open="1"/>
+    <listitem id="Component_View" type="821" open="1"/>
+    <listitem id="Logical_View" type="801" open="1">
+     <listitem id="uAFk8Yy0StoYm" type="813" open="1">
+      <listitem id="uVKvnnqgPsRga" type="814" open="0"/>
+      <listitem id="uNpTs7ekpuH4I" type="814" open="0"/>
+      <listitem id="uL8s65ael2sWY" type="814" open="0"/>
+      <listitem id="um6gksRKWydK1" type="814" open="0"/>
+     </listitem>
+     <listitem id="upcSaMWLBkK65" type="813" open="1">
+      <listitem id="utENdz0EM98oE" type="814" open="0"/>
+     </listitem>
+     <listitem id="Datatypes" type="830" open="0">
+      <listitem id="urNIscCDLp6YC" type="829" open="0"/>
+      <listitem id="uEHGpkgpZ5zSa" type="829" open="0"/>
+      <listitem id="u63bynaVhcKPQ" type="829" open="0"/>
+      <listitem id="uTEWbFbZg0H7d" type="829" open="0"/>
+      <listitem id="uROhWD5rBLkN7" type="829" open="0"/>
+      <listitem id="u2WVtsIOXYKOE" type="829" open="0"/>
+      <listitem id="uq9KZiLh2fPSG" type="829" open="0"/>
+      <listitem id="uIiIYk08Eei43" type="829" open="0"/>
+      <listitem id="uaOg7DtUmNa1O" type="829" open="0"/>
+      <listitem id="uCM9wQw4MCzTh" type="829" open="0"/>
+      <listitem id="ul1JcLwsggvUT" type="829" open="0"/>
+      <listitem id="u8CREq18tOkat" type="829" open="0"/>
+      <listitem id="uEFDoBYDJxlwD" type="829" open="0"/>
+      <listitem id="uUN2gpYYSm0MQ" type="829" open="0"/>
+      <listitem id="u2j8VdnwnD5No" type="829" open="0"/>
+      <listitem id="urLFa80H4C1WH" type="829" open="0"/>
+      <listitem id="utj7uju3Bcryx" type="829" open="0"/>
+      <listitem id="u6fN7PqC7hndQ" type="829" open="0"/>
+     </listitem>
+     <listitem id="uvUQiWatyXkSJ" type="813" open="1">
+      <listitem id="uSJY4vfmi5BN4" type="814" open="0"/>
+      <listitem id="uFqEtWMUa5mCe" type="814" open="0"/>
+     </listitem>
+     <listitem id="u0du3dSxselXO" type="813" open="1"/>
+     <listitem id="ur1GkbdOwkjef" type="813" open="1"/>
+     <listitem id="u89npYrdhZ5hM" type="807" label="Klassendiagramm" open="0"/>
+     <listitem id="uO0C1L9PSx1pt" type="813" open="1">
+      <listitem id="uBD7YB7ALmZTE" type="814" open="0"/>
+     </listitem>
+     <listitem id="uefR9qLrX0KbN" type="813" open="1"/>
+    </listitem>
+    <listitem id="Deployment_View" type="827" open="1"/>
+   </listitem>
+  </listview>
+  <codegeneration>
+   <codegenerator language="C++"/>
+  </codegeneration>
+ </XMI.extensions>
+</XMI>
diff --git a/src/doc/tutorials/img/very_simple_data_model.png b/src/doc/tutorials/img/very_simple_data_model.png
new file mode 100644
index 0000000000000000000000000000000000000000..793767b95b869bf2bfb20315bd9023a1b486bac6
Binary files /dev/null and b/src/doc/tutorials/img/very_simple_data_model.png differ
diff --git a/src/doc/tutorials/img/very_simple_data_model.svg b/src/doc/tutorials/img/very_simple_data_model.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ca1b6f923ad32c04a3302a02f16c782531e002f4
--- /dev/null
+++ b/src/doc/tutorials/img/very_simple_data_model.svg
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="56.61758mm"
+   height="20.597263mm"
+   viewBox="0 0 220.67571 80.280722"
+   version="1.2"
+   id="svg236"
+   sodipodi:docname="very_simple_data_model.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
+   inkscape:export-filename="/home/daniel/indiscale/management/external/bmpg/management/documentation/data_model/how_to_datamodel/very_simple_data_model.png"
+   inkscape:export-xdpi="897.25"
+   inkscape:export-ydpi="897.25">
+  <metadata
+     id="metadata240">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Qt SVG Document</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1135"
+     id="namedview238"
+     showgrid="false"
+     inkscape:zoom="3.6046958"
+     inkscape:cx="160.39549"
+     inkscape:cy="4.7271483"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1"
+     inkscape:document-rotation="0" />
+  <title
+     id="title2">Qt SVG Document</title>
+  <desc
+     id="desc4">Generated with Qt</desc>
+  <defs
+     id="defs6">
+    <marker
+       style="overflow:visible"
+       id="marker1523"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path1521" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker1333"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend"
+       inkscape:isstock="true">
+      <path
+         transform="scale(-0.6)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path1331" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow1Mend"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Mend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-0.4,0,0,-0.4,-4,0)"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         id="path976" />
+    </marker>
+  </defs>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="Layer 1"
+     transform="translate(-88.927441,-46.784756)">
+    <g
+       id="g1749"
+       transform="translate(150.56113,71.817619)">
+      <rect
+         x="24.4333"
+         y="0.99200898"
+         width="133.92122"
+         height="53.568485"
+         id="rect132"
+         style="font-style:normal;font-weight:400;font-size:12.375px;font-family:'Noto Sans';fill:#ffffc0;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.37501;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <g
+         fill="#ffffc0"
+         fill-opacity="1"
+         stroke="#000000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="square"
+         stroke-linejoin="bevel"
+         transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="700"
+         font-style="normal"
+         id="g140"
+         style="fill-rule:evenodd">
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="30.5"
+           y="13.5"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="700"
+           font-style="normal"
+           id="text138">Experiment</text>
+      </g>
+      <g
+         fill="#ffffc0"
+         fill-opacity="1"
+         stroke="#ff0000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="square"
+         stroke-linejoin="bevel"
+         transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g144"
+         style="fill-rule:evenodd;stroke-width:1.38608;stroke-miterlimit:4;stroke-dasharray:none">
+        <polyline
+           fill="none"
+           points="0,18 135,18 "
+           id="polyline142"
+           style="stroke-width:1.38608;stroke-miterlimit:4;stroke-dasharray:none" />
+      </g>
+      <g
+         fill="#ffffc0"
+         fill-opacity="1"
+         stroke="#000000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="square"
+         stroke-linejoin="bevel"
+         transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g152"
+         style="fill-rule:evenodd">
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="5"
+           y="31.5"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="400"
+           font-style="normal"
+           id="text150">experimenter : TEXT</text>
+      </g>
+      <g
+         fill="#ffffc0"
+         fill-opacity="1"
+         stroke="#000000"
+         stroke-opacity="1"
+         stroke-width="1"
+         stroke-linecap="square"
+         stroke-linejoin="bevel"
+         transform="matrix(0.992009,0,0,0.992009,24.4333,0.992009)"
+         font-family="'Noto Sans'"
+         font-size="12.375px"
+         font-weight="400"
+         font-style="normal"
+         id="g158"
+         style="fill-rule:evenodd">
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="5"
+           y="49.5"
+           font-family="'Noto Sans'"
+           font-size="12.375px"
+           font-weight="400"
+           font-style="normal"
+           id="text156">lab_notes : FILE</text>
+      </g>
+      <g
+         id="g1470"
+         transform="translate(-261.77311,-164.12532)">
+        <rect
+           style="opacity:1;fill:#d7f4d7;stroke:#008000;stroke-width:0.839788;paint-order:markers fill stroke;stop-color:#000000"
+           id="rect1464"
+           width="18.926079"
+           height="13.833775"
+           x="289.03854"
+           y="167.14027"
+           ry="4.099587" />
+        <text
+           fill="#000000"
+           fill-opacity="1"
+           stroke="none"
+           xml:space="preserve"
+           x="290.79922"
+           y="178.57553"
+           font-family="'Noto Sans'"
+           font-size="12.2761px"
+           font-weight="700"
+           font-style="normal"
+           id="text1468"
+           style="fill-rule:evenodd;stroke-width:0.992009"><tspan
+             style="fill:#008000"
+             id="tspan1466">RT</tspan></text>
+      </g>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5001px;line-height:1.25;font-family:Stanberry;-inkscape-font-specification:Stanberry;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.332398"
+       x="88.282906"
+       y="58.603783"
+       id="text1517"><tspan
+         sodipodi:role="line"
+         id="tspan1515"
+         x="88.282906"
+         y="58.603783"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5001px;font-family:Stanberry;-inkscape-font-specification:Stanberry;fill:#0000ff;stroke-width:0.332398">RecordType</tspan></text>
+    <path
+       style="opacity:1;fill:none;stroke:#0000ff;stroke-width:0.839441;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#marker1523);paint-order:markers fill stroke;stop-color:#000000"
+       d="m 104.62524,64.323266 c 1.42777,5.850954 10.16944,13.595229 20.72552,16.588753 15.03521,4.263734 24.20804,-2.690657 44.43576,-0.92334"
+       id="path1519"
+       sodipodi:nodetypes="csc" />
+  </g>
+</svg>
diff --git a/src/doc/tutorials/statemachine.rst b/src/doc/tutorials/statemachine.rst
index 317620423e6221ccaf29297fc1f71f0c008f78a0..dc46885a39548042314e77c76b1578e1a8ac2a74 100644
--- a/src/doc/tutorials/statemachine.rst
+++ b/src/doc/tutorials/statemachine.rst
@@ -30,5 +30,5 @@ of Records that have that parent. For example by executing:
 .. code-block:: Python
 
     rt = db.RecordType("Article").retrieve()
-    rt.state = db.State(name="UnPublished", model="Publish Life-cycle")``
+    rt.state = db.State(name="UnPublished", model="Publish Life-cycle")
     rt.update()
diff --git a/src/main/java/org/caosdb/server/ServerProperties.java b/src/main/java/org/caosdb/server/ServerProperties.java
index 87f5b22d55dfc11a8ae0158df85fa69d2b6cdc9d..d58250242f691498288d765dd252986eda7fb09f 100644
--- a/src/main/java/org/caosdb/server/ServerProperties.java
+++ b/src/main/java/org/caosdb/server/ServerProperties.java
@@ -31,6 +31,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Properties;
+import org.caosdb.server.query.Query;
 import org.caosdb.server.utils.AbstractObservable;
 import org.caosdb.server.utils.Observable;
 import org.caosdb.server.utils.Observer;
@@ -114,6 +115,7 @@ public class ServerProperties extends Properties implements Observable {
 
   public static final String KEY_QUERY_FILTER_ENTITIES_WITHOUT_RETRIEVE_PERMISSIONS =
       "QUERY_FILTER_ENTITIES_WITHOUT_RETRIEVE_PERMISSIONS";
+  public static final String KEY_FIND_QUERY_DEFAULT_ROLE = "FIND_QUERY_DEFAULT_ROLE";
 
   public static final String KEY_SERVER_NAME = "SERVER_NAME";
 
@@ -199,9 +201,25 @@ public class ServerProperties extends Properties implements Observable {
         logger.info(name + "=" + val);
       }
     }
+
+    sanityCheck(serverProperties);
+
     return serverProperties;
   }
 
+  private static void sanityCheck(ServerProperties serverProperties) {
+    try {
+      Query.Role.valueOf(serverProperties.getProperty(KEY_FIND_QUERY_DEFAULT_ROLE));
+    } catch (IllegalArgumentException e) {
+      logger.error(
+          "Unsupported value for server property "
+              + KEY_FIND_QUERY_DEFAULT_ROLE
+              + ": "
+              + serverProperties.getProperty(KEY_FIND_QUERY_DEFAULT_ROLE));
+      System.exit(1);
+    }
+  }
+
   private static void loadConfigFile(final Properties serverProperties, final File confFile)
       throws IOException {
     if (confFile.exists() && confFile.isFile()) {
diff --git a/src/main/java/org/caosdb/server/database/DatabaseUtils.java b/src/main/java/org/caosdb/server/database/DatabaseUtils.java
index 47e8a9afe4fb2d81d40e71aff01c81ea314a26ca..5280de17d91982db0481105af8c9ca760db1384f 100644
--- a/src/main/java/org/caosdb/server/database/DatabaseUtils.java
+++ b/src/main/java/org/caosdb/server/database/DatabaseUtils.java
@@ -96,7 +96,11 @@ public class DatabaseUtils {
         && !p.isDatatypeOverride()
         && (!p.hasProperties() || hasUniquePropertyId(p, e))
         && !(p.getDatatype() instanceof AbstractCollectionDatatype)) {
-      // if p has no sub-properties, just add it
+      // this property can be represented without any replacement. We explicitly
+      // setReplacement(null) because there is a corner case (related to the inheritance of
+      // properties) where there is a replacement present which belongs to the parent entity, see
+      // https://gitlab.com/caosdb/caosdb-server/-/issues/216.
+      p.setReplacement(null);
     } else {
       stage1Inserts.add(makeReplacement(p));
     }
diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java
index 2668e770d6f779e0b3121f30aa1778dccf6c9d93..48367508112c2c3267abd771fa84eb21ea16a534 100644
--- a/src/main/java/org/caosdb/server/entity/Entity.java
+++ b/src/main/java/org/caosdb/server/entity/Entity.java
@@ -1004,7 +1004,7 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
 
   @Override
   public boolean skipJob() {
-    return false;
+    return this.entityStatus == EntityStatus.IGNORE;
   }
 
   @Override
diff --git a/src/main/java/org/caosdb/server/entity/xml/ParentToElementStrategy.java b/src/main/java/org/caosdb/server/entity/xml/ParentToElementStrategy.java
index 4f7906829427a2305f0f1b2addf72d2b69112a9e..2556fdb21bbb55252144a4200f75a265a562af74 100644
--- a/src/main/java/org/caosdb/server/entity/xml/ParentToElementStrategy.java
+++ b/src/main/java/org/caosdb/server/entity/xml/ParentToElementStrategy.java
@@ -26,7 +26,6 @@ package org.caosdb.server.entity.xml;
 
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.wrapper.Parent;
-import org.caosdb.server.utils.EntityStatus;
 import org.jdom2.Element;
 
 /**
@@ -51,15 +50,4 @@ public class ParentToElementStrategy extends EntityToElementStrategy {
     }
     return element;
   }
-
-  @Override
-  public Element addToElement(
-      final EntityInterface entity,
-      final Element element,
-      final SerializeFieldStrategy setFieldStrategy) {
-    if (entity.getEntityStatus() != EntityStatus.IGNORE) {
-      element.addContent(toElement(entity, setFieldStrategy));
-    }
-    return element;
-  }
 }
diff --git a/src/main/java/org/caosdb/server/jobs/Job.java b/src/main/java/org/caosdb/server/jobs/Job.java
index 0e9d7ef79377884853caa2198c84d428aed38e01..9da74edd0db86f6d81a8636020afcdaf3faa9e09 100644
--- a/src/main/java/org/caosdb/server/jobs/Job.java
+++ b/src/main/java/org/caosdb/server/jobs/Job.java
@@ -555,7 +555,7 @@ public abstract class Job {
    *
    * @param entity the entity to be resolved.
    * @return the resolved entity.
-   * @throws EntityWasNotUniqueException if the resolution failed due to ambuiguity of the name.
+   * @throws EntityWasNotUniqueException if the resolution failed due to ambiguity of the name.
    */
   protected EntityInterface resolve(final EntityInterface entity)
       throws EntityWasNotUniqueException {
diff --git a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java
index 4217c55e1153dafc302630823873fc75640ca9be..ede7658580811671f19f955f36faa59db4df922f 100644
--- a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java
+++ b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java
@@ -1,9 +1,10 @@
 /*
- * ** header v3.0
  * This file is a part of the CaosDB Project.
  *
  * Copyright (C) 2018 Research Group Biomedical Physics,
  * Max-Planck-Institute for Dynamics and Self-Organization Göttingen
+ * Copyright (C) 2023 Timm Fitschen <t.fitschen@indiscale.com>
+ * Copyright (C) 2023 IndiScale <info@indiscale.com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
@@ -17,17 +18,17 @@
  *
  * 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
  */
 package org.caosdb.server.jobs.core;
 
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.subject.Subject;
 import org.caosdb.server.accessControl.ACMPermissions;
-import org.caosdb.server.database.backend.transaction.RetrieveSparseEntity;
+import org.caosdb.server.entity.DeleteEntity;
 import org.caosdb.server.entity.EntityInterface;
-import org.caosdb.server.entity.wrapper.Parent;
+import org.caosdb.server.entity.InsertEntity;
+import org.caosdb.server.entity.Role;
+import org.caosdb.server.entity.UpdateEntity;
 import org.caosdb.server.jobs.ContainerJob;
 import org.caosdb.server.jobs.JobAnnotation;
 import org.caosdb.server.jobs.TransactionStage;
@@ -35,6 +36,14 @@ import org.caosdb.server.transaction.Retrieve;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
 
+/**
+ * Checks the TRANSACTION:* permissions before a transaction begins.
+ *
+ * <p>Users need TRANSACTION:INSERT:?ENTITY_ROLE? permission to insert an entity of the particular
+ * entity role. Likewise, they need the TRANSACTION:UPDATE or TRANSACTION:DELETE permissions.
+ *
+ * @author Timm Fitschen <f.fitschen@indiscale.com>
+ */
 @JobAnnotation(stage = TransactionStage.INIT)
 public class AccessControl extends ContainerJob {
 
@@ -46,12 +55,15 @@ public class AccessControl extends ContainerJob {
       super(permission, description);
     }
 
-    public final String toString(String entityRole) {
-      return toString().replace(ENTITY_ROLE_PARAMETER, entityRole);
+    public final String toString(Role entityRole) {
+      String roleString = entityRole == null ? "" : entityRole.toString();
+      return toString().replace(ENTITY_ROLE_PARAMETER, roleString);
     }
 
-    public final String toString(String transaction, String entityRole) {
-      return "TRANSACTION:" + transaction + (entityRole != null ? (":" + entityRole) : "");
+    public final String toString(String transaction, Role entityRole) {
+      return "TRANSACTION:"
+          + transaction
+          + (entityRole != null ? (":" + entityRole.toString()) : "");
     }
 
     public static String init() {
@@ -80,38 +92,26 @@ public class AccessControl extends ContainerJob {
   protected void run() {
     final Subject subject = SecurityUtils.getSubject();
 
-    // subject has complete permissions for this kind of transaction
-    if (subject.isPermitted(
-        TRANSACTION_PERMISSIONS.toString(getTransaction().getClass().getSimpleName(), null))) {
-      return;
-    }
-
     if (getTransaction() instanceof Retrieve) {
       return;
     }
 
     for (final EntityInterface e : getContainer()) {
 
-      // per role permission
-      if (subject.isPermitted(
-          TRANSACTION_PERMISSIONS.toString(
-              getTransaction().getClass().getSimpleName(), e.getRole().toString()))) {
-        continue;
-      }
-
-      // special annotations permission
-      if (e.hasParents() && e.getParents().size() == 1) {
-        final Parent par1 = e.getParents().get(0);
-        if (par1.hasId() && !par1.getId().isTemporary()) {
-          execute(new RetrieveSparseEntity(par1));
+      if (e instanceof InsertEntity) {
+        if (subject.isPermitted(INSERT.toString(e.getRole()))) {
+          continue;
         }
-        if (par1.hasName()
-            && par1.getName().equals("CommentAnnotation")
-            && subject.isPermitted(
-                getTransaction().getClass().getSimpleName() + ":CommentAnnotation")) {
+      } else if (e instanceof DeleteEntity) {
+        if (subject.isPermitted(DELETE.toString(e.getRole()))) {
+          continue;
+        }
+      } else if (e instanceof UpdateEntity) {
+        if (subject.isPermitted(UPDATE.toString(e.getRole()))) {
           continue;
         }
       }
+
       e.setEntityStatus(EntityStatus.UNQUALIFIED);
       e.addMessage(ServerMessages.AUTHORIZATION_ERROR);
     }
diff --git a/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java b/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
index 352a7428f2007fc59cbf0b3fb7f067d1198857c1..2d7a45d099fa5bec35586b58257eb2c71d61cbe0 100644
--- a/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
+++ b/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
@@ -31,30 +31,51 @@ import org.caosdb.server.jobs.JobAnnotation;
 import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.query.Query;
 import org.caosdb.server.query.Query.ParsingException;
+import org.caosdb.server.transaction.Retrieve;
+import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
 
-@JobAnnotation(flag = "query", stage = TransactionStage.INIT)
+@JobAnnotation(flag = "query", stage = TransactionStage.INIT, transaction = Retrieve.class)
 public class ExecuteQuery extends FlagJob {
 
   @Override
   protected void job(final String value) {
 
     if (value != null) {
+      // run paging job first
+      getTransaction().getSchedule().runJob(null, Paging.class);
+
       final Query queryInstance =
           new Query(value, getTransaction().getTransactor(), getContainer());
       getContainer().setQuery(queryInstance);
       try {
         queryInstance.execute(getTransaction().getAccess());
       } catch (final ParsingException e) {
-        getContainer().addError(ServerMessages.QUERY_PARSING_ERROR);
+        getContainer().addError(ServerMessages.QUERY_PARSING_ERROR(e.getMessage()));
       } catch (final UnsupportedOperationException e) {
         getContainer().addError(ServerMessages.QUERY_EXCEPTION);
         getContainer()
             .addMessage(new Message(MessageType.Info, (MessageCode) null, e.getMessage()));
       }
       getContainer().addMessage(queryInstance);
+
+      int startIndex = 0;
+      int endIndex = getContainer().size();
+
+      if (((Retrieve) getTransaction()).hasPaging()) {
+        Retrieve.Paging paging = ((Retrieve) getTransaction()).getPaging();
+        startIndex = Math.min(getContainer().size(), paging.startIndex);
+        endIndex = Math.min(getContainer().size(), paging.endIndex);
+      }
+
+      int ii = 0;
       for (final EntityInterface entity : getContainer()) {
-        getTransaction().getSchedule().addAll(loadJobs(entity, getTransaction()));
+        if (ii >= startIndex && ii < endIndex) {
+          getTransaction().getSchedule().addAll(loadJobs(entity, getTransaction()));
+        } else {
+          entity.setEntityStatus(EntityStatus.IGNORE);
+        }
+        ii++;
       }
     }
   }
diff --git a/src/main/java/org/caosdb/server/jobs/core/Inheritance.java b/src/main/java/org/caosdb/server/jobs/core/Inheritance.java
index 33c7772811d36a5b9430556fc8926e88e2cd302c..a1bd800c7ca40b28d7b9ff27dd8f828ed112891f 100644
--- a/src/main/java/org/caosdb/server/jobs/core/Inheritance.java
+++ b/src/main/java/org/caosdb/server/jobs/core/Inheritance.java
@@ -119,7 +119,7 @@ public class Inheritance extends EntityJob {
       }
 
       // implement properties
-      if (getEntity().hasProperties()) {
+      if (getEntity().getEntityStatus() == EntityStatus.QUALIFIED && getEntity().hasProperties()) {
         propertyLoop:
         for (final Property property : getEntity().getProperties()) {
           final ArrayList<Property> transfer = new ArrayList<>();
diff --git a/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java b/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java
index 5b5418286a81d442822aed0e7252fa4557fb21ff..6390ad7cf6da2483a1589432b2c82ba7dfd1dfae 100644
--- a/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java
+++ b/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java
@@ -60,7 +60,7 @@ import org.caosdb.server.utils.Utils;
     loadOnDefault = false,
     stage = TransactionStage.INIT,
     description =
-        "For expert users only! Risk of creating spam records!\nValue of this flag might be any directory on the servers local file system which is part of the server's back-end file storage. This job will insert every readable, nonhidden file in said directory into the database and link the file with a symlink. This is useful to add a huge amount of files without actully copying them to the back-end file storage. If you call this job on a directory more than once every file that was recently added to the source directory is inserted. Every yet known file is left untouched. \nOptional parameter -e EXCLUDE: A regular expression of files which are to be ignored. \n Optional parameter -i INCLUDE: a regular expression of files which are to be included. By default, all files are included. The -e takes precedence. \nOptional parameter -p PREFIX: Stores all new files into the directory PREFIX in the server's file system.\nOptional parameter --force-allow-symlinks: Simlinks in your data are a source of problems for the database. Therefore, simlinks are ignored by default. This option allows symlinks (but still generates simlink warnings). \nPrepend/Dry run: Call this flag with a retrieve transaction (HTTP GET) and it will only count all files and list them without actually inserting them.")
+        "For expert users only! Risk of creating spam records!\nValue of this flag may be any directory on the servers local file system which is part of the server's back-end file storage. This job will insert every readable, nonhidden file in said directory into the database and link the file with a symlink. This is useful to add a huge amount of files without actually copying them to the back-end file storage. If you call this job on a directory more than once every file that was recently added to the source directory is inserted. Every already known file is left untouched. \nOptional parameter -e EXCLUDE: A regular expression of files which are to be ignored. \n Optional parameter -i INCLUDE: a regular expression of files which are to be included. By default, all files are included. The -e takes precedence. \nOptional parameter -p PREFIX: Stores all new files into the directory PREFIX in the server's file system.\nOptional parameter --force-allow-symlinks: Symlinks in your data are a source of problems for the database. Therefore, simlinks are ignored by default. This option allows symlinks (but still generates simlink warnings). \nPrepend/Dry run: Call this flag with a retrieve transaction (HTTP GET) and it will only count all files and list them without actually inserting them.")
 public class InsertFilesInDir extends FlagJob {
 
   private File tmp = null;
@@ -95,6 +95,11 @@ public class InsertFilesInDir extends FlagJob {
     return ret;
   }
 
+  /**
+   * Parse the value string and store the content in this Job.
+   *
+   * @return The path to the source directory as given by the flag parameter.
+   */
   public String parseValue(String value) {
 
     String ret = value;
@@ -217,7 +222,7 @@ public class InsertFilesInDir extends FlagJob {
         } else {
           i++;
           final String targetPath = root + sub.getName();
-          final EntityInterface newFileEntity = createInsertFileEntity(sub.getName());
+          final EntityInterface newFileEntity = createInsertFileEntity();
           final long size = sub.length();
           final FileProperties fp = new FileProperties(null, targetPath, size);
           newFileEntity.setFileProperties(fp);
@@ -266,14 +271,13 @@ public class InsertFilesInDir extends FlagJob {
    * Create a new InsertEntity (if this is an actual run) or a new RetrieveEntity (in dry-run mode)
    * with {@link Role.File}.
    *
-   * @param name the file name
    * @return new File entity
    */
-  private EntityInterface createInsertFileEntity(String name) {
+  private EntityInterface createInsertFileEntity() {
     if (getTransaction() instanceof WriteTransactionInterface) {
-      return new InsertEntity(name, Role.File);
+      return new InsertEntity((String) null, Role.File);
     }
-    EntityInterface result = new RetrieveEntity(name);
+    EntityInterface result = new RetrieveEntity((String) null);
     result.setRole(Role.File);
     return result;
   }
diff --git a/src/main/java/org/caosdb/server/jobs/core/Paging.java b/src/main/java/org/caosdb/server/jobs/core/Paging.java
index 5f2a6ed62f48f20d09c34c8ee34190231903ffe7..aa918ecfe2ac20b90b019b5ace91bde05ccac9ef 100644
--- a/src/main/java/org/caosdb/server/jobs/core/Paging.java
+++ b/src/main/java/org/caosdb/server/jobs/core/Paging.java
@@ -31,7 +31,7 @@ import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.transaction.Retrieve;
 import org.caosdb.server.utils.EntityStatus;
 
-@JobAnnotation(flag = "P", stage = TransactionStage.PRE_TRANSACTION)
+@JobAnnotation(flag = "P", stage = TransactionStage.INIT, transaction = Retrieve.class)
 public class Paging extends FlagJob {
 
   public static final int DEFAULT_LENGTH = 100;
@@ -42,20 +42,24 @@ public class Paging extends FlagJob {
   protected void job(final String value) {
     if (getTransaction() instanceof Retrieve) {
       if (value != null) {
-        int index1 = DEFAULT_INDEX;
-        int index2 = index1 + DEFAULT_LENGTH;
+        int startIndex = DEFAULT_INDEX;
+        int endIndex = startIndex + DEFAULT_LENGTH;
         final Matcher m = pattern.matcher(value);
         if (m.matches()) {
           if (m.group(1) != null) {
-            index1 = Integer.parseInt(m.group(1));
+            startIndex = Integer.parseInt(m.group(1));
           }
           if (m.group(2) != null) {
-            index2 = index1 + Integer.parseInt(m.group(2));
+            endIndex = startIndex + Integer.parseInt(m.group(2));
           }
         }
+
+        // this info may be used by other jobs
+        ((Retrieve) getTransaction()).setPaging(startIndex, endIndex);
+
         int i = 0;
         for (final EntityInterface e : getContainer()) {
-          if (i >= index2 || i < index1) {
+          if (i >= endIndex || i < startIndex) {
             // do not retrieve this entity
             e.setEntityStatus(EntityStatus.IGNORE);
           }
diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java
index 7cd7791e0b27f1ec1d5e67e047e7f1cbe177948c..a89385e29f458ad3ad15eea0d9e6b6bf7640bca6 100644
--- a/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java
+++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java
@@ -27,19 +27,43 @@ import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
 import org.caosdb.server.jobs.TransactionStage;
+import org.caosdb.server.transaction.Retrieve;
+import org.caosdb.server.utils.EntityStatus;
 
-@JobAnnotation(flag = "all", stage = TransactionStage.INIT)
+@JobAnnotation(flag = "all", stage = TransactionStage.INIT, transaction = Retrieve.class)
 public class RetrieveAllJob extends FlagJob {
 
   @Override
   protected void job(String value) {
     if (getContainer().isEmpty()) {
+      // run paging job first
+      getTransaction().getSchedule().runJob(null, Paging.class);
+
       if (value == null) {
         value = "ENTITY";
       }
+
       execute(new RetrieveAll(getContainer(), value));
+
+      int startIndex = 0;
+      int endIndex = getContainer().size();
+
+      if (((Retrieve) getTransaction()).hasPaging()) {
+        startIndex =
+            Math.min(getContainer().size(), ((Retrieve) getTransaction()).getPaging().startIndex);
+        endIndex =
+            Math.min(getContainer().size(), ((Retrieve) getTransaction()).getPaging().endIndex);
+      }
+
+      // only add jobs for those which are on this page
+      int ii = 0;
       for (EntityInterface entity : getContainer()) {
-        getTransaction().getSchedule().addAll(loadJobs(entity, getTransaction()));
+        if (ii >= startIndex && ii < endIndex) {
+          getTransaction().getSchedule().addAll(loadJobs(entity, getTransaction()));
+        } else {
+          entity.setEntityStatus(EntityStatus.IGNORE);
+        }
+        ii++;
       }
     }
   }
diff --git a/src/main/java/org/caosdb/server/query/CQLLexer.g4 b/src/main/java/org/caosdb/server/query/CQLLexer.g4
index 99c9879de7a772c6032decc51486fe7485d869e5..be6dcfa99d2f9c48cba8a0f7fccb7f97b277e01d 100644
--- a/src/main/java/org/caosdb/server/query/CQLLexer.g4
+++ b/src/main/java/org/caosdb/server/query/CQLLexer.g4
@@ -21,93 +21,115 @@
  */
 lexer grammar CQLLexer;
 
+/** */
 AS_A:
     [Aa][Ss] (WHITE_SPACE_f? A)? WHITE_SPACE_f?
 ;
 
+/** */
 IS_REFERENCED:
     (IS_f WHITE_SPACE_f?)? [Rr][Ee][Ff][Ee][Rr][Ee][Nn][Cc][Ee][Dd] WHITE_SPACE_f?
 ;
 
+/** */
 BY:
     [Bb][Yy] WHITE_SPACE_f?
 ;
 
+/** */
 fragment
 OF_f:
     [Oo][Ff]
 ;
 
+/** */
 fragment
 ANY_f:
     [Aa][Nn][Yy]
 ;
 
+/** */
 fragment
 VERSION_f:
     [Vv][Ee][Rr][Ss][Ii][Oo][Nn]
 ;
 
+/** */
 ANY_VERSION_OF:
     (ANY_f WHITE_SPACE_f VERSION_f WHITE_SPACE_f OF_f) WHITE_SPACE_f?
 ;
 
+/** */
 SELECT:
     [Ss][Ee][Ll][Ee][Cc][Tt] WHITE_SPACE_f? -> pushMode(SELECT_MODE)
 ;
 
+/** */
 INSERTED:
     [Ii][Nn][Ss][Ee][Rr][Tt][Ee][Dd] WHITE_SPACE_f?
 ;
 
+/** */
 CREATED:
     [Cc][Rr][Ee][Aa][Tt][Ee][Dd] WHITE_SPACE_f?
 ;
 
+/** */
 UPDATED:
     [Uu][Pp][Dd][Aa][Tt][Ee][Dd] WHITE_SPACE_f?
 ;
 
+/** */
 ON:
     [Oo][Nn] WHITE_SPACE_f?
 ;
 
+/** */
 IN:
     [Ii][Nn] WHITE_SPACE_f?
 ;
 
+/** */
 AFTER:
     [Aa][Ff][Tt][Ee][Rr] WHITE_SPACE_f?
 ;
 
+/** */
 BEFORE:
     [Bb][Ee][Ff][Oo][Rr][Ee] WHITE_SPACE_f?
 ;
 
+/** */
 UNTIL:
     [Uu][Nn][Tt][Ii][Ll] WHITE_SPACE_f?
 ;
 
+/** */
 SINCE:
     [Ss][Ii][Nn][Cc][Ee] WHITE_SPACE_f?
 ;
 
+/** */
 IS_STORED_AT:
     (IS_f WHITE_SPACE_f?)? [Ss][Tt][Oo][Rr][Ee][Dd] (WHITE_SPACE_f? AT)? WHITE_SPACE_f?
 ;
 
+/** */
 AT:
     [Aa][Tt] WHITE_SPACE_f?
 ;
 
+/** */
 FIND:
     [Ff][Ii][Nn][Dd] WHITE_SPACE_f?
 ;
 
+/** */
 COUNT:
     [Cc][Oo][Uu][Nn][Tt] WHITE_SPACE_f?
 ;
 
+/** */
 AND:
     (
         (
@@ -117,6 +139,7 @@ AND:
     ) WHITE_SPACE_f?
 ;
 
+/** */
 OR:
     (
         (
@@ -126,22 +149,27 @@ OR:
     ) WHITE_SPACE_f?
 ;
 
+/** */
 LPAREN:
     '(' WHITE_SPACE_f?
 ;
 
+/** */
 RPAREN:
     ')' WHITE_SPACE_f?
 ;
 
+/** */
 SINGLE_QUOTE_START:
     '\'' -> pushMode(SINGLE_QUOTE_MODE)
 ;
 
+/** */
 DOUBLE_QUOTE_START:
     '"' -> pushMode(DOUBLE_QUOTE_MODE)
 ;
 
+/** */
 OPERATOR:
     '='
     | '<'
@@ -153,115 +181,138 @@ OPERATOR:
     | [Rr][Ee][Ff][Ee][Rr][Ee][Nn][Cc][Ee]([Ss]|WHITE_SPACE_f? [Tt][Oo]) (WHITE_SPACE_f? A {_input.LA(1) == ' '}?)? {setText("->");}
 ;
 
+/** */
 LIKE:
     [Ll][Ii][Kk][Ee] WHITE_SPACE_f?
 ;
 
+/** */
 IS_NULL:
     IS_f WHITE_SPACE_f NULL_f WHITE_SPACE_f?
 ;
 
+/** */
 IS_NOT_NULL:
     IS_f WHITE_SPACE_f NOT_f WHITE_SPACE_f NULL_f WHITE_SPACE_f?
 ;
 
+/** */
 fragment
 NULL_f:
     [Nn][Uu][Ll][Ll]
 ;
 
+/** */
 fragment
 DOES_f:
     [Dd][Oo][Ee][Ss]
 ;
 
+/** */
 fragment
 NOT_f:
     [Nn][Oo][Tt]
 ;
 
+/** */
 fragment
 DOESNT_f:
     DOES_f WHITE_SPACE_f? NOT_f
     | DOES_f [Nn] SINGLE_QUOTE [Tt]
 ;
 
+/** */
 fragment
 ISNT_f:
     IS_f [Nn] SINGLE_QUOTE [Tt]
 ;
 
+/** */
 fragment
 WERE_f:
     [Ww][Ee][Rr][Ee]
 ;
 
+/** */
 fragment
 WERENT_f:
     WERE_f [Nn] SINGLE_QUOTE [Tt]
 ;
 
+/** */
 fragment
 HAVENT_f:
     HAVE_f [Nn] SINGLE_QUOTE [Tt]
 ;
 
+/** */
 fragment
 HADNT_f:
     HAD_f [Nn] SINGLE_QUOTE [Tt]
 ;
 
+/** */
 fragment
 HAD_f:
     [Hh][Aa][Dd]
 ;
 
+/** */
 fragment
 HAVE_f:
     [Hh][Aa][Vv][Ee]
 ;
 
+/** */
 fragment
 HAS_f:
     [Hh][Aa][Ss]
 ;
 
+/** */
 fragment
 HASNT_f:
     HAS_f [Nn] SINGLE_QUOTE [Tt]
 ;
 
+/** */
 fragment
 BEEN_f:
     [Bb][Ee][Ee][Nn]
 ;
 
+/** */
 fragment
 HAVE_A_f:
     HAVE_f (WHITE_SPACE? A)?
 ;
 
+/** */
 fragment
 DO_f:
     [Dd][Oo]
 ;
 
+/** */
 fragment
 DONT_f:
     DO_f NOT_f
     | DO_f [Nn] SINGLE_QUOTE [Tt]
 ;
 
+/** */
 fragment
 WAS_f:
     [Ww][Aa][Ss]
 ;
 
+/** */
 fragment
 WASNT_f:
     WAS_f [Nn] SINGLE_QUOTE [Tt]
 ;
 
+/** */
 NEGATION:
     (
         '!'
@@ -277,46 +328,57 @@ NEGATION:
     ) WHITE_SPACE_f?
 ;
 
-WITH:
-    [Ww][Ii][Tt][Hh] WHITE_SPACE_f?
+/** */
+WITH_A:
+    [Ww][Ii][Tt][Hh] (WHITE_SPACE_f? A)? WHITE_SPACE_f?
 ;
 
+/** */
 THE:
     [Tt][Hh][Ee] WHITE_SPACE_f?
 ;
 
+/** */
 GREATEST:
     [Gg][Rr][Ee][Aa][Tt][Ee][Ss][Tt] WHITE_SPACE_f?
 ;
 
+/** */
 SMALLEST:
     [Ss][Mm][Aa][Ll][Ll][Ee][Ss][Tt] WHITE_SPACE_f?
 ;
 
+/** */
 A:
     [Aa][Nn]? WHITE_SPACE_f?
 ;
 
+/** */
 ME:
     [Mm][Ee] WHITE_SPACE_f?
 ;
 
+/** */
 SOMEONE:
     [Ss][Oo][Mm][Ee][Oo][Nn][Ee] WHITE_SPACE_f?
 ;
 
+/** */
 ELSE:
     [Ee][Ll][Ss][Ee] WHITE_SPACE_f?
 ;
 
+/** */
 WHERE:
     [Ww][Hh][Ee][Rr][Ee] WHITE_SPACE_f?
 ;
 
+/** */
 WHICH:
     [Ww][Hh][Ii][Cc][Hh] WHITE_SPACE_f?
 ;
 
+/** */
 HAS_A:
     (
         (HAS_f | HAD_f | HAVE_f | WERE_f | WAS_f | IS_f)
@@ -327,236 +389,317 @@ HAS_A:
     ) WHITE_SPACE_f?
 ;
 
+/** */
 PROPERTY:
     [Pp][Rr][Oo][Pp][Ee][Rr][Tt]([Yy]|[Ii][Ee][Ss]) WHITE_SPACE_f?
 ;
 
+/** */
 RECORDTYPE:
     [Rr][Ee][Cc][Oo][Rr][Dd][Tt][Yy][Pp][Ee]([Ss])? WHITE_SPACE_f?
 ;
 
+/** */
 RECORD:
     [Rr][Ee][Cc][Oo][Rr][Dd]([Ss])? WHITE_SPACE_f?
 ;
 
+/** */
 FILE:
     [Ff][Ii][Ll][Ee]([Ss])? WHITE_SPACE_f?
 ;
 
+/** */
 ENTITY:
     [Ee][Nn][Tt][Ii][Tt]([Yy]|[Ii][Ee][Ss]) WHITE_SPACE_f?
 ;
 
+/** */
 QUERYTEMPLATE:
     [Qq][Uu][Ee][Rr][yY][Tt][Ee][Mm][Pp][Ll][Aa][Tt][Ee] WHITE_SPACE_f?
 ;
 
+/** */
 fragment
 IS_f:
     [Ii][Ss]
 ;
 
+/** */
 fragment
 WHITE_SPACE_f:
     [ \t\n\r]+
 ;
 
+/** */
 WHITE_SPACE:
     [ \t\n\r]+
 ;
 
+/** */
 fragment
 DOUBLE_QUOTE:
     '"'
 ;
 
+/** */
 fragment
 SINGLE_QUOTE:
     '\''
 ;
 
+/** */
 REGEXP_MARKER:
     '#'
 ;
 
+/** */
 REGEXP_BEGIN:
     '<<'
 ;
 
+/** */
 REGEXP_END:
     '>>'
 ;
 
+/** */
 ID:
     [Ii][Dd] WHITE_SPACE_f?
 ;
 
+/** */
 SLASH:
     '/'
 ;
 
+/** */
 STAR:
     '*'
 ;
 
+/** */
 DOT:
     '.'
 ;
 
+/** */
 QMARK:
     '?' WHITE_SPACE_f?
 ;
 
+/** */
 BUT:
     [Bb][Uu][Tt] WHITE_SPACE_f?
 ;
 
+/** */
 ESC_REGEXP_END:
     ESC_MARKER
     '>>' WHITE_SPACE_f?
 ;
 
+/** */
 ESC_STAR:
     ESC_MARKER
     '*' WHITE_SPACE_f?
 ;
 
+/** */
 ESC_BS:
     ESC_MARKER
     '\\' WHITE_SPACE_f?
 ;
 
+/** */
 fragment
 ESC_MARKER:
     '\\'
 ;
 
+/** */
 TODAY:
     [Tt][Oo][Dd][Aa][Yy] WHITE_SPACE_f?
 ;
 
+/** */
+COLON:
+    ':'
+;
+
+/** Matches signed and unsigned numbers with decimal points, also numbers in scientific notation. */
+DECIMAL_NUMBER:
+    ((HYPHEN_f | PLUS ) WHITE_SPACE_f?)? 
+    ( NUM_f? DOT NUM_f WHITE_SPACE_f? E_NOTATION_f?
+    | NUM_f WHITE_SPACE_f? E_NOTATION_f
+    )
+;
+
+/** */
 HYPHEN:
-    '-'
+    HYPHEN_f
 ;
 
-COLON:
-    ':'
+/** */
+PLUS:
+	'+'
 ;
 
-NUM:
+/** */
+fragment
+HYPHEN_f:
+	'-'
+;
+
+/** Matches only unsigned integer numbers. */
+UNSIGNED_INT:
     NUM_f
-    | DOT NUM_f
-    | NUM_f DOT NUM_f
 ;
 
+/** */
+fragment
 NUM_f:
     ('0'..'9')+
 ;
 
+/** */
+fragment
+E_NOTATION_f:
+	[Ee] WHITE_SPACE_f? [+-]? WHITE_SPACE_f? NUM_f
+;
+
+/** */
 TXT:
-    ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '-' {_input.LA(1) != '>'}? | '+' | '&' | ';' | ',' | '$' | ':' | '%' | '^' | '~' {_input.LA(1) != '='}? | '`' | '´' | 'ö' | 'ä' | 'ß' | 'ü' | 'Ö' | 'Ä' | 'Ü' | '@' | '[' | ']' | '{' | '}' )+
+    ('a'..'z' | 'A'..'Z' | NUM_f | '_' | '-' {_input.LA(1) != '>'}? | PLUS | '&' | ';' | ',' | '$' | ':' | '%' | '^' | '~' {_input.LA(1) != '='}? | '`' | '´' | 'ö' | 'ä' | 'ß' | 'ü' | 'Ö' | 'Ä' | 'Ü' | '@' | '[' | ']' | '{' | '}' )+
 ;
 
+/** */
 UNKNOWN_CHAR: . ;
 
+/** */
 mode SINGLE_QUOTE_MODE;
 
+    /** */
     SINGLE_QUOTE_ESCAPED_CHAR:
         ESC_MARKER
         ( '\'' | '\\' | '*' )
     ;
 
+    /** */
     SINGLE_QUOTE_END:
         '\'' -> mode(DEFAULT_MODE)
     ;
 
+    /** */
     SINGLE_QUOTE_STAR:
         '*'
     ;
 
+    /** */
     SINGLE_QUOTE_ANY_CHAR:
         ~('\''|'\\'|'*')+
     ;
 
+/** */
 mode DOUBLE_QUOTE_MODE;
 
+    /** */
     DOUBLE_QUOTE_ESCAPED_CHAR:
         ESC_MARKER
         ( '"' | '\\' | '*' )
     ;
 
+    /** */
     DOUBLE_QUOTE_END:
         '"' -> mode(DEFAULT_MODE)
     ;
 
+    /** */
     DOUBLE_QUOTE_STAR:
         '*'
     ;
 
+    /** */
     DOUBLE_QUOTE_ANY_CHAR:
         ~('"'|'\\'|'*')+
     ;
 
 
+/** */
 mode SELECT_DOUBLE_QUOTED;
 
+    /** */
     SELECT_DOUBLE_QUOTE_ESCAPED:
         ESC_MARKER
         '"'
     ;
 
+    /** */
     SELECT_DOUBLE_QUOTE_END:
         '"' WHITE_SPACE_f? {setText("");} -> mode(SELECT_MODE)
     ;
 
+    /** */
     SELECT_DOUBLE_QUOTE_TXT:
         .
     ;
 
+/** */
 mode SELECT_SINGLE_QUOTED;
 
+    /** */
     SELECT_SINGLE_QUOTE_ESCAPED:
         ESC_MARKER
         '\''
     ;
 
+    /** */
     SELECT_SINGLE_QUOTE_END:
         '\'' WHITE_SPACE_f? {setText("");} -> mode(SELECT_MODE)
     ;
 
+    /** */
     SELECT_SINGLE_QUOTE_TXT:
         .
     ;
 
+/** */
 mode SELECT_MODE;
 
+    /** */
     FROM:
          [Ff][Rr][Oo][Mm]([ \t\n\r])* -> mode(DEFAULT_MODE)
     ;
 
+    /** */
     SELECT_ESCAPED:
         ESC_MARKER
         ( '"' | '\\' | '\'' | ',' | '.' ) {setText(getText().substring(1));}
     ;
 
+    /** */
     SELECT_DOT:
         '.'
         WHITE_SPACE_f?
     ;
 
+    /** */
     SELECT_DOUBLE_QUOTE:
         '"' {setText("");} -> mode(SELECT_DOUBLE_QUOTED)
     ;
 
+    /** */
     SELECT_SINGLE_QUOTE:
         '\'' {setText("");} -> mode(SELECT_SINGLE_QUOTED)
     ;
 
+    /** */
     SELECT_COMMA:
         ','
         WHITE_SPACE_f?
     ;
 
+    /** */
     SELECTOR_TXT:
         .
     ;
diff --git a/src/main/java/org/caosdb/server/query/CQLParser.g4 b/src/main/java/org/caosdb/server/query/CQLParser.g4
index d44674b29d5c35fab2db9f4a8395e064219b79c9..8615bae31fae67eb0bd3315f664bfa708db61618 100644
--- a/src/main/java/org/caosdb/server/query/CQLParser.g4
+++ b/src/main/java/org/caosdb/server/query/CQLParser.g4
@@ -29,6 +29,9 @@ options { tokenVocab = CQLLexer; }
     import java.util.List;
 }
 
+/**
+ * This is the root of the CQL grammar.
+ */
 cq returns [Query.Type t, List<Query.Selection> s, Query.Pattern e, Query.Role r, EntityFilterInterface filter, VersionFilter v]
     @init{
         $s = null;
@@ -56,6 +59,9 @@ cq returns [Query.Type t, List<Query.Selection> s, Query.Pattern e, Query.Role r
     EOF
 ;
 
+/**
+ * For versioned queries.
+ */
 version returns [VersionFilter v]
     @init{
         $v = null;
@@ -64,6 +70,9 @@ version returns [VersionFilter v]
     ANY_VERSION_OF {$v = VersionFilter.ANY_VERSION;}
 ;
 
+/**
+ * The comma-separated list of selected (sub)properties of a SELECT query.
+ */
 prop_sel returns [List<Query.Selection> s]
     @init{
         $s = new LinkedList<Query.Selection>();
@@ -73,6 +82,9 @@ prop_sel returns [List<Query.Selection> s]
     (SELECT_COMMA prop_subsel {$s.add($prop_subsel.sub);})*
 ;
 
+/**
+ * The (sub-)selections (e.g. geolocation.longitude) of a SELECT query.
+ */
 prop_subsel returns [Query.Selection sub]:
     selector_txt {$sub = new Query.Selection($selector_txt.text);}
     (
@@ -80,6 +92,9 @@ prop_subsel returns [Query.Selection sub]:
     )?
 ;
 
+/**
+ * Rule for the allowed characters of a prop_subsel.
+ */
 selector_txt:
     (
         SELECT_DOUBLE_QUOTE
@@ -94,6 +109,9 @@ selector_txt:
     ( SELECTOR_TXT | SELECT_ESCAPED )+
 ;
 
+/**
+ * The entity role.
+ */
 role returns [Query.Role r]:
     RECORDTYPE {$r = Query.Role.RECORDTYPE;}
     | RECORD {$r = Query.Role.RECORD;}
@@ -103,6 +121,9 @@ role returns [Query.Role r]:
     | ENTITY {$r = Query.Role.ENTITY;}
 ;
 
+/**
+ * The filters of a FIND, SELECT, or COUNT query.
+ */
 entity_filter returns [EntityFilterInterface filter]
     @init{
         $filter = null;
@@ -112,6 +133,7 @@ entity_filter returns [EntityFilterInterface filter]
     (
         (
             LPAREN WHITE_SPACE?
+            (HAS_A (PROPERTY)?)?
             (
                 filter_expression {$filter = $filter_expression.efi;}
                 | conjunction {$filter = $conjunction.c;}
@@ -126,14 +148,20 @@ entity_filter returns [EntityFilterInterface filter]
     )?
 ;
 
+/**
+ * WHICH keyword and syntactic sugar.
+ */
 which_exp:
     WHICH (HAS_A (PROPERTY)?)?
     | HAS_A (PROPERTY)?
-    | WITH (A (PROPERTY)?)?
+    | WITH_A (PROPERTY)?
     | WHERE
     | DOT WHITE_SPACE?
 ;
 
+/**
+ * Collection of different filters.
+ */
 filter_expression returns [EntityFilterInterface efi]
 :
     backreference (subproperty {((Backreference) $backreference.ref).setSubProperty($subproperty.subp);})? {$efi = $backreference.ref;}
@@ -145,6 +173,9 @@ filter_expression returns [EntityFilterInterface efi]
     | negation {$efi=$negation.n;}
 ;
 
+/**
+ * ID Filter (e.g. id > 10123).
+ */
 idfilter returns [IDFilter filter] locals [String o, String v, String a]
 @init{
     $a = null;
@@ -164,6 +195,9 @@ idfilter returns [IDFilter filter] locals [String o, String v, String a]
     )?
 ;
 
+/**
+ * Transaction filter (e.g INSERTED BY ME).
+ */
 transaction returns [TransactionFilter filter] locals [String type, TransactionFilter.Transactor user, String time, String time_op]
 @init{
     $time = null;
@@ -186,6 +220,9 @@ transaction returns [TransactionFilter filter] locals [String type, TransactionF
     )
 ;
 
+/**
+ * The transactor (e.g. "user1", or "ME").
+ */
 transactor returns [TransactionFilter.Transactor t]
 :
     BY
@@ -200,6 +237,9 @@ transactor returns [TransactionFilter.Transactor t]
     )
 ;
 
+/**
+ * A user name or a user name pattern.
+ */
 username returns [Query.Pattern ep] locals [int type]
 @init{
     $type = Query.Pattern.TYPE_NORMAL;
@@ -211,6 +251,9 @@ username returns [Query.Pattern ep] locals [int type]
     ( STAR {$type = Query.Pattern.TYPE_LIKE;} | ~(STAR | WHITE_SPACE) )+
 ;
 
+/**
+ * Time or timeframe of a transaction (for the transaction filter).
+ */
 transaction_time returns [String tqp, String op]
 @init {
      $op = "(";
@@ -232,25 +275,27 @@ transaction_time returns [String tqp, String op]
     )
 ;
 
-/*
-* not fully compliant with iso 8601 (TODO)
-*/
+/**
+ * A date time or a fragment of a date time.
+ *
+ * Not fully compliant with iso 8601 (TODO).
+ */
 datetime
 :
-    NUM // year
+    UNSIGNED_INT // year
     (
-        HYPHEN NUM // mon
+        HYPHEN UNSIGNED_INT // mon
         (
-            HYPHEN NUM // day of mon
+            HYPHEN UNSIGNED_INT // day of mon
             (
                 (m=TXT {$m.text.equals("T")}?)?// compliance with iso datetime
-                NUM // hour
+                UNSIGNED_INT // hour
                 (
-                    COLON NUM // minut
+                    COLON UNSIGNED_INT // minut
                     (
-                        COLON NUM // sec
+                        COLON UNSIGNED_INT // sec
                         (
-                            DOT NUM // millisec
+                            DOT UNSIGNED_INT // millisec
                         )?
                     )?
                 )?
@@ -259,6 +304,10 @@ datetime
     )?
 ;
 
+/**
+ * The property-operator-value filter (e.g. temperator > 240°C) and
+ * (optionally) subfilters.
+ */
 pov returns [POV filter] locals [Query.Pattern p, String o, String v, String a]
     @init{
         $p = null;
@@ -300,6 +349,9 @@ pov returns [POV filter] locals [Query.Pattern p, String o, String v, String a]
 ;
 
 
+/**
+ * Wrapper for a filter on referenced entities.
+ */
 subproperty returns [SubProperty subp]
 @init{
     $subp = null;
@@ -308,6 +360,9 @@ subproperty returns [SubProperty subp]
     subproperty_filter {$subp = new SubProperty($subproperty_filter.filter);}
 ;
 
+/**
+ * The actual filter on referenced entities.
+ */
 subproperty_filter returns [EntityFilterInterface filter]
     @init{
         $filter = null;
@@ -329,7 +384,9 @@ subproperty_filter returns [EntityFilterInterface filter]
     )?
 ;
 
-
+/**
+ * The backreference filter (e.g. REFERENCED BY ...).
+ */
 backreference returns [Backreference ref] locals [Query.Pattern e, Query.Pattern p]
     @init{
         $e = null;
@@ -349,6 +406,9 @@ backreference returns [Backreference ref] locals [Query.Pattern e, Query.Pattern
     WHITE_SPACE?
 ;
 
+/**
+ * Stored-at filter for the path of files.
+ */
 storedat returns [StoredAt filter] locals [String loc]
     @init{
         $loc = null;
@@ -362,6 +422,9 @@ storedat returns [StoredAt filter] locals [String loc]
     WHITE_SPACE?
 ;
 
+/**
+ * Combine other filters with a logical AND.
+ */
 conjunction returns [Conjunction c]
     @init{
         $c = new Conjunction();
@@ -371,6 +434,7 @@ conjunction returns [Conjunction c]
         f1 = filter_expression {$c.add($f1.efi);}
         |
         LPAREN WHITE_SPACE?
+        (HAS_A (PROPERTY)?)?
         (
             f4 = filter_expression {$c.add($f4.efi);}
             | disjunction {$c.add($disjunction.d);}
@@ -399,6 +463,9 @@ conjunction returns [Conjunction c]
     )+
 ;
 
+/**
+ * Combine other filter with a logical OR.
+ */
 disjunction returns [Disjunction d]
     @init{
         $d = new Disjunction();
@@ -408,6 +475,7 @@ disjunction returns [Disjunction d]
         f1 = filter_expression {$d.add($f1.efi);}
         |
         LPAREN WHITE_SPACE?
+        (HAS_A (PROPERTY)?)?
         (
             f4 = filter_expression {$d.add($f4.efi);}
             | conjunction {$d.add($conjunction.c);}
@@ -435,6 +503,9 @@ disjunction returns [Disjunction d]
     )+
 ;
 
+/**
+ * Negation of another filter.
+ */
 negation returns [Negation n]
     @init{
     }
@@ -454,6 +525,9 @@ negation returns [Negation n]
     )
 ;
 
+/**
+ * An entity's full name, id, or a pattern for a name.
+ */
 entity returns [Query.Pattern ep]
 :
     regexp_pattern {$ep = $regexp_pattern.ep;}
@@ -464,6 +538,10 @@ entity returns [Query.Pattern ep]
     | ( ~(ENTITY |WHITE_SPACE | DOT) )+ {$ep = new Query.Pattern((String) $text.trim(), Query.Pattern.TYPE_NORMAL);}
 ;
 
+
+/**
+ * A regexp pattern.
+ */
 regexp_pattern returns [Query.Pattern ep] locals [StringBuffer sb]
     @init{
         $sb = new StringBuffer();
@@ -474,6 +552,9 @@ regexp_pattern returns [Query.Pattern ep] locals [StringBuffer sb]
     REGEXP_END {$ep = new Query.Pattern((String) $sb.toString(), Query.Pattern.TYPE_REGEXP);}
 ;
 
+/**
+ * A like pattern (e.g. "*oxide").
+ */
 like_pattern returns [Query.Pattern ep] locals [StringBuffer sb]
     @init{
         $sb = new StringBuffer();
@@ -485,6 +566,9 @@ like_pattern returns [Query.Pattern ep] locals [StringBuffer sb]
     {$ep = new Query.Pattern((String) $text, Query.Pattern.TYPE_LIKE);}
 ;
 
+/**
+ * A Property's name, id or a pattern of a name.
+ */
 property returns [Query.Pattern pp, String agg]locals [StringBuffer sb]
     @init{
         $sb = new StringBuffer();
@@ -497,11 +581,14 @@ property returns [Query.Pattern pp, String agg]locals [StringBuffer sb]
         | like_pattern {$pp = $like_pattern.ep;}
         | ( double_quoted {$pp = $double_quoted.ep;} )
         | ( single_quoted {$pp = $single_quoted.ep;} )
-        | ((m=TXT | m=NUM | m=REGEXP_MARKER | m=ENTITY){$sb.append($m.text);})+  {$pp = new Query.Pattern($sb.toString(), Query.Pattern.TYPE_NORMAL);}
+        | ((m=TXT | m=UNSIGNED_INT | m=UNSIGNED_DECIMAL_NUMBER | m=REGEXP_MARKER | m=ENTITY){$sb.append($m.text);})+  {$pp = new Query.Pattern($sb.toString(), Query.Pattern.TYPE_NORMAL);}
     )
     WHITE_SPACE?
 ;
 
+/**
+ * Expression for minumum or maximum.
+ */
 minmax returns [String agg]
 :
     (THE?? (
@@ -510,6 +597,9 @@ minmax returns [String agg]
     ))
 ;
 
+/**
+ * A property value.
+ */
 value returns [String str]
 :
     number_with_unit {$str = $number_with_unit.text;}
@@ -518,21 +608,29 @@ value returns [String str]
     WHITE_SPACE?
 ;
 
+/**
+ * A number with a unit (e.g. 20m).
+ */
 number_with_unit
 :
-    HYPHEN??
-    NUM
-    (WHITE_SPACE?? unit)?
+    ( UNSIGNED_INT | DECIMAL_NUMBER | ( HYPHEN | PLUS ) WHITE_SPACE? UNSIGNED_INT)
+    (WHITE_SPACE? unit)?
 ;
 
+/**
+ * A unit from a physical system of units or any other kind of system.
+ */
 unit
 :
-    (~(WHITE_SPACE | WHICH | HAS_A | WITH | WHERE | DOT | AND | OR | RPAREN ))
+    (~(WHITE_SPACE | WHICH | HAS_A | WITH_A | WHERE | DOT | AND | OR | RPAREN ))
     (~(WHITE_SPACE))*
     |
-    NUM SLASH (~(WHITE_SPACE))+
+    UNSIGNED_INT SLASH (~(WHITE_SPACE))+
 ;
 
+/**
+ * A files path.
+ */
 location returns [String str]
 :
     atom {$str = $atom.ep.str;}
@@ -540,6 +638,9 @@ location returns [String str]
     (~WHITE_SPACE)+ {$str = $text; }
 ;
 
+/**
+ * An atomic string or pattern.
+ */
 atom returns [Query.Pattern ep]
 :
     double_quoted {$ep = $double_quoted.ep;}
@@ -547,6 +648,9 @@ atom returns [Query.Pattern ep]
     | (~(WHITE_SPACE | DOT | RPAREN | LPAREN ))+ {$ep = new Query.Pattern($text, Query.Pattern.TYPE_NORMAL);}
 ;
 
+/**
+ * A single-quoted string or pattern.
+ */
 single_quoted returns [Query.Pattern ep] locals [StringBuffer sb, int patternType]
     @init{
         $sb = new StringBuffer();
@@ -567,6 +671,9 @@ single_quoted returns [Query.Pattern ep] locals [StringBuffer sb, int patternTyp
     SINGLE_QUOTE_END
 ;
 
+/**
+ * A double-quoted string or pattern.
+ */
 double_quoted returns [Query.Pattern ep] locals [StringBuffer sb, int patternType]
     @init{
         $sb = new StringBuffer();
diff --git a/src/main/java/org/caosdb/server/query/POV.java b/src/main/java/org/caosdb/server/query/POV.java
index 89ea9ad46e6205dfe0583e8f54551effd82a2658..0de160cdb6249ffaea10f4eeeafdf4884323a186 100644
--- a/src/main/java/org/caosdb/server/query/POV.java
+++ b/src/main/java/org/caosdb/server/query/POV.java
@@ -51,6 +51,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class POV implements EntityFilterInterface {
+  public static final Pattern NUMBER_PATTERN =
+      Pattern.compile(
+          "^((?:[+-]\\s*)?[0-9]+(?:\\.[0-9]+)?(?:\\s*[eE]\\s*[+-]?\\s*[0-9]+)?)\\s*([^-]*)$");
   private SubProperty subp = null;
   public static int retry = 10;
   private int retry_count = 0;
@@ -116,14 +119,22 @@ public class POV implements EntityFilterInterface {
 
       // try and parse as integer
       try {
-        final Pattern dp = Pattern.compile("^(-?[0-9]++)\\s*([^(\\.[0-9])-][^-]*)?$");
-        final Matcher m = dp.matcher(value);
+        final Matcher m = NUMBER_PATTERN.matcher(this.value);
         if (!m.matches()) {
           throw new NumberFormatException();
         }
         final String vIntStr = m.group(1);
+        this.vInt = Integer.parseInt(vIntStr.replaceAll("\\s", ""));
+        if (vIntStr.matches(".*\\s.*")) {
+          // empty space in scientific notation is a common typo
+          throw new Query.ParsingException(
+              "You typed \""
+                  + vIntStr
+                  + "\". Empty spaces are not allowed in numbers. Did you mean \""
+                  + vIntStr.replaceAll("\\s", "")
+                  + "\"?");
+        }
         this.unitStr = m.group(2);
-        this.vInt = Integer.parseInt(vIntStr);
       } catch (final NumberFormatException e) {
         this.vInt = null;
       }
@@ -132,15 +143,23 @@ public class POV implements EntityFilterInterface {
       if (this.vInt == null) {
         try {
           // Doubles are allowed without dots, for example when the integer overflows.
-          final Pattern dp = Pattern.compile("^(-?[0-9]+(?:\\.)?(?:[0-9]+))\\s*([^-]*)$");
-          final Matcher m = dp.matcher(value);
+          final Matcher m = NUMBER_PATTERN.matcher(this.value);
           if (!m.matches()) {
             throw new NumberFormatException();
           }
           final String vDoubleStr = m.group(1);
-          this.unitStr = m.group(2);
 
-          this.vDouble = Double.parseDouble(vDoubleStr);
+          this.vDouble = Double.parseDouble(vDoubleStr.replaceAll("\\s", ""));
+          if (vDoubleStr.matches(".*\\s.*")) {
+            // empty space in scientific notation is a common typo
+            throw new Query.ParsingException(
+                "You typed \""
+                    + vDoubleStr
+                    + "\". Empty spaces are not allowed in numbers. Did you mean \""
+                    + vDoubleStr.replaceAll("\\s", "")
+                    + "\"?");
+          }
+          this.unitStr = m.group(2);
         } catch (final NumberFormatException e) {
           this.vDouble = null;
         }
@@ -153,7 +172,7 @@ public class POV implements EntityFilterInterface {
           this.unit = getUnit(this.unitStr);
         } catch (final ParserException e) {
           e.printStackTrace();
-          throw new UnsupportedOperationException("Could not parse the unit.");
+          throw new UnsupportedOperationException("Could not parse the unit:");
         }
 
         this.stdUnitSig = this.unit.normalize().getSignature();
diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java
index 88da39bce24f1cabf651eebf1532cab14bddb82c..c4a458630456d057ccddf26c48def0e72ccf3789 100644
--- a/src/main/java/org/caosdb/server/query/Query.java
+++ b/src/main/java/org/caosdb/server/query/Query.java
@@ -55,6 +55,7 @@ import org.caosdb.server.caching.Cache;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.implementation.MySQL.ConnectionException;
 import org.caosdb.server.database.backend.implementation.MySQL.MySQLHelper;
+import org.caosdb.server.database.backend.transaction.RetrieveFullEntityTransaction;
 import org.caosdb.server.database.backend.transaction.RetrieveSparseEntity;
 import org.caosdb.server.database.misc.DBHelper;
 import org.caosdb.server.database.misc.TransactionBenchmark;
@@ -596,14 +597,27 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
    * </ol>
    */
   public void optimize() {
-    // basic optimization
+    // "FIND Person" is interpreted as "FIND RECORD Person"
+    if (this.role == null) {
+      try {
+        this.role =
+            Role.valueOf(
+                CaosDBServer.getServerProperty(ServerProperties.KEY_FIND_QUERY_DEFAULT_ROLE));
+      } catch (IllegalArgumentException e) {
+        addError(
+            "Unsupportet value of the server property "
+                + ServerProperties.KEY_FIND_QUERY_DEFAULT_ROLE
+                + ": "
+                + CaosDBServer.getServerProperty(ServerProperties.KEY_FIND_QUERY_DEFAULT_ROLE));
+        throw new UnsupportedOperationException(e);
+      }
+    }
+
+    // "FIND *" is interpreted as "FIND RECORD", "FIND <ROLE> *" as "FIND <ROLE>"
     if (this.entity != null
         && this.entity.type == Pattern.TYPE_LIKE
         && this.entity.str.equals("*")) {
       this.entity = null;
-      if (this.role == null) {
-        this.role = Role.ENTITY;
-      }
     }
   }
 
@@ -830,6 +844,10 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
     this.messages.add(new Message(MessageType.Warning, MessageCode.MESSAGE_CODE_UNKNOWN, w));
   }
 
+  private void addError(final String e) {
+    this.messages.add(new Message(MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, e));
+  }
+
   private void cleanUp() {
     if (getConnection() != null) {
       ResultSet rs = null;
diff --git a/src/main/java/org/caosdb/server/transaction/Retrieve.java b/src/main/java/org/caosdb/server/transaction/Retrieve.java
index 86b7672cf9ebc0ad8e74f3974ee89174532d9f73..643c1201b530af9821c9a5c1a7b62f7c5d04cf52 100644
--- a/src/main/java/org/caosdb/server/transaction/Retrieve.java
+++ b/src/main/java/org/caosdb/server/transaction/Retrieve.java
@@ -121,4 +121,28 @@ public class Retrieve extends Transaction<RetrieveContainer> {
   public boolean logHistory() {
     return false;
   }
+
+  public static class Paging {
+    public Paging(int startIndex, int endIndex) {
+      this.startIndex = startIndex;
+      this.endIndex = endIndex;
+    }
+
+    public final int startIndex;
+    public final int endIndex;
+  }
+
+  private Retrieve.Paging paging = null;
+
+  public boolean hasPaging() {
+    return this.paging != null;
+  }
+
+  public void setPaging(int startIndex, int endIndex) {
+    this.paging = new Retrieve.Paging(startIndex, endIndex);
+  }
+
+  public Retrieve.Paging getPaging() {
+    return paging;
+  }
 }
diff --git a/src/main/java/org/caosdb/server/transaction/Transaction.java b/src/main/java/org/caosdb/server/transaction/Transaction.java
index b4d63fbb293e0119cefe90db34b9cfb28f4e0ce1..5fc06f5ec82066d3515cbf524e64beb001ba0fcd 100644
--- a/src/main/java/org/caosdb/server/transaction/Transaction.java
+++ b/src/main/java/org/caosdb/server/transaction/Transaction.java
@@ -105,6 +105,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
     this.schedule.addAll(Job.loadPermanentContainerJobs(this));
 
     for (final EntityInterface e : getContainer()) {
+      if (e.skipJob()) continue;
       final List<Job> loadJobs = loadContainerFlags.loadJobs(e, this);
       this.schedule.addAll(loadJobs);
 
diff --git a/src/main/java/org/caosdb/server/utils/ServerMessages.java b/src/main/java/org/caosdb/server/utils/ServerMessages.java
index 835087ce8825de6c136dabd746534bc42f3240d5..9e18ca9065ec407d2dfc795d173e8d97f11682be 100644
--- a/src/main/java/org/caosdb/server/utils/ServerMessages.java
+++ b/src/main/java/org/caosdb/server/utils/ServerMessages.java
@@ -617,4 +617,8 @@ public class ServerMessages {
     return new Message(
         MessageType.Error, MessageCode.MESSAGE_CODE_UNKNOWN, "You cannot delete yourself.");
   }
+
+  public static Message QUERY_PARSING_ERROR(String message) {
+    return new Message(MessageType.Error, MessageCode.MESSAGE_CODE_QUERY_PARSING_ERROR, message);
+  }
 }
diff --git a/src/test/docker/Dockerfile b/src/test/docker/Dockerfile
index f3c8b98fdab34400cccfc11f0c9211eeca37f845..f0ae05e65389f4b89cb0cb1373a7475b054490cd 100644
--- a/src/test/docker/Dockerfile
+++ b/src/test/docker/Dockerfile
@@ -3,15 +3,17 @@ RUN apt-get update && \
   apt-get install -y \
     git make mariadb-server maven openjdk-11-jdk-headless \
     plantuml \
-    python3-pip screen libpam0g-dev unzip curl shunit2 \
-    python3-sphinx \
-  && \
-  pip3 install javasphinx recommonmark sphinx-rtd-theme sphinxcontrib-plantuml
+    libtiff5-dev libjpeg-dev libopenjp2-7-dev zlib1g-dev \
+    libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python3-tk \
+    libharfbuzz-dev libfribidi-dev libxcb1-dev \
+    python3-pip screen libpam0g-dev unzip curl shunit2
+
+RUN apt-get install -y \
+  libcairo2-dev
+
+RUN pip3 install sphinx javasphinx recommonmark sphinx-rtd-theme sphinxcontrib-plantuml sphinx-a4doc
 
 # Alternative, if javasphinx fails because python3-sphinx is too recent:
 # (`_l` not found):
 #
-# git clone git@github.com:simgrid/javasphinx.git
-# cd javasphinx
-# git checkout 659209069603a
-# pip3 install .
+RUN git clone https://github.com/simgrid/javasphinx.git && cd javasphinx && git checkout 659209069603a && pip3 install .
diff --git a/src/test/java/org/caosdb/server/query/POVTest.java b/src/test/java/org/caosdb/server/query/POVTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..7212423bbaf2ac4d3c5e33543d3e6ffe4e70b5e4
--- /dev/null
+++ b/src/test/java/org/caosdb/server/query/POVTest.java
@@ -0,0 +1,77 @@
+package org.caosdb.server.query;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.regex.Matcher;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+class POVTest {
+
+  public static final String MAX_INT = "2147483647";
+  public static final String MIN_INT = "-2147483648";
+  public static final String MAX_DOUBLE = "1.7976931348623157E308";
+  public static final String MIN_DOUBLE = "4.9E-324";
+
+  @ParameterizedTest
+  @ValueSource(strings = {"16", MAX_INT, MIN_INT, "0", "-0", "1", "- 1", "-1", "+1"})
+  void testNumberPatternMatchInteger(String intValue) {
+
+    Matcher matcher = POV.NUMBER_PATTERN.matcher(intValue);
+    assertTrue(matcher.matches());
+    assertEquals(intValue, matcher.group(1).toString());
+
+    Integer.valueOf(intValue.replaceAll("\\s", ""));
+
+    Matcher matcherWithUnit = POV.NUMBER_PATTERN.matcher(intValue + " m^2");
+    assertTrue(matcherWithUnit.matches());
+    assertEquals(intValue, matcherWithUnit.group(1).toString());
+    assertEquals("m^2", matcherWithUnit.group(2).toString());
+
+    Matcher matcherWithStrangeUnit = POV.NUMBER_PATTERN.matcher(intValue + " e");
+    assertTrue(matcherWithStrangeUnit.matches());
+    assertEquals(intValue, matcherWithStrangeUnit.group(1).toString());
+    assertEquals("e", matcherWithStrangeUnit.group(2).toString());
+  }
+
+  @ParameterizedTest
+  @ValueSource(
+      strings = {
+        "1.2123e+3",
+        "1.21234E+3",
+        "5.213e2",
+        "5.2234E2",
+        "16.0",
+        MAX_DOUBLE,
+        MIN_DOUBLE,
+        "0.0",
+        "-0.0",
+        "1.2",
+        "- 1.2",
+        "-1.2",
+        "2e-323",
+        "2E-323",
+        "2E- 323",
+        "2 e -323",
+        "+ 2.2132e+23"
+      })
+  void testNumberPatternMatchDouble(String doubleValue) {
+
+    Matcher matcher = POV.NUMBER_PATTERN.matcher(doubleValue);
+    assertTrue(matcher.matches());
+    assertEquals(doubleValue, matcher.group(1).toString());
+
+    Double.valueOf(doubleValue.replaceAll("\\s", ""));
+
+    Matcher matcherWithUnit = POV.NUMBER_PATTERN.matcher(doubleValue + " m^2");
+    assertTrue(matcherWithUnit.matches());
+    assertEquals(doubleValue, matcherWithUnit.group(1).toString());
+    assertEquals("m^2", matcherWithUnit.group(2).toString());
+
+    Matcher matcherWithStrangeUnit = POV.NUMBER_PATTERN.matcher(doubleValue + " e");
+    assertTrue(matcherWithStrangeUnit.matches());
+    assertEquals(doubleValue, matcherWithStrangeUnit.group(1).toString());
+    assertEquals("e", matcherWithStrangeUnit.group(2).toString());
+  }
+}
diff --git a/src/test/java/org/caosdb/server/query/QueryTest.java b/src/test/java/org/caosdb/server/query/QueryTest.java
index 1827ceaf576bfba79059d557fa1422839cad8d28..986122ca46307173c6c9f80b2085db3f1776904a 100644
--- a/src/test/java/org/caosdb/server/query/QueryTest.java
+++ b/src/test/java/org/caosdb/server/query/QueryTest.java
@@ -61,20 +61,23 @@ public class QueryTest {
 
   @Test
   public void testGetKey() {
-    assertEquals("E_enameF_POV(pname,=,val1)", getCacheKey("FIND ename WITH pname = val1"));
-    assertEquals("E_enameF_POV(pname,=,val1)", getCacheKey("COUNT ename WITH pname = val1"));
+    assertEquals("R_RECORDE_enameF_POV(pname,=,val1)", getCacheKey("FIND ename WITH pname = val1"));
     assertEquals(
-        "E_enameF_POV(pname,=,val1)", getCacheKey("SELECT bla FROM ename WITH pname = val1"));
-    assertEquals("E_enameF_POV(pname,null,null)", getCacheKey("SELECT bla FROM ename WITH pname"));
+        "R_RECORDE_enameF_POV(pname,=,val1)", getCacheKey("COUNT ename WITH pname = val1"));
     assertEquals(
-        "E_enameF_maxPOV(pname,null,null)",
+        "R_RECORDE_enameF_POV(pname,=,val1)",
+        getCacheKey("SELECT bla FROM ename WITH pname = val1"));
+    assertEquals(
+        "R_RECORDE_enameF_POV(pname,null,null)", getCacheKey("SELECT bla FROM ename WITH pname"));
+    assertEquals(
+        "R_RECORDE_enameF_maxPOV(pname,null,null)",
         getCacheKey("SELECT bla FROM ename WITH THE GREATEST pname"));
 
     assertEquals(
         "R_RECORDE_enameF_POV(pname,=,val1)", getCacheKey("FIND RECORD ename WITH pname = val1"));
     assertEquals("R_ENTITYF_POV(pname,=,val1)", getCacheKey("COUNT ENTITY WITH pname = val1"));
     assertEquals(
-        "E_enameF_Conj(POV(pname,=,val1)POV(ename2,=,val2))",
+        "R_RECORDE_enameF_Conj(POV(pname,=,val1)POV(ename2,=,val2))",
         getCacheKey("SELECT bla FROM ename WITH pname = val1 AND ename2 = val2"));
 
     assertEquals("V_R_ENTITYF_ID(,>,2)", getCacheKey("FIND ANY VERSION OF ENTITY WITH ID > 2"));
@@ -83,14 +86,14 @@ public class QueryTest {
     assertEquals(
         "R_ENTITYF_SAT(asdf/asdf)", getCacheKey("FIND ENTITY WHICH IS STORED AT asdf/asdf"));
     assertEquals(
-        "E_enameF_POV(ref1,null,null)SUB(POV(pname,>,val1)",
+        "R_RECORDE_enameF_POV(ref1,null,null)SUB(POV(pname,>,val1)",
         getCacheKey("FIND ename WITH ref1 WITH pname > val1 "));
     assertEquals(
-        "E_enameF_@(ref1,null)SUB(POV(pname,>,val1)",
+        "R_RECORDE_enameF_@(ref1,null)SUB(POV(pname,>,val1)",
         getCacheKey("FIND ename WHICH IS REFERENCED BY ref1 WITH pname > val1 "));
 
     assertEquals(
-        "U_anonymous@anonymousE_enameF_POV(pname,=,val1)",
+        "U_anonymous@anonymousR_RECORDE_enameF_POV(pname,=,val1)",
         getCacheKeyWithUser("FIND ename WITH pname = val1"));
   }
 
@@ -103,7 +106,7 @@ public class QueryTest {
 
     q.optimize();
     assertNull(q.getEntity());
-    assertEquals(Query.Role.ENTITY, q.getRole());
+    assertEquals(Query.Role.RECORD, q.getRole());
   }
 
   /**
diff --git a/src/test/java/org/caosdb/server/query/TestCQL.java b/src/test/java/org/caosdb/server/query/TestCQL.java
index fe73e2b2c33749fac6d72a4c5b478eca5d154465..8d7a7e8fb219f286d6cdaffc4b28240a7b2897d5 100644
--- a/src/test/java/org/caosdb/server/query/TestCQL.java
+++ b/src/test/java/org/caosdb/server/query/TestCQL.java
@@ -25,6 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrowsExactly;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
@@ -46,6 +47,8 @@ import org.caosdb.server.query.Query.QueryException;
 import org.caosdb.server.utils.Initialization;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 
 public class TestCQL {
 
@@ -272,6 +275,7 @@ public class TestCQL {
   String issue131d = "FIND ename WITH (pname1.x) AND pname2";
   String issue131e = "FIND ename WITH (pname1.pname2 > 30) AND (pname1.pname2 < 40)";
   String issue131f = "FIND ename WITH (pname1.pname2 > 30) AND pname1.pname2 < 40";
+  String issue144 = "FIND ename WITH pname = ";
 
   // https://gitlab.com/caosdb/caosdb-server/-/issues/130
   String issue130a =
@@ -281,6 +285,8 @@ public class TestCQL {
   // quotation marks gone rogue
   String quotation1 =
       "FIND ENTITY WHICH HAS A PROPERTY LIKE '*with double*' AND A PROPERTY LIKE '*and single*' AND A PROPERTY LIKE '*what\\'s wrong?*' AND A PROPERTY LIKE '*\\'*' AND A PROPERTY LIKE '*nothin\\'*' AND A PROPERTY LIKE '*\"\\'bla*'";
+  String issue203a = "FIND WHICH ( HAS pname )";
+  String issue203b = "FIND WHICH ( HAS pname1 AND REFERENCES pname2 )";
 
   @Test
   public void testQuery1()
@@ -7013,4 +7019,88 @@ public class TestCQL {
     assertEquals("POV(null,LIKE ,%nothin'%)", conj.getFilters().get(4).toString());
     assertEquals("POV(null,LIKE ,%\"'bla%)", conj.getFilters().get(5).toString());
   }
+
+  @ParameterizedTest
+  @ValueSource(
+      strings = {
+        "1e+23",
+        "1E+23",
+        "5e22",
+        "5E22",
+        "2e-323",
+        "2E-323",
+        "-123",
+        "-1e23",
+        "3E15m^2",
+        "-3e15m",
+        "-3e15 1/s",
+        "3e15 m^2",
+        "+1",
+        "+2.234",
+        "+2.234e+23",
+        "+3.324E-23"
+      })
+  public void testIssue144(String scientific_notation) {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.issue144 + scientific_notation));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    for (final Token t : tokens.getTokens()) {
+      System.out.println(t.toString());
+    }
+
+    System.out.println(sfq.toStringTree(parser));
+
+    assertTrue(sfq.filter instanceof POV);
+    POV pov = (POV) sfq.filter;
+    assertEquals("POV(pname,=," + scientific_notation + ")", pov.toString());
+    assertTrue(pov.getVDouble() != null || pov.getVInt() != null);
+  }
+
+  @ParameterizedTest
+  @ValueSource(strings = {"- 123", "- 1e23", "2 e -23", "2E- 323", "+ 1"})
+  public void testIssue144WhiteSpaceInNumber(String number) {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.issue144 + number));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    assertThrowsExactly(Query.ParsingException.class, () -> parser.cq());
+  }
+
+  /**
+   * Test that brackets around 'has pname' do not cause filter to become subproperty filter.
+   *
+   * <p>https://gitlab.com/caosdb/caosdb-server/-/issues/203
+   */
+  @Test
+  public void testIssue203() {
+    // setup 203a
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.issue203a));
+    CommonTokenStream tokens = new CommonTokenStream(lexer);
+    CQLParser parser = new CQLParser(tokens);
+    CqContext sfq = parser.cq();
+
+    // here we test that the filter stays a POV and is not falsly interpreted
+    // as subproperty filter
+    assertTrue(sfq.filter instanceof POV);
+
+    // setup 203b (with conjunction)
+    lexer = new CQLLexer(CharStreams.fromString(this.issue203b));
+    tokens = new CommonTokenStream(lexer);
+    parser = new CQLParser(tokens);
+    sfq = parser.cq();
+    Conjunction conj = (Conjunction) sfq.filter;
+
+    // the outer filter should be conjuction
+    assertTrue(sfq.filter instanceof Conjunction);
+    // here we test that the filters stays a POV and is not falsly interpreted
+    // as subproperty filters
+    assertTrue(conj.getFilters().get(0) instanceof POV);
+    assertTrue(conj.getFilters().get(1) instanceof POV);
+  }
 }