diff --git a/.docs/.swagger/api-analyse.yaml b/.docs/.swagger/api-analyse.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..7f40ece861f2be0655618f639640a1f70eccf006
--- /dev/null
+++ b/.docs/.swagger/api-analyse.yaml
@@ -0,0 +1 @@
+{"definitions":{},"externalDocs":{"description":"Sourcecode Documentation","url":"https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services"},"info":{"contact":{"email":"andreas.rauber@tuwien.ac.at","name":"Prof. Andreas Rauber"},"description":"Service that analyses data structures","license":{"name":"Apache 2.0","url":"https://www.apache.org/licenses/LICENSE-2.0"},"title":"Database Repository Analyse Service API","version":"1.2.0"},"openapi":"3.0.0","paths":{"/api/analyse/determinedt":{"post":{"consumes":["application/json"],"description":"This is a simple API which returns the datatypes of a (path) csv file","parameters":[{"description":"to-do description","in":"body","name":"body","required":true,"schema":{"properties":{"enum":{"example":true,"type":"boolean"},"enum_tol":{"example":0.1},"filepath":{"example":"/data/testdt08.csv","type":"string"},"separator":{"example":",","type":"string"}},"type":"object"}}],"produces":["application/json"],"responses":{"200":{"description":"OK"},"405":{"description":"Invalid input"}},"summary":"Determine datatypes"}},"/api/analyse/determinepk":{"post":{"consumes":["application/json"],"description":"This is a simple API which returns the primary keys + ranking of a (path) csv file","parameters":[{"description":"to-do description","in":"body","name":"body","required":true,"schema":{"properties":{"filepath":{"example":"/data/testdt08.csv","type":"string"},"seperator":{"example":",","type":"string"}},"type":"object"}}],"produces":["application/json"],"responses":{"200":{"description":"OK"},"405":{"description":"Invalid input"}},"summary":"Determine primary keys"}}},"servers":[{"description":"Generated server url","url":"http://localhost:5000"},{"description":"Sandbox","url":"https://dbrepo2.tuwien.ac.at"}]}
diff --git a/.docs/.swagger/api-container.yaml b/.docs/.swagger/api-container.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2102e2f63cab2048d1c546149d233b3c141faf6d
--- /dev/null
+++ b/.docs/.swagger/api-container.yaml
@@ -0,0 +1,2410 @@
+openapi: 3.0.1
+info:
+  title: Database Repository Container Service API
+  description: Service that manages the containers
+  contact:
+    name: Prof. Andreas Rauber
+    email: andreas.rauber@tuwien.ac.at
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0
+  version: 1.2.0
+externalDocs:
+  description: Sourcecode Documentation
+  url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services
+servers:
+- url: http://localhost:9092
+  description: Generated server url
+- url: https://dbrepo2.tuwien.ac.at
+  description: Sandbox
+paths:
+  /api/image/{id}:
+    get:
+      tags:
+      - image-endpoint
+      summary: Find some image
+      operationId: findById
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Found image
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ImageDto'
+        "404":
+          description: Image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+    put:
+      tags:
+      - image-endpoint
+      summary: Update some image
+      operationId: update
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ImageChangeDto'
+        required: true
+      responses:
+        "202":
+          description: Updated image successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ImageDto'
+        "404":
+          description: Image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+    delete:
+      tags:
+      - image-endpoint
+      summary: Delete some image
+      operationId: delete
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "202":
+          description: Deleted image successfully
+        "404":
+          description: Image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}:
+    get:
+      tags:
+      - container-endpoint
+      summary: Find some container
+      operationId: findById_1
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Docker client failed to connect
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Found container
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ContainerDto'
+        "404":
+          description: Container image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+    put:
+      tags:
+      - container-endpoint
+      summary: Modify some container
+      operationId: modify
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ContainerChangeDto'
+        required: true
+      responses:
+        "409":
+          description: Container is already started/stopped
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: Container or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Modification of container state is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Modified state of container successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ContainerBriefDto'
+      security:
+      - bearerAuth: []
+    delete:
+      tags:
+      - container-endpoint
+      summary: Delete some container
+      operationId: delete_1
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "410":
+          description: Container is already removed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "409":
+          description: Container is still running
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "202":
+          description: Deleted container successfully
+      security:
+      - bearerAuth: []
+  /api/image:
+    get:
+      tags:
+      - image-endpoint
+      summary: Find all images
+      operationId: findAll
+      responses:
+        "200":
+          description: List images
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/ContainerImage'
+    post:
+      tags:
+      - image-endpoint
+      summary: Create image
+      operationId: create
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ImageCreateDto'
+        required: true
+      responses:
+        "201":
+          description: Created image
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ImageDto'
+        "404":
+          description: User could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Image specification is invalid
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "502":
+          description: Docker client failed to connect
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "409":
+          description: Image already exists
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container:
+    get:
+      tags:
+      - container-endpoint
+      summary: Find all containers
+      operationId: findAll_1
+      parameters:
+      - name: limit
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int32
+      responses:
+        "200":
+          description: List containers
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/ContainerBriefDto'
+    post:
+      tags:
+      - container-endpoint
+      summary: Create container
+      operationId: create_1
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ContainerCreateRequestDto'
+        required: true
+      responses:
+        "201":
+          description: Created a new container
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ContainerBriefDto'
+        "404":
+          description: Container image or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "409":
+          description: Container name already exists
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "502":
+          description: Docker client failed to connect
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+components:
+  schemas:
+    ImageChangeDto:
+      required:
+      - dialect
+      - driver_class
+      - jdbc_method
+      - registry
+      type: object
+      properties:
+        registry:
+          type: string
+          example: docker.io/library
+        defaultPort:
+          maximum: 65535
+          minimum: 1024
+          type: integer
+          format: int32
+          example: 5432
+        environment:
+          type: array
+          items:
+            $ref: '#/components/schemas/ImageEnvItemDto'
+        dialect:
+          type: string
+          example: Postgres
+        driver_class:
+          type: string
+          example: org.postgresql.Driver
+        jdbc_method:
+          type: string
+          example: postgresql
+    ImageEnvItemDto:
+      required:
+      - iid
+      - key
+      - type
+      type: object
+      properties:
+        iid:
+          type: integer
+          format: int64
+        key:
+          type: string
+          example: MARIADB_ROOT_PASSWORD
+        type:
+          type: string
+          example: PRIVILEGED_PASSWORD
+          enum:
+          - username
+          - password
+          - privileged_username
+          - privileged_password
+    ImageDateDto:
+      required:
+      - database_format
+      - example
+      - has_time
+      - id
+      - unix_format
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        example:
+          type: string
+          example: 30.01.2022
+        database_format:
+          type: string
+          example: '%d.%c.%Y'
+        unix_format:
+          type: string
+          example: dd.MM.YYYY
+        has_time:
+          type: boolean
+          example: false
+        created_at:
+          type: string
+          format: date-time
+    ImageDto:
+      required:
+      - default_port
+      - dialect
+      - driver_class
+      - id
+      - jdbc_method
+      - registry
+      - repository
+      - tag
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        registry:
+          type: string
+          example: docker.io/library
+        repository:
+          type: string
+          example: mariadb
+        tag:
+          type: string
+          example: "10.5"
+        dialect:
+          type: string
+          example: org.hibernate.dialect.MariaDBDialect
+        hash:
+          type: string
+          example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e
+        compiled:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21.678396092Z
+        size:
+          type: integer
+          example: 314295447
+        driver_class:
+          type: string
+          example: org.mariadb.jdbc.Driver
+        date_formats:
+          type: array
+          items:
+            $ref: '#/components/schemas/ImageDateDto'
+        jdbc_method:
+          type: string
+          example: mariadb
+        default_port:
+          type: integer
+          format: int32
+          example: 3306
+    ApiErrorDto:
+      required:
+      - code
+      - message
+      - status
+      type: object
+      properties:
+        status:
+          type: string
+          example: STATUS
+          enum:
+          - 100 CONTINUE
+          - 101 SWITCHING_PROTOCOLS
+          - 102 PROCESSING
+          - 103 EARLY_HINTS
+          - 103 CHECKPOINT
+          - 200 OK
+          - 201 CREATED
+          - 202 ACCEPTED
+          - 203 NON_AUTHORITATIVE_INFORMATION
+          - 204 NO_CONTENT
+          - 205 RESET_CONTENT
+          - 206 PARTIAL_CONTENT
+          - 207 MULTI_STATUS
+          - 208 ALREADY_REPORTED
+          - 226 IM_USED
+          - 300 MULTIPLE_CHOICES
+          - 301 MOVED_PERMANENTLY
+          - 302 FOUND
+          - 302 MOVED_TEMPORARILY
+          - 303 SEE_OTHER
+          - 304 NOT_MODIFIED
+          - 305 USE_PROXY
+          - 307 TEMPORARY_REDIRECT
+          - 308 PERMANENT_REDIRECT
+          - 400 BAD_REQUEST
+          - 401 UNAUTHORIZED
+          - 402 PAYMENT_REQUIRED
+          - 403 FORBIDDEN
+          - 404 NOT_FOUND
+          - 405 METHOD_NOT_ALLOWED
+          - 406 NOT_ACCEPTABLE
+          - 407 PROXY_AUTHENTICATION_REQUIRED
+          - 408 REQUEST_TIMEOUT
+          - 409 CONFLICT
+          - 410 GONE
+          - 411 LENGTH_REQUIRED
+          - 412 PRECONDITION_FAILED
+          - 413 PAYLOAD_TOO_LARGE
+          - 413 REQUEST_ENTITY_TOO_LARGE
+          - 414 URI_TOO_LONG
+          - 414 REQUEST_URI_TOO_LONG
+          - 415 UNSUPPORTED_MEDIA_TYPE
+          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
+          - 417 EXPECTATION_FAILED
+          - 418 I_AM_A_TEAPOT
+          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
+          - 420 METHOD_FAILURE
+          - 421 DESTINATION_LOCKED
+          - 422 UNPROCESSABLE_ENTITY
+          - 423 LOCKED
+          - 424 FAILED_DEPENDENCY
+          - 425 TOO_EARLY
+          - 426 UPGRADE_REQUIRED
+          - 428 PRECONDITION_REQUIRED
+          - 429 TOO_MANY_REQUESTS
+          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
+          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
+          - 500 INTERNAL_SERVER_ERROR
+          - 501 NOT_IMPLEMENTED
+          - 502 BAD_GATEWAY
+          - 503 SERVICE_UNAVAILABLE
+          - 504 GATEWAY_TIMEOUT
+          - 505 HTTP_VERSION_NOT_SUPPORTED
+          - 506 VARIANT_ALSO_NEGOTIATES
+          - 507 INSUFFICIENT_STORAGE
+          - 508 LOOP_DETECTED
+          - 509 BANDWIDTH_LIMIT_EXCEEDED
+          - 510 NOT_EXTENDED
+          - 511 NETWORK_AUTHENTICATION_REQUIRED
+        message:
+          type: string
+          example: Error message
+        code:
+          type: string
+          example: error.service.code
+    ContainerChangeDto:
+      required:
+      - action
+      type: object
+      properties:
+        action:
+          type: string
+          enum:
+          - start
+          - stop
+    ContainerBriefDto:
+      required:
+      - creator
+      - hash
+      - id
+      - internal_name
+      - name
+      - running
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        hash:
+          type: string
+          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
+        name:
+          type: string
+          example: Air Quality
+        creator:
+          $ref: '#/components/schemas/UserBriefDto'
+        running:
+          type: boolean
+          example: true
+        database:
+          $ref: '#/components/schemas/DatabaseBriefDto'
+        created:
+          type: string
+          format: date-time
+        internal_name:
+          type: string
+          example: air-quality
+    CreatorBriefDto:
+      required:
+      - firstname
+      - lastname
+      type: object
+      properties:
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Wesleyan University
+    DatabaseBriefDto:
+      required:
+      - id
+      - name
+      - owner
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality in Austria
+        identifier:
+          $ref: '#/components/schemas/IdentifierBriefDto'
+        engine:
+          type: string
+          example: mariadb:10.5
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        container:
+          $ref: '#/components/schemas/ContainerBriefDto'
+        creator:
+          $ref: '#/components/schemas/UserBriefDto'
+        created:
+          type: string
+          format: date-time
+        is_public:
+          type: boolean
+          example: true
+    IdentifierBriefDto:
+      required:
+      - container id
+      - creators
+      - database id
+      - id
+      - publication_year
+      - title
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        title:
+          type: string
+          example: "Airquality Stephansplatz, Vienna, Austria"
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        creators:
+          type: array
+          items:
+            $ref: '#/components/schemas/CreatorBriefDto'
+        container id:
+          type: integer
+          format: int64
+          example: 1
+        database id:
+          type: integer
+          format: int64
+          example: 1
+        query id:
+          type: integer
+          format: int64
+          example: 1
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+    UserBriefDto:
+      required:
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+        email_verified:
+          type: boolean
+          example: true
+    ImageCreateDto:
+      required:
+      - default_port
+      - dialect
+      - driver_class
+      - jdbc_method
+      - registry
+      - repository
+      - tag
+      type: object
+      properties:
+        registry:
+          type: string
+          example: docker.io/library
+        repository:
+          type: string
+          example: mariadb
+        tag:
+          type: string
+        dialect:
+          type: string
+        environment:
+          type: array
+          items:
+            $ref: '#/components/schemas/ImageEnvItemDto'
+        driver_class:
+          type: string
+        jdbc_method:
+          type: string
+        default_port:
+          maximum: 65535
+          minimum: 1024
+          type: integer
+          format: int32
+    ContainerCreateRequestDto:
+      required:
+      - name
+      - repository
+      - tag
+      type: object
+      properties:
+        name:
+          type: string
+          example: Air Quality
+        repository:
+          type: string
+          example: mariadb
+        tag:
+          type: string
+          example: "10.5"
+    Constraints:
+      type: object
+      properties:
+        uniques:
+          type: array
+          items:
+            $ref: '#/components/schemas/Unique'
+        foreignKeys:
+          type: array
+          items:
+            $ref: '#/components/schemas/ForeignKey'
+        checks:
+          uniqueItems: true
+          type: array
+          items:
+            type: string
+    Container:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        createdBy:
+          type: string
+          format: uuid
+        creator:
+          $ref: '#/components/schemas/User'
+        ownedBy:
+          type: string
+          format: uuid
+        owner:
+          $ref: '#/components/schemas/User'
+        name:
+          type: string
+        internalName:
+          type: string
+        hash:
+          type: string
+        imageId:
+          type: integer
+          format: int64
+        port:
+          type: integer
+          format: int32
+        database:
+          $ref: '#/components/schemas/Database'
+        image:
+          $ref: '#/components/schemas/ContainerImage'
+        ipAddress:
+          type: string
+        created:
+          type: string
+          format: date-time
+        lastModified:
+          type: string
+          format: date-time
+    ContainerImage:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        repository:
+          type: string
+        registry:
+          type: string
+        tag:
+          type: string
+        driverClass:
+          type: string
+        dialect:
+          type: string
+        jdbcMethod:
+          type: string
+        hash:
+          type: string
+        compiled:
+          type: string
+          format: date-time
+        size:
+          type: integer
+          format: int64
+        defaultPort:
+          type: integer
+          format: int32
+        environment:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerImageEnvironmentItem'
+        dateFormats:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerImageDate'
+        containers:
+          type: array
+          items:
+            $ref: '#/components/schemas/Container'
+        created:
+          type: string
+          format: date-time
+        lastModified:
+          type: string
+          format: date-time
+    ContainerImageDate:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        iid:
+          type: integer
+          format: int64
+        image:
+          $ref: '#/components/schemas/ContainerImage'
+        example:
+          type: string
+        hasTime:
+          type: boolean
+        databaseFormat:
+          type: string
+        unixFormat:
+          type: string
+        createdAt:
+          type: string
+          format: date-time
+    ContainerImageEnvironmentItem:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        iid:
+          type: integer
+          format: int64
+        key:
+          type: string
+        value:
+          type: string
+        type:
+          type: string
+          enum:
+          - USERNAME
+          - PASSWORD
+          - PRIVILEGED_USERNAME
+          - PRIVILEGED_PASSWORD
+        image:
+          $ref: '#/components/schemas/ContainerImage'
+        created:
+          type: string
+          format: date-time
+        lastModified:
+          type: string
+          format: date-time
+    Creator:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        pid:
+          type: integer
+          format: int64
+        firstname:
+          type: string
+        lastname:
+          type: string
+        affiliation:
+          type: string
+        orcid:
+          type: string
+        identifier:
+          $ref: '#/components/schemas/Identifier'
+        created:
+          type: string
+          format: date-time
+        creator:
+          $ref: '#/components/schemas/User'
+        lastModified:
+          type: string
+          format: date-time
+    Credential:
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+        type:
+          type: string
+        userId:
+          type: string
+          format: uuid
+        createdDate:
+          type: integer
+          format: int64
+        secretData:
+          type: string
+        credentialData:
+          type: string
+        priority:
+          type: integer
+          format: int32
+        user:
+          $ref: '#/components/schemas/User'
+    Database:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        createdBy:
+          type: string
+          format: uuid
+        creator:
+          $ref: '#/components/schemas/User'
+        ownedBy:
+          type: string
+          format: uuid
+        owner:
+          $ref: '#/components/schemas/User'
+        container:
+          $ref: '#/components/schemas/Container'
+        name:
+          type: string
+        internalName:
+          type: string
+        exchangeName:
+          type: string
+        description:
+          type: string
+        contactPerson:
+          type: string
+          format: uuid
+        contact:
+          $ref: '#/components/schemas/User'
+        identifier:
+          $ref: '#/components/schemas/Identifier'
+        tables:
+          type: array
+          items:
+            $ref: '#/components/schemas/Table'
+        views:
+          type: array
+          items:
+            $ref: '#/components/schemas/View'
+        isPublic:
+          type: boolean
+        created:
+          type: string
+          format: date-time
+        lastModified:
+          type: string
+          format: date-time
+    ForeignKey:
+      type: object
+      properties:
+        fkid:
+          type: integer
+          format: int64
+        tid:
+          type: integer
+          format: int64
+        tdbid:
+          type: integer
+          format: int64
+        table:
+          $ref: '#/components/schemas/Table'
+        rtid:
+          type: integer
+          format: int64
+        rtdbid:
+          type: integer
+          format: int64
+        referencedTable:
+          $ref: '#/components/schemas/Table'
+        references:
+          type: array
+          items:
+            $ref: '#/components/schemas/ForeignKeyReference'
+        onUpdate:
+          type: string
+          enum:
+          - ReferenceType.RESTRICT
+          - ReferenceType.CASCADE
+          - ReferenceType.SET_NULL
+          - ReferenceType.NO_ACTION
+          - ReferenceType.SET_DEFAULT
+        onDelete:
+          type: string
+          enum:
+          - ReferenceType.RESTRICT
+          - ReferenceType.CASCADE
+          - ReferenceType.SET_NULL
+          - ReferenceType.NO_ACTION
+          - ReferenceType.SET_DEFAULT
+    ForeignKeyReference:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        foreignKey:
+          $ref: '#/components/schemas/ForeignKey'
+        column:
+          $ref: '#/components/schemas/TableColumn'
+        referencedColumn:
+          $ref: '#/components/schemas/TableColumn'
+    Identifier:
+      required:
+      - publisher
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        containerId:
+          type: integer
+          format: int64
+        databaseId:
+          type: integer
+          format: int64
+        queryId:
+          type: integer
+          format: int64
+        creator:
+          $ref: '#/components/schemas/User'
+        title:
+          type: string
+        description:
+          type: string
+        publisher:
+          type: string
+        language:
+          type: string
+          enum:
+          - LanguageType.AB
+          - LanguageType.AA
+          - LanguageType.AF
+          - LanguageType.AK
+          - LanguageType.SQ
+          - LanguageType.AM
+          - LanguageType.AR
+          - LanguageType.AN
+          - LanguageType.HY
+          - LanguageType.AS
+          - LanguageType.AV
+          - LanguageType.AE
+          - LanguageType.AY
+          - LanguageType.AZ
+          - LanguageType.BM
+          - LanguageType.BA
+          - LanguageType.EU
+          - LanguageType.BE
+          - LanguageType.BN
+          - LanguageType.BH
+          - LanguageType.BI
+          - LanguageType.BS
+          - LanguageType.BR
+          - LanguageType.BG
+          - LanguageType.MY
+          - LanguageType.CA
+          - LanguageType.KM
+          - LanguageType.CH
+          - LanguageType.CE
+          - LanguageType.NY
+          - LanguageType.ZH
+          - LanguageType.CU
+          - LanguageType.CV
+          - LanguageType.KW
+          - LanguageType.CO
+          - LanguageType.CR
+          - LanguageType.HR
+          - LanguageType.CS
+          - LanguageType.DA
+          - LanguageType.DV
+          - LanguageType.NL
+          - LanguageType.DZ
+          - LanguageType.EN
+          - LanguageType.EO
+          - LanguageType.ET
+          - LanguageType.EE
+          - LanguageType.FO
+          - LanguageType.FJ
+          - LanguageType.FI
+          - LanguageType.FR
+          - LanguageType.FF
+          - LanguageType.GD
+          - LanguageType.GL
+          - LanguageType.LG
+          - LanguageType.KA
+          - LanguageType.DE
+          - LanguageType.KI
+          - LanguageType.EL
+          - LanguageType.KL
+          - LanguageType.GN
+          - LanguageType.GU
+          - LanguageType.HT
+          - LanguageType.HA
+          - LanguageType.HE
+          - LanguageType.HZ
+          - LanguageType.HI
+          - LanguageType.HO
+          - LanguageType.HU
+          - LanguageType.IS
+          - LanguageType.IO
+          - LanguageType.IG
+          - LanguageType.ID
+          - LanguageType.IA
+          - LanguageType.IE
+          - LanguageType.IU
+          - LanguageType.IK
+          - LanguageType.GA
+          - LanguageType.IT
+          - LanguageType.JA
+          - LanguageType.JV
+          - LanguageType.KN
+          - LanguageType.KR
+          - LanguageType.KS
+          - LanguageType.KK
+          - LanguageType.RW
+          - LanguageType.KV
+          - LanguageType.KG
+          - LanguageType.KO
+          - LanguageType.KJ
+          - LanguageType.KU
+          - LanguageType.KY
+          - LanguageType.LO
+          - LanguageType.LA
+          - LanguageType.LV
+          - LanguageType.LB
+          - LanguageType.LI
+          - LanguageType.LN
+          - LanguageType.LT
+          - LanguageType.LU
+          - LanguageType.MK
+          - LanguageType.MG
+          - LanguageType.MS
+          - LanguageType.ML
+          - LanguageType.MT
+          - LanguageType.GV
+          - LanguageType.MI
+          - LanguageType.MR
+          - LanguageType.MH
+          - LanguageType.RO
+          - LanguageType.MN
+          - LanguageType.NA
+          - LanguageType.NV
+          - LanguageType.ND
+          - LanguageType.NG
+          - LanguageType.NE
+          - LanguageType.SE
+          - LanguageType.NO
+          - LanguageType.NB
+          - LanguageType.NN
+          - LanguageType.II
+          - LanguageType.OC
+          - LanguageType.OJ
+          - LanguageType.OR
+          - LanguageType.OM
+          - LanguageType.OS
+          - LanguageType.PI
+          - LanguageType.PA
+          - LanguageType.PS
+          - LanguageType.FA
+          - LanguageType.PL
+          - LanguageType.PT
+          - LanguageType.QU
+          - LanguageType.RM
+          - LanguageType.RN
+          - LanguageType.RU
+          - LanguageType.SM
+          - LanguageType.SG
+          - LanguageType.SA
+          - LanguageType.SC
+          - LanguageType.SR
+          - LanguageType.SN
+          - LanguageType.SD
+          - LanguageType.SI
+          - LanguageType.SK
+          - LanguageType.SL
+          - LanguageType.SO
+          - LanguageType.ST
+          - LanguageType.NR
+          - LanguageType.ES
+          - LanguageType.SU
+          - LanguageType.SW
+          - LanguageType.SS
+          - LanguageType.SV
+          - LanguageType.TL
+          - LanguageType.TY
+          - LanguageType.TG
+          - LanguageType.TA
+          - LanguageType.TT
+          - LanguageType.TE
+          - LanguageType.TH
+          - LanguageType.BO
+          - LanguageType.TI
+          - LanguageType.TO
+          - LanguageType.TS
+          - LanguageType.TN
+          - LanguageType.TR
+          - LanguageType.TK
+          - LanguageType.TW
+          - LanguageType.UG
+          - LanguageType.UK
+          - LanguageType.UR
+          - LanguageType.UZ
+          - LanguageType.VE
+          - LanguageType.VI
+          - LanguageType.VO
+          - LanguageType.WA
+          - LanguageType.CY
+          - LanguageType.FY
+          - LanguageType.WO
+          - LanguageType.XH
+          - LanguageType.YI
+          - LanguageType.YO
+          - LanguageType.ZA
+          - LanguageType.ZU
+        license:
+          $ref: '#/components/schemas/License'
+        type:
+          type: string
+          enum:
+          - DATABASE
+          - SUBSET
+        query:
+          type: string
+        queryNormalized:
+          type: string
+        queryHash:
+          type: string
+        resultHash:
+          type: string
+        execution:
+          type: string
+          format: date-time
+        resultNumber:
+          type: integer
+          format: int64
+        publicationYear:
+          type: integer
+          format: int32
+        publicationMonth:
+          type: integer
+          format: int32
+        publicationDay:
+          type: integer
+          format: int32
+        visibility:
+          type: string
+          enum:
+          - VisibilityType.EVERYONE
+          - VisibilityType.SELF
+        database:
+          $ref: '#/components/schemas/Database'
+        related:
+          type: array
+          items:
+            $ref: '#/components/schemas/RelatedIdentifier'
+        doi:
+          type: string
+        creators:
+          type: array
+          items:
+            $ref: '#/components/schemas/Creator'
+        created:
+          type: string
+          format: date-time
+        lastModified:
+          type: string
+          format: date-time
+    License:
+      type: object
+      properties:
+        identifier:
+          type: string
+        uri:
+          type: string
+    RelatedIdentifier:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        iid:
+          type: integer
+          format: int64
+        value:
+          type: string
+        type:
+          type: string
+          enum:
+          - DOI
+          - URL
+          - URN
+          - ARK
+          - arXiv
+          - bibcode
+          - EAN13
+          - EISSN
+          - Handle
+          - IGSN
+          - ISBN
+          - ISTC
+          - LISSN
+          - LSID
+          - PMID
+          - PURL
+          - UPC
+          - w3id
+        relation:
+          type: string
+          enum:
+          - IsCitedBy
+          - Cites
+          - IsSupplementTo
+          - IsSupplementedBy
+          - IsContinuedBy
+          - Continues
+          - IsDescribedBy
+          - Describes
+          - HasMetadata
+          - IsMetadataFor
+          - HasVersion
+          - IsVersionOf
+          - IsNewVersionOf
+          - IsPreviousVersionOf
+          - IsPartOf
+          - HasPart
+          - IsPublishedIn
+          - IsReferencedBy
+          - References
+          - IsDocumentedBy
+          - Documents
+          - IsCompiledBy
+          - Compiles
+          - IsVariantFormOf
+          - IsOriginalFormOf
+          - IsIdenticalTo
+          - IsReviewedBy
+          - Reviews
+          - IsDerivedFrom
+          - IsSourceOf
+          - IsRequiredBy
+          - Requires
+          - IsObsoletedBy
+          - Obsoletes
+        creator:
+          $ref: '#/components/schemas/User'
+        created:
+          type: string
+          format: date-time
+        lastModified:
+          type: string
+          format: date-time
+    Role:
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+        name:
+          type: string
+        realmId:
+          type: string
+          format: uuid
+        users:
+          type: array
+          items:
+            $ref: '#/components/schemas/User'
+    Table:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        tdbid:
+          type: integer
+          format: int64
+        creator:
+          $ref: '#/components/schemas/User'
+        owner:
+          $ref: '#/components/schemas/User'
+        name:
+          type: string
+        internalName:
+          type: string
+        queueName:
+          type: string
+        routingKey:
+          type: string
+        description:
+          type: string
+        database:
+          $ref: '#/components/schemas/Database'
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/TableColumn'
+        constraints:
+          $ref: '#/components/schemas/Constraints'
+        created:
+          type: string
+          format: date-time
+        lastModified:
+          type: string
+          format: date-time
+    TableColumn:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        tid:
+          type: integer
+          format: int64
+        cdbid:
+          type: integer
+          format: int64
+        dfid:
+          type: integer
+          format: int64
+        dateFormat:
+          $ref: '#/components/schemas/ContainerImageDate'
+        table:
+          $ref: '#/components/schemas/Table'
+        view:
+          $ref: '#/components/schemas/View'
+        creator:
+          $ref: '#/components/schemas/User'
+        name:
+          type: string
+        autoGenerated:
+          type: boolean
+        internalName:
+          type: string
+        isPrimaryKey:
+          type: boolean
+        indexLength:
+          type: integer
+          format: int32
+        alias:
+          type: string
+        columnType:
+          type: string
+          enum:
+          - TableColumnType.ENUM
+          - TableColumnType.NUMBER
+          - TableColumnType.DECIMAL
+          - TableColumnType.STRING
+          - TableColumnType.TEXT
+          - TableColumnType.BOOLEAN
+          - TableColumnType.DATE
+          - TableColumnType.TIMESTAMP
+          - TableColumnType.BLOB
+        length:
+          type: integer
+          format: int32
+        isNullAllowed:
+          type: boolean
+        enumValues:
+          type: array
+          items:
+            type: string
+        ordinalPosition:
+          type: integer
+          format: int32
+        created:
+          type: string
+          format: date-time
+        concept:
+          $ref: '#/components/schemas/TableColumnConcept'
+        unit:
+          $ref: '#/components/schemas/TableColumnUnit'
+        lastModified:
+          type: string
+          format: date-time
+    TableColumnConcept:
+      type: object
+      properties:
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        created:
+          type: string
+          format: date-time
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/TableColumn'
+    TableColumnUnit:
+      type: object
+      properties:
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        created:
+          type: string
+          format: date-time
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/TableColumn'
+    Unique:
+      type: object
+      properties:
+        uid:
+          type: integer
+          format: int64
+        tid:
+          type: integer
+          format: int64
+        tdbid:
+          type: integer
+          format: int64
+        table:
+          $ref: '#/components/schemas/Table'
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/TableColumn'
+    User:
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+        username:
+          type: string
+        firstname:
+          type: string
+        lastname:
+          type: string
+        realmId:
+          type: string
+          format: uuid
+        email:
+          type: string
+        emailVerified:
+          type: boolean
+        enabled:
+          type: boolean
+        createdTimestamp:
+          type: integer
+          format: int64
+        databasePassword:
+          type: string
+        attributes:
+          type: array
+          items:
+            $ref: '#/components/schemas/UserAttribute'
+        credentials:
+          type: array
+          items:
+            $ref: '#/components/schemas/Credential'
+        containers:
+          type: array
+          items:
+            $ref: '#/components/schemas/Container'
+        databases:
+          type: array
+          items:
+            $ref: '#/components/schemas/Database'
+        identifiers:
+          type: array
+          items:
+            $ref: '#/components/schemas/Identifier'
+        roles:
+          type: array
+          items:
+            $ref: '#/components/schemas/Role'
+        tables:
+          type: array
+          items:
+            $ref: '#/components/schemas/Table'
+    UserAttribute:
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+        userId:
+          type: string
+          format: uuid
+        name:
+          type: string
+        value:
+          type: string
+        user:
+          $ref: '#/components/schemas/User'
+    View:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        vcid:
+          type: integer
+          format: int64
+        vdbid:
+          type: integer
+          format: int64
+        createdBy:
+          type: string
+          format: uuid
+        creator:
+          $ref: '#/components/schemas/User'
+        database:
+          $ref: '#/components/schemas/Database'
+        name:
+          type: string
+        internalName:
+          type: string
+        isPublic:
+          type: boolean
+        isInitialView:
+          type: boolean
+        query:
+          type: string
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/TableColumn'
+        created:
+          type: string
+          format: date-time
+        lastModified:
+          type: string
+          format: date-time
+    ColumnBriefDto:
+      required:
+      - column_type
+      - database_id
+      - id
+      - internal_name
+      - name
+      - table_id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: date
+        database_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: mdb_date
+        column_type:
+          type: string
+          example: date
+          enum:
+          - enum
+          - number
+          - decimal
+          - string
+          - text
+          - boolean
+          - date
+          - timestamp
+          - blob
+    ContainerDto:
+      required:
+      - created
+      - hash
+      - id
+      - internal_name
+      - name
+      - running
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        hash:
+          type: string
+          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
+        name:
+          type: string
+          example: Air Quality
+        state:
+          type: string
+          example: running
+          enum:
+          - created
+          - restarting
+          - running
+          - paused
+          - exited
+          - dead
+        database:
+          $ref: '#/components/schemas/DatabaseDto'
+        running:
+          type: boolean
+          example: true
+        image:
+          $ref: '#/components/schemas/ImageBriefDto'
+        port:
+          type: integer
+          format: int32
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        created:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21.678396092Z
+        internal_name:
+          type: string
+          example: air-quality
+        ip_address:
+          type: string
+    CreatorDto:
+      required:
+      - firstname
+      - id
+      - lastname
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Wesleyan University
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+    DatabaseAccessDto:
+      required:
+      - type
+      - user
+      type: object
+      properties:
+        user:
+          $ref: '#/components/schemas/UserDto'
+        type:
+          type: string
+          enum:
+          - read
+          - write_own
+          - write_all
+        created:
+          type: string
+          format: date-time
+    DatabaseDto:
+      required:
+      - creator
+      - exchange_name
+      - id
+      - internal_name
+      - name
+      - owner
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        identifier:
+          $ref: '#/components/schemas/IdentifierDto'
+        description:
+          type: string
+          example: Weather Australia 2009-2021
+        tables:
+          type: array
+          items:
+            $ref: '#/components/schemas/TableBriefDto'
+        views:
+          type: array
+          items:
+            $ref: '#/components/schemas/ViewBriefDto'
+        image:
+          $ref: '#/components/schemas/ImageDto'
+        container:
+          $ref: '#/components/schemas/ContainerDto'
+        accesses:
+          type: array
+          items:
+            $ref: '#/components/schemas/DatabaseAccessDto'
+        creator:
+          $ref: '#/components/schemas/UserBriefDto'
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        created:
+          type: string
+          format: date-time
+        exchange_name:
+          type: string
+          example: dbrepo/air_quality
+        internal_name:
+          type: string
+          example: weather_australia
+        is_public:
+          type: boolean
+          example: true
+    IdentifierDto:
+      required:
+      - container id
+      - creators
+      - database id
+      - execution
+      - publication_year
+      - query
+      - query_hash
+      - query_normalized
+      - result_hash
+      - result_number
+      - title
+      - type
+      - visibility
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+        title:
+          type: string
+          example: "Airquality Stephansplatz, Vienna, Austria"
+        description:
+          type: string
+          example: "Air quality reports at Stephansplatz, Vienna"
+        query:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        execution:
+          type: string
+          format: date-time
+        visibility:
+          type: string
+          example: everyone
+          enum:
+          - everyone
+          - self
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        license:
+          $ref: '#/components/schemas/LicenseDto'
+        creators:
+          type: array
+          items:
+            $ref: '#/components/schemas/CreatorDto'
+        created:
+          type: string
+          format: date-time
+        container id:
+          type: integer
+          format: int64
+          example: 1
+        database id:
+          type: integer
+          format: int64
+          example: 1
+        query id:
+          type: integer
+          format: int64
+          example: 1
+        query_normalized:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        related:
+          type: array
+          items:
+            $ref: '#/components/schemas/RelatedIdentifierDto'
+        query_hash:
+          type: string
+          description: query hash in sha512
+        result_hash:
+          type: string
+        result_number:
+          type: integer
+          format: int64
+          example: 1
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        last_modified:
+          type: string
+          format: date-time
+    ImageBriefDto:
+      required:
+      - id
+      - registry
+      - repository
+      - tag
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        registry:
+          type: string
+          example: docker.io/library
+        repository:
+          type: string
+          example: mariadb
+        tag:
+          type: string
+          example: "10.5"
+    LicenseDto:
+      required:
+      - identifier
+      - uri
+      type: object
+      properties:
+        identifier:
+          type: string
+          example: MIT
+        uri:
+          type: string
+          example: https://opensource.org/licenses/MIT
+    RelatedIdentifierDto:
+      required:
+      - created
+      - id
+      - value
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        value:
+          type: string
+          example: 10.70124/dc4zh-9ce78
+        type:
+          type: string
+          example: DOI
+          enum:
+          - DOI
+          - URL
+          - URN
+          - ARK
+          - arXiv
+          - bibcode
+          - EAN13
+          - EISSN
+          - Handle
+          - IGSN
+          - ISBN
+          - ISTC
+          - LISSN
+          - LSID
+          - PMID
+          - PURL
+          - UPC
+          - w3id
+        relation:
+          type: string
+          example: Cites
+          enum:
+          - IsCitedBy
+          - Cites
+          - IsSupplementTo
+          - IsSupplementedBy
+          - IsContinuedBy
+          - Continues
+          - IsDescribedBy
+          - Describes
+          - HasMetadata
+          - IsMetadataFor
+          - HasVersion
+          - IsVersionOf
+          - IsNewVersionOf
+          - IsPreviousVersionOf
+          - IsPartOf
+          - HasPart
+          - IsPublishedIn
+          - IsReferencedBy
+          - References
+          - IsDocumentedBy
+          - Documents
+          - IsCompiledBy
+          - Compiles
+          - IsVariantFormOf
+          - IsOriginalFormOf
+          - IsIdenticalTo
+          - IsReviewedBy
+          - Reviews
+          - IsDerivedFrom
+          - IsSourceOf
+          - IsRequiredBy
+          - Requires
+          - IsObsoletedBy
+          - Obsoletes
+        created:
+          type: string
+          format: date-time
+        last_modified:
+          type: string
+          format: date-time
+    TableBriefDto:
+      required:
+      - columns
+      - description
+      - id
+      - internal_name
+      - name
+      - owner
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality in Austria
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnBriefDto'
+        internal_name:
+          type: string
+          example: air_quality
+    UserAttributeDto:
+      type: object
+      properties:
+        name:
+          type: string
+          example: theme_dark
+        value:
+          type: string
+          example: "true"
+    UserDto:
+      required:
+      - email
+      - email_verified
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        attributes:
+          type: array
+          items:
+            $ref: '#/components/schemas/UserAttributeDto'
+        containers:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        databases:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        identifiers:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        email:
+          type: string
+          example: jcarberry@brown.edu
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+        email_verified:
+          type: boolean
+          example: true
+    ViewBriefDto:
+      required:
+      - created
+      - creator
+      - id
+      - internal_name
+      - name
+      - query
+      - vdbid
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        vdbid:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
+        created:
+          type: string
+          format: date-time
+        creator:
+          $ref: '#/components/schemas/UserDto'
+        internal_name:
+          type: string
+          example: air_quality
+        is_public:
+          type: boolean
+          example: true
+        initial_view:
+          type: boolean
+          description: True if it is the default view for the database
+          example: true
+        last_modified:
+          type: string
+          format: date-time
+  securitySchemes:
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
diff --git a/.docs/.swagger/api-database.yaml b/.docs/.swagger/api-database.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..40b76995cc7f1fb0776ba1cd9e7dabb012ca377f
--- /dev/null
+++ b/.docs/.swagger/api-database.yaml
@@ -0,0 +1,1626 @@
+openapi: 3.0.1
+info:
+  title: Database Repository Database Service API
+  description: Service that manages the databases
+  contact:
+    name: Prof. Andreas Rauber
+    email: andreas.rauber@tuwien.ac.at
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0
+  version: 1.2.0
+externalDocs:
+  description: Sourcecode Documentation
+  url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services
+servers:
+- url: http://localhost:9092
+  description: Generated server url
+- url: https://dbrepo2.tuwien.ac.at
+  description: Sandbox
+paths:
+  /api/container/{id}/database/{databaseId}/visibility:
+    put:
+      tags:
+      - database-endpoint
+      summary: Update database
+      operationId: visibility
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/DatabaseModifyVisibilityDto'
+        required: true
+      responses:
+        "404":
+          description: Database or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "202":
+          description: Visibility modified successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/DatabaseDto'
+        "405":
+          description: Visibility modification is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/transfer:
+    put:
+      tags:
+      - database-endpoint
+      summary: Transfer database
+      operationId: transfer
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/DatabaseTransferDto'
+        required: true
+      responses:
+        "202":
+          description: Transfer of ownership was successful
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/DatabaseDto'
+        "404":
+          description: Database or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Transfer of ownership is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/access/{username}:
+    put:
+      tags:
+      - access-endpoint
+      summary: Modify access to some database
+      operationId: update
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: username
+        in: path
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/DatabaseModifyAccessDto'
+        required: true
+      responses:
+        "404":
+          description: Database or user not found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Modify access query or database connection is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "202":
+          description: Modify access succeeded
+        "403":
+          description: Modify access not permitted when no access is granted in the
+            first place
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+    delete:
+      tags:
+      - access-endpoint
+      summary: Revoke access to some database
+      operationId: revoke
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: username
+        in: path
+        required: true
+        schema:
+          type: string
+      responses:
+        "404":
+          description: User with access was not found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Modify access query or database connection is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Revoke of access not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "403":
+          description: Revoke of access not permitted as no access was found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "202":
+          description: Revoked access successfully
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database:
+    get:
+      tags:
+      - database-endpoint
+      summary: List databases
+      operationId: list
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: List of databases
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/DatabaseBriefDto'
+    post:
+      tags:
+      - database-endpoint
+      summary: Create database
+      operationId: create
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/DatabaseCreateDto'
+        required: true
+      responses:
+        "201":
+          description: Created a new database
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/DatabaseBriefDto'
+        "404":
+          description: "Container, user or database could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "406":
+          description: Failed to create user at broker service or virtual host could
+            not be reached at broker service
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Database create permission is missing or grant permissions
+            at broker service failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "501":
+          description: Container image is not supported
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "503":
+          description: Connection to the database failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "502":
+          description: Connection to the container failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Database create query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "409":
+          description: Database name already exist or query store could not be created
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/access:
+    get:
+      tags:
+      - access-endpoint
+      summary: Check access to some database
+      operationId: find
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "403":
+          description: No access to this database
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Found database access
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/DatabaseAccessDto'
+        "405":
+          description: Check access is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+    post:
+      tags:
+      - access-endpoint
+      summary: Give access to some database
+      operationId: create_1
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/DatabaseGiveAccessDto'
+        required: true
+      responses:
+        "202":
+          description: Granting access succeeded
+        "405":
+          description: Granting access not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Granting access query or database connection is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: Database or user not found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}:
+    get:
+      tags:
+      - database-endpoint
+      summary: Find some database
+      operationId: findById
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "405":
+          description: Database information is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: Database or container could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Database found successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/DatabaseDto'
+      security:
+      - bearerAuth: []
+    delete:
+      tags:
+      - database-endpoint
+      summary: Delete some database
+      operationId: delete
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "400":
+          description: Database delete query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: Container or database could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Database delete permission is missing or revoke permissions
+            at broker service failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "501":
+          description: Container image is not supported
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "503":
+          description: Connection to the database failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "406":
+          description: Failed to delete user at broker service or virtual host could
+            not be reached at broker service
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "502":
+          description: Connection to the container failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "201":
+          description: Deleted a database
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/DatabaseBriefDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/license:
+    get:
+      tags:
+      - license-endpoint
+      summary: Get all licenses
+      operationId: list_1
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: List of licenses
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/LicenseDto'
+components:
+  schemas:
+    DatabaseModifyVisibilityDto:
+      required:
+      - is_public
+      type: object
+      properties:
+        is_public:
+          type: boolean
+          example: true
+    ApiErrorDto:
+      required:
+      - code
+      - message
+      - status
+      type: object
+      properties:
+        status:
+          type: string
+          example: STATUS
+          enum:
+          - 100 CONTINUE
+          - 101 SWITCHING_PROTOCOLS
+          - 102 PROCESSING
+          - 103 EARLY_HINTS
+          - 103 CHECKPOINT
+          - 200 OK
+          - 201 CREATED
+          - 202 ACCEPTED
+          - 203 NON_AUTHORITATIVE_INFORMATION
+          - 204 NO_CONTENT
+          - 205 RESET_CONTENT
+          - 206 PARTIAL_CONTENT
+          - 207 MULTI_STATUS
+          - 208 ALREADY_REPORTED
+          - 226 IM_USED
+          - 300 MULTIPLE_CHOICES
+          - 301 MOVED_PERMANENTLY
+          - 302 FOUND
+          - 302 MOVED_TEMPORARILY
+          - 303 SEE_OTHER
+          - 304 NOT_MODIFIED
+          - 305 USE_PROXY
+          - 307 TEMPORARY_REDIRECT
+          - 308 PERMANENT_REDIRECT
+          - 400 BAD_REQUEST
+          - 401 UNAUTHORIZED
+          - 402 PAYMENT_REQUIRED
+          - 403 FORBIDDEN
+          - 404 NOT_FOUND
+          - 405 METHOD_NOT_ALLOWED
+          - 406 NOT_ACCEPTABLE
+          - 407 PROXY_AUTHENTICATION_REQUIRED
+          - 408 REQUEST_TIMEOUT
+          - 409 CONFLICT
+          - 410 GONE
+          - 411 LENGTH_REQUIRED
+          - 412 PRECONDITION_FAILED
+          - 413 PAYLOAD_TOO_LARGE
+          - 413 REQUEST_ENTITY_TOO_LARGE
+          - 414 URI_TOO_LONG
+          - 414 REQUEST_URI_TOO_LONG
+          - 415 UNSUPPORTED_MEDIA_TYPE
+          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
+          - 417 EXPECTATION_FAILED
+          - 418 I_AM_A_TEAPOT
+          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
+          - 420 METHOD_FAILURE
+          - 421 DESTINATION_LOCKED
+          - 422 UNPROCESSABLE_ENTITY
+          - 423 LOCKED
+          - 424 FAILED_DEPENDENCY
+          - 425 TOO_EARLY
+          - 426 UPGRADE_REQUIRED
+          - 428 PRECONDITION_REQUIRED
+          - 429 TOO_MANY_REQUESTS
+          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
+          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
+          - 500 INTERNAL_SERVER_ERROR
+          - 501 NOT_IMPLEMENTED
+          - 502 BAD_GATEWAY
+          - 503 SERVICE_UNAVAILABLE
+          - 504 GATEWAY_TIMEOUT
+          - 505 HTTP_VERSION_NOT_SUPPORTED
+          - 506 VARIANT_ALSO_NEGOTIATES
+          - 507 INSUFFICIENT_STORAGE
+          - 508 LOOP_DETECTED
+          - 509 BANDWIDTH_LIMIT_EXCEEDED
+          - 510 NOT_EXTENDED
+          - 511 NETWORK_AUTHENTICATION_REQUIRED
+        message:
+          type: string
+          example: Error message
+        code:
+          type: string
+          example: error.service.code
+    ColumnBriefDto:
+      required:
+      - column_type
+      - database_id
+      - id
+      - internal_name
+      - name
+      - table_id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: date
+        database_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: mdb_date
+        column_type:
+          type: string
+          example: date
+          enum:
+          - enum
+          - number
+          - decimal
+          - string
+          - text
+          - boolean
+          - date
+          - timestamp
+          - blob
+    ContainerDto:
+      required:
+      - created
+      - hash
+      - id
+      - internal_name
+      - name
+      - running
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        hash:
+          type: string
+          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
+        name:
+          type: string
+          example: Air Quality
+        state:
+          type: string
+          example: running
+          enum:
+          - created
+          - restarting
+          - running
+          - paused
+          - exited
+          - dead
+        database:
+          $ref: '#/components/schemas/DatabaseDto'
+        running:
+          type: boolean
+          example: true
+        image:
+          $ref: '#/components/schemas/ImageBriefDto'
+        port:
+          type: integer
+          format: int32
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        created:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21.678396092Z
+        internal_name:
+          type: string
+          example: air-quality
+        ip_address:
+          type: string
+    CreatorDto:
+      required:
+      - firstname
+      - id
+      - lastname
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Wesleyan University
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+    DatabaseAccessDto:
+      required:
+      - type
+      - user
+      type: object
+      properties:
+        user:
+          $ref: '#/components/schemas/UserDto'
+        type:
+          type: string
+          enum:
+          - read
+          - write_own
+          - write_all
+        created:
+          type: string
+          format: date-time
+    DatabaseDto:
+      required:
+      - creator
+      - exchange_name
+      - id
+      - internal_name
+      - name
+      - owner
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        identifier:
+          $ref: '#/components/schemas/IdentifierDto'
+        description:
+          type: string
+          example: Weather Australia 2009-2021
+        tables:
+          type: array
+          items:
+            $ref: '#/components/schemas/TableBriefDto'
+        views:
+          type: array
+          items:
+            $ref: '#/components/schemas/ViewBriefDto'
+        image:
+          $ref: '#/components/schemas/ImageDto'
+        container:
+          $ref: '#/components/schemas/ContainerDto'
+        accesses:
+          type: array
+          items:
+            $ref: '#/components/schemas/DatabaseAccessDto'
+        creator:
+          $ref: '#/components/schemas/UserBriefDto'
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        created:
+          type: string
+          format: date-time
+        exchange_name:
+          type: string
+          example: dbrepo/air_quality
+        internal_name:
+          type: string
+          example: weather_australia
+        is_public:
+          type: boolean
+          example: true
+    IdentifierDto:
+      required:
+      - container id
+      - creators
+      - database id
+      - execution
+      - publication_year
+      - query
+      - query_hash
+      - query_normalized
+      - result_hash
+      - result_number
+      - title
+      - type
+      - visibility
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+        title:
+          type: string
+          example: "Airquality Stephansplatz, Vienna, Austria"
+        description:
+          type: string
+          example: "Air quality reports at Stephansplatz, Vienna"
+        query:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        execution:
+          type: string
+          format: date-time
+        visibility:
+          type: string
+          example: everyone
+          enum:
+          - everyone
+          - self
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        license:
+          $ref: '#/components/schemas/LicenseDto'
+        creators:
+          type: array
+          items:
+            $ref: '#/components/schemas/CreatorDto'
+        created:
+          type: string
+          format: date-time
+        container id:
+          type: integer
+          format: int64
+          example: 1
+        database id:
+          type: integer
+          format: int64
+          example: 1
+        query id:
+          type: integer
+          format: int64
+          example: 1
+        query_normalized:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        related:
+          type: array
+          items:
+            $ref: '#/components/schemas/RelatedIdentifierDto'
+        query_hash:
+          type: string
+          description: query hash in sha512
+        result_hash:
+          type: string
+        result_number:
+          type: integer
+          format: int64
+          example: 1
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        last_modified:
+          type: string
+          format: date-time
+    ImageBriefDto:
+      required:
+      - id
+      - registry
+      - repository
+      - tag
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        registry:
+          type: string
+          example: docker.io/library
+        repository:
+          type: string
+          example: mariadb
+        tag:
+          type: string
+          example: "10.5"
+    ImageDateDto:
+      required:
+      - database_format
+      - example
+      - has_time
+      - id
+      - unix_format
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        example:
+          type: string
+          example: 30.01.2022
+        database_format:
+          type: string
+          example: '%d.%c.%Y'
+        unix_format:
+          type: string
+          example: dd.MM.YYYY
+        has_time:
+          type: boolean
+          example: false
+        created_at:
+          type: string
+          format: date-time
+    ImageDto:
+      required:
+      - default_port
+      - dialect
+      - driver_class
+      - id
+      - jdbc_method
+      - registry
+      - repository
+      - tag
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        registry:
+          type: string
+          example: docker.io/library
+        repository:
+          type: string
+          example: mariadb
+        tag:
+          type: string
+          example: "10.5"
+        dialect:
+          type: string
+          example: org.hibernate.dialect.MariaDBDialect
+        hash:
+          type: string
+          example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e
+        compiled:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21.678396092Z
+        size:
+          type: integer
+          example: 314295447
+        driver_class:
+          type: string
+          example: org.mariadb.jdbc.Driver
+        date_formats:
+          type: array
+          items:
+            $ref: '#/components/schemas/ImageDateDto'
+        jdbc_method:
+          type: string
+          example: mariadb
+        default_port:
+          type: integer
+          format: int32
+          example: 3306
+    LicenseDto:
+      required:
+      - identifier
+      - uri
+      type: object
+      properties:
+        identifier:
+          type: string
+          example: MIT
+        uri:
+          type: string
+          example: https://opensource.org/licenses/MIT
+    RelatedIdentifierDto:
+      required:
+      - created
+      - id
+      - value
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        value:
+          type: string
+          example: 10.70124/dc4zh-9ce78
+        type:
+          type: string
+          example: DOI
+          enum:
+          - DOI
+          - URL
+          - URN
+          - ARK
+          - arXiv
+          - bibcode
+          - EAN13
+          - EISSN
+          - Handle
+          - IGSN
+          - ISBN
+          - ISTC
+          - LISSN
+          - LSID
+          - PMID
+          - PURL
+          - UPC
+          - w3id
+        relation:
+          type: string
+          example: Cites
+          enum:
+          - IsCitedBy
+          - Cites
+          - IsSupplementTo
+          - IsSupplementedBy
+          - IsContinuedBy
+          - Continues
+          - IsDescribedBy
+          - Describes
+          - HasMetadata
+          - IsMetadataFor
+          - HasVersion
+          - IsVersionOf
+          - IsNewVersionOf
+          - IsPreviousVersionOf
+          - IsPartOf
+          - HasPart
+          - IsPublishedIn
+          - IsReferencedBy
+          - References
+          - IsDocumentedBy
+          - Documents
+          - IsCompiledBy
+          - Compiles
+          - IsVariantFormOf
+          - IsOriginalFormOf
+          - IsIdenticalTo
+          - IsReviewedBy
+          - Reviews
+          - IsDerivedFrom
+          - IsSourceOf
+          - IsRequiredBy
+          - Requires
+          - IsObsoletedBy
+          - Obsoletes
+        created:
+          type: string
+          format: date-time
+        last_modified:
+          type: string
+          format: date-time
+    TableBriefDto:
+      required:
+      - columns
+      - description
+      - id
+      - internal_name
+      - name
+      - owner
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality in Austria
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnBriefDto'
+        internal_name:
+          type: string
+          example: air_quality
+    UserAttributeDto:
+      type: object
+      properties:
+        name:
+          type: string
+          example: theme_dark
+        value:
+          type: string
+          example: "true"
+    UserBriefDto:
+      required:
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+        email_verified:
+          type: boolean
+          example: true
+    UserDto:
+      required:
+      - email
+      - email_verified
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        attributes:
+          type: array
+          items:
+            $ref: '#/components/schemas/UserAttributeDto'
+        containers:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        databases:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        identifiers:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        email:
+          type: string
+          example: jcarberry@brown.edu
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+        email_verified:
+          type: boolean
+          example: true
+    ViewBriefDto:
+      required:
+      - created
+      - creator
+      - id
+      - internal_name
+      - name
+      - query
+      - vdbid
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        vdbid:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
+        created:
+          type: string
+          format: date-time
+        creator:
+          $ref: '#/components/schemas/UserDto'
+        internal_name:
+          type: string
+          example: air_quality
+        is_public:
+          type: boolean
+          example: true
+        initial_view:
+          type: boolean
+          description: True if it is the default view for the database
+          example: true
+        last_modified:
+          type: string
+          format: date-time
+    DatabaseTransferDto:
+      required:
+      - username
+      type: object
+      properties:
+        username:
+          type: string
+    DatabaseModifyAccessDto:
+      required:
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - read
+          - write_own
+          - write_all
+    DatabaseCreateDto:
+      required:
+      - is_public
+      - name
+      type: object
+      properties:
+        name:
+          type: string
+          example: Air Quality
+        is_public:
+          type: boolean
+          example: true
+    ContainerBriefDto:
+      required:
+      - creator
+      - hash
+      - id
+      - internal_name
+      - name
+      - running
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        hash:
+          type: string
+          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
+        name:
+          type: string
+          example: Air Quality
+        creator:
+          $ref: '#/components/schemas/UserBriefDto'
+        running:
+          type: boolean
+          example: true
+        database:
+          $ref: '#/components/schemas/DatabaseBriefDto'
+        created:
+          type: string
+          format: date-time
+        internal_name:
+          type: string
+          example: air-quality
+    CreatorBriefDto:
+      required:
+      - firstname
+      - lastname
+      type: object
+      properties:
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Wesleyan University
+    DatabaseBriefDto:
+      required:
+      - id
+      - name
+      - owner
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality in Austria
+        identifier:
+          $ref: '#/components/schemas/IdentifierBriefDto'
+        engine:
+          type: string
+          example: mariadb:10.5
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        container:
+          $ref: '#/components/schemas/ContainerBriefDto'
+        creator:
+          $ref: '#/components/schemas/UserBriefDto'
+        created:
+          type: string
+          format: date-time
+        is_public:
+          type: boolean
+          example: true
+    IdentifierBriefDto:
+      required:
+      - container id
+      - creators
+      - database id
+      - id
+      - publication_year
+      - title
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        title:
+          type: string
+          example: "Airquality Stephansplatz, Vienna, Austria"
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        creators:
+          type: array
+          items:
+            $ref: '#/components/schemas/CreatorBriefDto'
+        container id:
+          type: integer
+          format: int64
+          example: 1
+        database id:
+          type: integer
+          format: int64
+          example: 1
+        query id:
+          type: integer
+          format: int64
+          example: 1
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+    DatabaseGiveAccessDto:
+      required:
+      - type
+      - username
+      type: object
+      properties:
+        username:
+          type: string
+        type:
+          type: string
+          enum:
+          - read
+          - write_own
+          - write_all
+  securitySchemes:
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
diff --git a/.docs/.swagger/api-identifier.yaml b/.docs/.swagger/api-identifier.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..002b392bb6df32db0e8153596b5d397297ffb6af
--- /dev/null
+++ b/.docs/.swagger/api-identifier.yaml
@@ -0,0 +1,1333 @@
+openapi: 3.0.1
+info:
+  title: Database Repository Identifier Service API
+  description: Service that manages the identifiers
+  contact:
+    name: Prof. Andreas Rauber
+    email: andreas.rauber@tuwien.ac.at
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0
+  version: 1.2.0
+externalDocs:
+  description: Sourcecode Documentation
+  url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services
+servers:
+- url: http://localhost:9096
+  description: Generated server url
+- url: https://dbrepo2.tuwien.ac.at
+  description: Sandbox
+paths:
+  /api/pid/{id}:
+    put:
+      tags:
+      - persistence-endpoint
+      summary: Update some identifier
+      operationId: update
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/IdentifierUpdateDto'
+        required: true
+      responses:
+        "405":
+          description: Updating identifier not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "202":
+          description: Updated identifier
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/IdentifierDto'
+        "404":
+          description: Identifier or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Identifier data is not valid to the form
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "406":
+          description: Updating identifier not allowed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+    delete:
+      tags:
+      - persistence-endpoint
+      summary: Delete some identifier
+      operationId: delete
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Identifier could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Deleting identifier not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "202":
+          description: Deleted identifier
+      security:
+      - bearerAuth: []
+  /api/identifier:
+    get:
+      tags:
+      - identifier-endpoint
+      summary: Find identifiers
+      operationId: list
+      parameters:
+      - name: dbid
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: qid
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: type
+        in: query
+        required: false
+        schema:
+          type: string
+          enum:
+          - database
+          - subset
+      responses:
+        "200":
+          description: List identifiers
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/IdentifierDto'
+    post:
+      tags:
+      - identifier-endpoint
+      summary: Create identifier
+      operationId: create
+      parameters:
+      - name: Authorization
+        in: header
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/IdentifierCreateDto'
+        required: true
+      responses:
+        "406":
+          description: Creating identifier not allowed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Identifier form contains invalid request data
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "502":
+          description: Query information could not be retrieved
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "201":
+          description: Created identifier
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/IdentifierDto'
+        "403":
+          description: Insufficient access rights or authorities
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Creating identifier not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "409":
+          description: Identifier for this resource already exists
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/pid/{pid}:
+    get:
+      tags:
+      - persistence-endpoint
+      summary: Find some identifier
+      operationId: find
+      parameters:
+      - name: pid
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: Accept
+        in: header
+        required: true
+        schema:
+          type: string
+      responses:
+        "200":
+          description: Found identifier successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/IdentifierDto'
+            text/csv: {}
+            text/xml: {}
+            text/bibliography: {}
+            text/bibliography; style=apa: {}
+            text/bibliography; style=ieee: {}
+            text/bibliography; style=bibtex: {}
+        "404":
+          description: Identifier could not be exported from database as the resource
+            was not found
+          content:
+            text/csv:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: "Identifier could not be exported, the requested style is not\
+            \ known"
+          content:
+            text/bibliography:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "502":
+          description: Identifier could not exported from database as it is not reachable
+          content:
+            text/csv:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+components:
+  schemas:
+    CreatorDto:
+      required:
+      - firstname
+      - id
+      - lastname
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Wesleyan University
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+    IdentifierUpdateDto:
+      required:
+      - cid
+      - creators
+      - dbid
+      - publication_year
+      - title
+      - type
+      - visibility
+      type: object
+      properties:
+        cid:
+          type: integer
+          format: int64
+        dbid:
+          type: integer
+          format: int64
+        qid:
+          type: integer
+          format: int64
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+        title:
+          type: string
+          example: "Airquality Stephansplatz, Vienna, Austria"
+        description:
+          type: string
+          example: "Air quality reports at Stephansplatz, Vienna"
+        visibility:
+          type: string
+          example: everyone
+          enum:
+          - everyone
+          - self
+        publisher:
+          type: string
+          example: TU Wien
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        license:
+          $ref: '#/components/schemas/LicenseDto'
+        creators:
+          type: array
+          items:
+            $ref: '#/components/schemas/CreatorDto'
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        related_identifiers:
+          type: array
+          items:
+            $ref: '#/components/schemas/RelatedIdentifierCreateDto'
+    LicenseDto:
+      required:
+      - identifier
+      - uri
+      type: object
+      properties:
+        identifier:
+          type: string
+          example: MIT
+        uri:
+          type: string
+          example: https://opensource.org/licenses/MIT
+    RelatedIdentifierCreateDto:
+      required:
+      - value
+      type: object
+      properties:
+        value:
+          type: string
+          example: 10.70124/dc4zh-9ce78
+        type:
+          type: string
+          example: DOI
+          enum:
+          - DOI
+          - URL
+          - URN
+          - ARK
+          - arXiv
+          - bibcode
+          - EAN13
+          - EISSN
+          - Handle
+          - IGSN
+          - ISBN
+          - ISTC
+          - LISSN
+          - LSID
+          - PMID
+          - PURL
+          - UPC
+          - w3id
+        relation:
+          type: string
+          example: Cites
+          enum:
+          - IsCitedBy
+          - Cites
+          - IsSupplementTo
+          - IsSupplementedBy
+          - IsContinuedBy
+          - Continues
+          - IsDescribedBy
+          - Describes
+          - HasMetadata
+          - IsMetadataFor
+          - HasVersion
+          - IsVersionOf
+          - IsNewVersionOf
+          - IsPreviousVersionOf
+          - IsPartOf
+          - HasPart
+          - IsPublishedIn
+          - IsReferencedBy
+          - References
+          - IsDocumentedBy
+          - Documents
+          - IsCompiledBy
+          - Compiles
+          - IsVariantFormOf
+          - IsOriginalFormOf
+          - IsIdenticalTo
+          - IsReviewedBy
+          - Reviews
+          - IsDerivedFrom
+          - IsSourceOf
+          - IsRequiredBy
+          - Requires
+          - IsObsoletedBy
+          - Obsoletes
+    ApiErrorDto:
+      required:
+      - code
+      - message
+      - status
+      type: object
+      properties:
+        status:
+          type: string
+          example: STATUS
+          enum:
+          - 100 CONTINUE
+          - 101 SWITCHING_PROTOCOLS
+          - 102 PROCESSING
+          - 103 EARLY_HINTS
+          - 103 CHECKPOINT
+          - 200 OK
+          - 201 CREATED
+          - 202 ACCEPTED
+          - 203 NON_AUTHORITATIVE_INFORMATION
+          - 204 NO_CONTENT
+          - 205 RESET_CONTENT
+          - 206 PARTIAL_CONTENT
+          - 207 MULTI_STATUS
+          - 208 ALREADY_REPORTED
+          - 226 IM_USED
+          - 300 MULTIPLE_CHOICES
+          - 301 MOVED_PERMANENTLY
+          - 302 FOUND
+          - 302 MOVED_TEMPORARILY
+          - 303 SEE_OTHER
+          - 304 NOT_MODIFIED
+          - 305 USE_PROXY
+          - 307 TEMPORARY_REDIRECT
+          - 308 PERMANENT_REDIRECT
+          - 400 BAD_REQUEST
+          - 401 UNAUTHORIZED
+          - 402 PAYMENT_REQUIRED
+          - 403 FORBIDDEN
+          - 404 NOT_FOUND
+          - 405 METHOD_NOT_ALLOWED
+          - 406 NOT_ACCEPTABLE
+          - 407 PROXY_AUTHENTICATION_REQUIRED
+          - 408 REQUEST_TIMEOUT
+          - 409 CONFLICT
+          - 410 GONE
+          - 411 LENGTH_REQUIRED
+          - 412 PRECONDITION_FAILED
+          - 413 PAYLOAD_TOO_LARGE
+          - 413 REQUEST_ENTITY_TOO_LARGE
+          - 414 URI_TOO_LONG
+          - 414 REQUEST_URI_TOO_LONG
+          - 415 UNSUPPORTED_MEDIA_TYPE
+          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
+          - 417 EXPECTATION_FAILED
+          - 418 I_AM_A_TEAPOT
+          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
+          - 420 METHOD_FAILURE
+          - 421 DESTINATION_LOCKED
+          - 422 UNPROCESSABLE_ENTITY
+          - 423 LOCKED
+          - 424 FAILED_DEPENDENCY
+          - 425 TOO_EARLY
+          - 426 UPGRADE_REQUIRED
+          - 428 PRECONDITION_REQUIRED
+          - 429 TOO_MANY_REQUESTS
+          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
+          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
+          - 500 INTERNAL_SERVER_ERROR
+          - 501 NOT_IMPLEMENTED
+          - 502 BAD_GATEWAY
+          - 503 SERVICE_UNAVAILABLE
+          - 504 GATEWAY_TIMEOUT
+          - 505 HTTP_VERSION_NOT_SUPPORTED
+          - 506 VARIANT_ALSO_NEGOTIATES
+          - 507 INSUFFICIENT_STORAGE
+          - 508 LOOP_DETECTED
+          - 509 BANDWIDTH_LIMIT_EXCEEDED
+          - 510 NOT_EXTENDED
+          - 511 NETWORK_AUTHENTICATION_REQUIRED
+        message:
+          type: string
+          example: Error message
+        code:
+          type: string
+          example: error.service.code
+    IdentifierDto:
+      required:
+      - container id
+      - creators
+      - database id
+      - execution
+      - publication_year
+      - query
+      - query_hash
+      - query_normalized
+      - result_hash
+      - result_number
+      - title
+      - type
+      - visibility
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+        title:
+          type: string
+          example: "Airquality Stephansplatz, Vienna, Austria"
+        description:
+          type: string
+          example: "Air quality reports at Stephansplatz, Vienna"
+        query:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        execution:
+          type: string
+          format: date-time
+        visibility:
+          type: string
+          example: everyone
+          enum:
+          - everyone
+          - self
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        license:
+          $ref: '#/components/schemas/LicenseDto'
+        creators:
+          type: array
+          items:
+            $ref: '#/components/schemas/CreatorDto'
+        created:
+          type: string
+          format: date-time
+        container id:
+          type: integer
+          format: int64
+          example: 1
+        database id:
+          type: integer
+          format: int64
+          example: 1
+        query id:
+          type: integer
+          format: int64
+          example: 1
+        query_normalized:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        related:
+          type: array
+          items:
+            $ref: '#/components/schemas/RelatedIdentifierDto'
+        query_hash:
+          type: string
+          description: query hash in sha512
+        result_hash:
+          type: string
+        result_number:
+          type: integer
+          format: int64
+          example: 1
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        last_modified:
+          type: string
+          format: date-time
+    RelatedIdentifierDto:
+      required:
+      - created
+      - id
+      - value
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        value:
+          type: string
+          example: 10.70124/dc4zh-9ce78
+        type:
+          type: string
+          example: DOI
+          enum:
+          - DOI
+          - URL
+          - URN
+          - ARK
+          - arXiv
+          - bibcode
+          - EAN13
+          - EISSN
+          - Handle
+          - IGSN
+          - ISBN
+          - ISTC
+          - LISSN
+          - LSID
+          - PMID
+          - PURL
+          - UPC
+          - w3id
+        relation:
+          type: string
+          example: Cites
+          enum:
+          - IsCitedBy
+          - Cites
+          - IsSupplementTo
+          - IsSupplementedBy
+          - IsContinuedBy
+          - Continues
+          - IsDescribedBy
+          - Describes
+          - HasMetadata
+          - IsMetadataFor
+          - HasVersion
+          - IsVersionOf
+          - IsNewVersionOf
+          - IsPreviousVersionOf
+          - IsPartOf
+          - HasPart
+          - IsPublishedIn
+          - IsReferencedBy
+          - References
+          - IsDocumentedBy
+          - Documents
+          - IsCompiledBy
+          - Compiles
+          - IsVariantFormOf
+          - IsOriginalFormOf
+          - IsIdenticalTo
+          - IsReviewedBy
+          - Reviews
+          - IsDerivedFrom
+          - IsSourceOf
+          - IsRequiredBy
+          - Requires
+          - IsObsoletedBy
+          - Obsoletes
+        created:
+          type: string
+          format: date-time
+        last_modified:
+          type: string
+          format: date-time
+    CreatorCreateDto:
+      required:
+      - firstname
+      - lastname
+      type: object
+      properties:
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Wesleyan University
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+    IdentifierCreateDto:
+      required:
+      - cid
+      - creators
+      - dbid
+      - publication_year
+      - title
+      - type
+      - visibility
+      type: object
+      properties:
+        cid:
+          type: integer
+          format: int64
+        dbid:
+          type: integer
+          format: int64
+        qid:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+        title:
+          type: string
+          example: "Airquality Stephansplatz, Vienna, Austria"
+        description:
+          type: string
+          example: "Air quality reports at Stephansplatz, Vienna"
+        visibility:
+          type: string
+          example: everyone
+          enum:
+          - everyone
+          - self
+        publisher:
+          type: string
+          example: TU Wien
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        license:
+          $ref: '#/components/schemas/LicenseDto'
+        creators:
+          type: array
+          items:
+            $ref: '#/components/schemas/CreatorCreateDto'
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        related_identifiers:
+          type: array
+          items:
+            $ref: '#/components/schemas/RelatedIdentifierCreateDto'
+  securitySchemes:
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
diff --git a/.docs/.swagger/api-metadata.yaml b/.docs/.swagger/api-metadata.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..bc1c717b5b0b8c20060728b7f1ec377f764cdbe9
--- /dev/null
+++ b/.docs/.swagger/api-metadata.yaml
@@ -0,0 +1,62 @@
+openapi: 3.0.1
+info:
+  title: Database Repository Metadata Service API
+  description: Service that manages the metadata
+  contact:
+    name: Prof. Andreas Rauber
+    email: andreas.rauber@tuwien.ac.at
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0
+  version: 1.2.0
+externalDocs:
+  description: Sourcecode Documentation
+  url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services
+servers:
+- url: http://localhost:9099
+  description: Generated server url
+- url: https://dbrepo2.tuwien.ac.at
+  description: Sandbox
+paths:
+  /api/oai:
+    get:
+      tags:
+      - metadata-endpoint
+      summary: Get the record
+      operationId: identify_1_1_1_1
+      parameters:
+      - name: verb
+        in: query
+      - name: parameters
+        in: query
+        required: true
+        schema:
+          $ref: '#/components/schemas/OaiListIdentifiersParameters'
+      responses:
+        "200":
+          description: List containers
+          content:
+            text/xml: {}
+components:
+  schemas:
+    OaiListIdentifiersParameters:
+      type: object
+      properties:
+        metadataPrefix:
+          type: string
+        from:
+          type: string
+        until:
+          type: string
+        set:
+          type: string
+        resumptionToken:
+          type: string
+        fromDate:
+          type: string
+          format: date-time
+        untilDate:
+          type: string
+          format: date-time
+        parametersString:
+          type: string
diff --git a/.docs/.swagger/api-query.yaml b/.docs/.swagger/api-query.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..16168d93b08fc5f2d3b79131526ad2c8a027b0eb
--- /dev/null
+++ b/.docs/.swagger/api-query.yaml
@@ -0,0 +1,2520 @@
+openapi: 3.0.1
+info:
+  title: Database Repository Query Service API
+  description: Service that manages the queries
+  contact:
+    name: Prof. Andreas Rauber
+    email: andreas.rauber@tuwien.ac.at
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0
+  version: 1.2.0
+externalDocs:
+  description: Sourcecode Documentation
+  url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services
+servers:
+- url: http://localhost:9093
+  description: Generated server url
+- url: https://dbrepo2.tuwien.ac.at
+  description: Sandbox
+paths:
+  /api/container/{id}/database/{databaseId}/table/{tableId}/history:
+    get:
+      tags:
+      - table-history-endpoint
+      summary: Find all history
+      operationId: getAll
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "405":
+          description: Find table history is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Find table history successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/TableHistoryDto'
+        "404":
+          description: "Table, database or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "504":
+          description: Query store failed to query table history
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "503":
+          description: Connection to the database failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Table history query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+    head:
+      tags:
+      - table-history-endpoint
+      summary: Find all history
+      operationId: getAll_1
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "405":
+          description: Find table history is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Find table history successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/TableHistoryDto'
+        "404":
+          description: "Table, database or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "504":
+          description: Query store failed to query table history
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "503":
+          description: Connection to the database failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Table history query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/table/{tableId}/data:
+    get:
+      tags:
+      - table-data-endpoint
+      summary: Find data
+      operationId: getAll_2
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: sortDirection
+        in: query
+        required: false
+        schema:
+          type: string
+          enum:
+          - asc
+          - desc
+      - name: sortColumn
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: OK
+          content:
+            '*/*':
+              schema:
+                $ref: '#/components/schemas/QueryResultDto'
+      security:
+      - bearerAuth: []
+    put:
+      tags:
+      - table-data-endpoint
+      summary: Update data
+      operationId: update
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/TableCsvUpdateDto'
+        required: true
+      responses:
+        "200":
+          description: OK
+      deprecated: true
+      security:
+      - bearerAuth: []
+    post:
+      tags:
+      - table-data-endpoint
+      summary: Insert data
+      operationId: insert
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/TableCsvDto'
+        required: true
+      responses:
+        "200":
+          description: OK
+      security:
+      - bearerAuth: []
+    delete:
+      tags:
+      - table-data-endpoint
+      summary: Delete data
+      operationId: delete_1
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/TableCsvDeleteDto'
+        required: true
+      responses:
+        "200":
+          description: OK
+      security:
+      - bearerAuth: []
+    head:
+      tags:
+      - table-data-endpoint
+      summary: Find data
+      operationId: getAll_3
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: sortDirection
+        in: query
+        required: false
+        schema:
+          type: string
+          enum:
+          - asc
+          - desc
+      - name: sortColumn
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: OK
+          content:
+            '*/*':
+              schema:
+                $ref: '#/components/schemas/QueryResultDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/query/{queryId}:
+    get:
+      tags:
+      - store-endpoint
+      summary: Find some query
+      operationId: find_1
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: queryId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: List queries
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/QueryDto'
+        "404":
+          description: "Database, query or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Find query is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "501":
+          description: Image is not supported
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "504":
+          description: Query store failed to select query
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "503":
+          description: Connection to the database failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+    put:
+      tags:
+      - store-endpoint
+      summary: Persist some query
+      operationId: persist
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: queryId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: "Database, query or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "501":
+          description: Image is not supported
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Persist query successful
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/QueryDto'
+        "405":
+          description: Persist query is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "504":
+          description: Query store failed to persist query
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "409":
+          description: Query is already persisted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/view:
+    get:
+      tags:
+      - view-endpoint
+      summary: Find all views
+      operationId: findAll
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Database or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Find views is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Find views successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/ViewBriefDto'
+      security:
+      - bearerAuth: []
+    post:
+      tags:
+      - view-endpoint
+      summary: Create a view
+      operationId: create
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ViewCreateDto'
+        required: true
+      responses:
+        "401":
+          description: Credentials missing
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: Database or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Create view is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "403":
+          description: Credentials missing
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "201":
+          description: Create view successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ViewBriefDto'
+        "423":
+          description: Create view resulted in an invalid query statement
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Create view query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "503":
+          description: Connection to the database failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/table/{tableId}/data/import:
+    post:
+      tags:
+      - table-data-endpoint
+      summary: Insert data from csv
+      operationId: importCsv
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ImportDto'
+        required: true
+      responses:
+        "200":
+          description: OK
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/query:
+    get:
+      tags:
+      - store-endpoint
+      summary: Find queries
+      operationId: findAll_1
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: persisted
+        in: query
+        required: false
+        schema:
+          type: boolean
+      responses:
+        "405":
+          description: Find all queries is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "501":
+          description: Image is not supported
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "504":
+          description: Query store failed to select query
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: "Database, container or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "423":
+          description: Selection of time-versioned query resulted in an invalid query
+            statement
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "503":
+          description: Connection to the database failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: List queries
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/QueryBriefDto'
+      security:
+      - bearerAuth: []
+    post:
+      tags:
+      - query-endpoint
+      summary: Execute query
+      operationId: execute
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: sortDirection
+        in: query
+        required: false
+        schema:
+          type: string
+          enum:
+          - asc
+          - desc
+      - name: sortColumn
+        in: query
+        required: false
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ExecuteStatementDto'
+        required: true
+      responses:
+        "200":
+          description: OK
+          content:
+            '*/*':
+              schema:
+                $ref: '#/components/schemas/QueryResultDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/view/{viewId}:
+    get:
+      tags:
+      - view-endpoint
+      summary: Find one view
+      operationId: find
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Find view successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ViewDto'
+        "404":
+          description: "Database, view or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Find view is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+    delete:
+      tags:
+      - view-endpoint
+      summary: Delete one view
+      operationId: delete
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "401":
+          description: Credentials missing
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "403":
+          description: Credentials missing
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: "Database, view or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Delete view query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Delete view successfully
+        "423":
+          description: Delete view resulted in an invalid query statement
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "503":
+          description: Connection to the database failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Delete view is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/view/{viewId}/data:
+    get:
+      tags:
+      - view-endpoint
+      summary: Find view data
+      operationId: data
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Find data successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/QueryResultDto'
+        "401":
+          description: Credentials missing
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "423":
+          description: Find data resulted in an invalid query statement
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "403":
+          description: Credentials missing
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "417":
+          description: Parsing of resulting columns failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "504":
+          description: Query store failed to query view data
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: "Database, view, container or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Pagination not in valid range or find data query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "501":
+          description: Image is not supported
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Find data is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "503":
+          description: Connection to the database failed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/view/{viewId}/data/count:
+    get:
+      tags:
+      - view-endpoint
+      summary: Find view data count
+      operationId: count
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: OK
+          content:
+            '*/*':
+              schema:
+                type: integer
+                format: int64
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/table/{tableId}/export:
+    get:
+      tags:
+      - export-endpoint
+      summary: Export table
+      operationId: export
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      responses:
+        "200":
+          description: OK
+          content:
+            '*/*':
+              schema:
+                type: string
+                format: binary
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/table/{tableId}/data/count:
+    get:
+      tags:
+      - table-data-endpoint
+      summary: Find data
+      operationId: getCount
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      responses:
+        "200":
+          description: OK
+          content:
+            '*/*':
+              schema:
+                type: integer
+                format: int64
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/query/{queryId}/export:
+    get:
+      tags:
+      - query-endpoint
+      summary: Exports some query
+      operationId: export_1
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: queryId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: Accept
+        in: header
+        required: true
+        schema:
+          type: string
+      responses:
+        "200":
+          description: OK
+          content:
+            '*/*':
+              schema:
+                type: object
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/query/{queryId}/data:
+    get:
+      tags:
+      - query-endpoint
+      summary: Re-execute some query
+      operationId: reExecute
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: queryId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: sortDirection
+        in: query
+        required: false
+        schema:
+          type: string
+          enum:
+          - asc
+          - desc
+      - name: sortColumn
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: OK
+          content:
+            '*/*':
+              schema:
+                $ref: '#/components/schemas/QueryResultDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/query/{queryId}/data/count:
+    get:
+      tags:
+      - query-endpoint
+      summary: Re-execute some query
+      operationId: reExecuteCount
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: queryId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: OK
+          content:
+            '*/*':
+              schema:
+                type: integer
+                format: int64
+      security:
+      - bearerAuth: []
+components:
+  schemas:
+    ApiErrorDto:
+      required:
+      - code
+      - message
+      - status
+      type: object
+      properties:
+        status:
+          type: string
+          example: STATUS
+          enum:
+          - 100 CONTINUE
+          - 101 SWITCHING_PROTOCOLS
+          - 102 PROCESSING
+          - 103 EARLY_HINTS
+          - 103 CHECKPOINT
+          - 200 OK
+          - 201 CREATED
+          - 202 ACCEPTED
+          - 203 NON_AUTHORITATIVE_INFORMATION
+          - 204 NO_CONTENT
+          - 205 RESET_CONTENT
+          - 206 PARTIAL_CONTENT
+          - 207 MULTI_STATUS
+          - 208 ALREADY_REPORTED
+          - 226 IM_USED
+          - 300 MULTIPLE_CHOICES
+          - 301 MOVED_PERMANENTLY
+          - 302 FOUND
+          - 302 MOVED_TEMPORARILY
+          - 303 SEE_OTHER
+          - 304 NOT_MODIFIED
+          - 305 USE_PROXY
+          - 307 TEMPORARY_REDIRECT
+          - 308 PERMANENT_REDIRECT
+          - 400 BAD_REQUEST
+          - 401 UNAUTHORIZED
+          - 402 PAYMENT_REQUIRED
+          - 403 FORBIDDEN
+          - 404 NOT_FOUND
+          - 405 METHOD_NOT_ALLOWED
+          - 406 NOT_ACCEPTABLE
+          - 407 PROXY_AUTHENTICATION_REQUIRED
+          - 408 REQUEST_TIMEOUT
+          - 409 CONFLICT
+          - 410 GONE
+          - 411 LENGTH_REQUIRED
+          - 412 PRECONDITION_FAILED
+          - 413 PAYLOAD_TOO_LARGE
+          - 413 REQUEST_ENTITY_TOO_LARGE
+          - 414 URI_TOO_LONG
+          - 414 REQUEST_URI_TOO_LONG
+          - 415 UNSUPPORTED_MEDIA_TYPE
+          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
+          - 417 EXPECTATION_FAILED
+          - 418 I_AM_A_TEAPOT
+          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
+          - 420 METHOD_FAILURE
+          - 421 DESTINATION_LOCKED
+          - 422 UNPROCESSABLE_ENTITY
+          - 423 LOCKED
+          - 424 FAILED_DEPENDENCY
+          - 425 TOO_EARLY
+          - 426 UPGRADE_REQUIRED
+          - 428 PRECONDITION_REQUIRED
+          - 429 TOO_MANY_REQUESTS
+          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
+          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
+          - 500 INTERNAL_SERVER_ERROR
+          - 501 NOT_IMPLEMENTED
+          - 502 BAD_GATEWAY
+          - 503 SERVICE_UNAVAILABLE
+          - 504 GATEWAY_TIMEOUT
+          - 505 HTTP_VERSION_NOT_SUPPORTED
+          - 506 VARIANT_ALSO_NEGOTIATES
+          - 507 INSUFFICIENT_STORAGE
+          - 508 LOOP_DETECTED
+          - 509 BANDWIDTH_LIMIT_EXCEEDED
+          - 510 NOT_EXTENDED
+          - 511 NETWORK_AUTHENTICATION_REQUIRED
+        message:
+          type: string
+          example: Error message
+        code:
+          type: string
+          example: error.service.code
+    TableHistoryDto:
+      required:
+      - event
+      - timestamp
+      - total
+      type: object
+      properties:
+        timestamp:
+          type: string
+          format: date-time
+        event:
+          type: string
+        total:
+          type: integer
+          format: int64
+          example: 1
+    QueryResultDto:
+      required:
+      - id
+      - result
+      type: object
+      properties:
+        result:
+          type: array
+          items:
+            type: object
+            additionalProperties:
+              type: object
+        id:
+          type: integer
+          format: int64
+        result_number:
+          type: integer
+          format: int64
+          example: 1
+    TableCsvUpdateDto:
+      required:
+      - data
+      - keys
+      type: object
+      properties:
+        data:
+          type: object
+          additionalProperties:
+            type: object
+        keys:
+          type: object
+          additionalProperties:
+            type: object
+    ColumnBriefDto:
+      required:
+      - column_type
+      - database_id
+      - id
+      - internal_name
+      - name
+      - table_id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: date
+        database_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: mdb_date
+        column_type:
+          type: string
+          example: date
+          enum:
+          - enum
+          - number
+          - decimal
+          - string
+          - text
+          - boolean
+          - date
+          - timestamp
+          - blob
+    ContainerDto:
+      required:
+      - created
+      - hash
+      - id
+      - internal_name
+      - name
+      - running
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        hash:
+          type: string
+          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
+        name:
+          type: string
+          example: Air Quality
+        state:
+          type: string
+          example: running
+          enum:
+          - created
+          - restarting
+          - running
+          - paused
+          - exited
+          - dead
+        database:
+          $ref: '#/components/schemas/DatabaseDto'
+        running:
+          type: boolean
+          example: true
+        image:
+          $ref: '#/components/schemas/ImageBriefDto'
+        port:
+          type: integer
+          format: int32
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        created:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21.678396092Z
+        internal_name:
+          type: string
+          example: air-quality
+        ip_address:
+          type: string
+    CreatorDto:
+      required:
+      - firstname
+      - id
+      - lastname
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Wesleyan University
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+    DatabaseAccessDto:
+      required:
+      - type
+      - user
+      type: object
+      properties:
+        user:
+          $ref: '#/components/schemas/UserDto'
+        type:
+          type: string
+          enum:
+          - read
+          - write_own
+          - write_all
+        created:
+          type: string
+          format: date-time
+    DatabaseDto:
+      required:
+      - creator
+      - exchange_name
+      - id
+      - internal_name
+      - name
+      - owner
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        identifier:
+          $ref: '#/components/schemas/IdentifierDto'
+        description:
+          type: string
+          example: Weather Australia 2009-2021
+        tables:
+          type: array
+          items:
+            $ref: '#/components/schemas/TableBriefDto'
+        views:
+          type: array
+          items:
+            $ref: '#/components/schemas/ViewBriefDto'
+        image:
+          $ref: '#/components/schemas/ImageDto'
+        container:
+          $ref: '#/components/schemas/ContainerDto'
+        accesses:
+          type: array
+          items:
+            $ref: '#/components/schemas/DatabaseAccessDto'
+        creator:
+          $ref: '#/components/schemas/UserBriefDto'
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        created:
+          type: string
+          format: date-time
+        exchange_name:
+          type: string
+          example: dbrepo/air_quality
+        internal_name:
+          type: string
+          example: weather_australia
+        is_public:
+          type: boolean
+          example: true
+    IdentifierDto:
+      required:
+      - container id
+      - creators
+      - database id
+      - execution
+      - publication_year
+      - query
+      - query_hash
+      - query_normalized
+      - result_hash
+      - result_number
+      - title
+      - type
+      - visibility
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+        title:
+          type: string
+          example: "Airquality Stephansplatz, Vienna, Austria"
+        description:
+          type: string
+          example: "Air quality reports at Stephansplatz, Vienna"
+        query:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        execution:
+          type: string
+          format: date-time
+        visibility:
+          type: string
+          example: everyone
+          enum:
+          - everyone
+          - self
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        license:
+          $ref: '#/components/schemas/LicenseDto'
+        creators:
+          type: array
+          items:
+            $ref: '#/components/schemas/CreatorDto'
+        created:
+          type: string
+          format: date-time
+        container id:
+          type: integer
+          format: int64
+          example: 1
+        database id:
+          type: integer
+          format: int64
+          example: 1
+        query id:
+          type: integer
+          format: int64
+          example: 1
+        query_normalized:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        related:
+          type: array
+          items:
+            $ref: '#/components/schemas/RelatedIdentifierDto'
+        query_hash:
+          type: string
+          description: query hash in sha512
+        result_hash:
+          type: string
+        result_number:
+          type: integer
+          format: int64
+          example: 1
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        last_modified:
+          type: string
+          format: date-time
+    ImageBriefDto:
+      required:
+      - id
+      - registry
+      - repository
+      - tag
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        registry:
+          type: string
+          example: docker.io/library
+        repository:
+          type: string
+          example: mariadb
+        tag:
+          type: string
+          example: "10.5"
+    ImageDateDto:
+      required:
+      - database_format
+      - example
+      - has_time
+      - id
+      - unix_format
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        example:
+          type: string
+          example: 30.01.2022
+        database_format:
+          type: string
+          example: '%d.%c.%Y'
+        unix_format:
+          type: string
+          example: dd.MM.YYYY
+        has_time:
+          type: boolean
+          example: false
+        created_at:
+          type: string
+          format: date-time
+    ImageDto:
+      required:
+      - default_port
+      - dialect
+      - driver_class
+      - id
+      - jdbc_method
+      - registry
+      - repository
+      - tag
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        registry:
+          type: string
+          example: docker.io/library
+        repository:
+          type: string
+          example: mariadb
+        tag:
+          type: string
+          example: "10.5"
+        dialect:
+          type: string
+          example: org.hibernate.dialect.MariaDBDialect
+        hash:
+          type: string
+          example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e
+        compiled:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21.678396092Z
+        size:
+          type: integer
+          example: 314295447
+        driver_class:
+          type: string
+          example: org.mariadb.jdbc.Driver
+        date_formats:
+          type: array
+          items:
+            $ref: '#/components/schemas/ImageDateDto'
+        jdbc_method:
+          type: string
+          example: mariadb
+        default_port:
+          type: integer
+          format: int32
+          example: 3306
+    LicenseDto:
+      required:
+      - identifier
+      - uri
+      type: object
+      properties:
+        identifier:
+          type: string
+          example: MIT
+        uri:
+          type: string
+          example: https://opensource.org/licenses/MIT
+    QueryDto:
+      required:
+      - cid
+      - created
+      - creator
+      - dbid
+      - id
+      - is_persisted
+      - query
+      - query_hash
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        cid:
+          type: integer
+          format: int64
+        dbid:
+          type: integer
+          format: int64
+        creator:
+          $ref: '#/components/schemas/UserDto'
+        execution:
+          type: string
+          format: date-time
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality`
+        type:
+          type: string
+          example: query
+          enum:
+          - query
+          - view
+        identifier:
+          $ref: '#/components/schemas/IdentifierDto'
+        created:
+          type: string
+          format: date-time
+        query_normalized:
+          type: string
+          example: SELECT `id` FROM `air_quality`
+        query_hash:
+          type: string
+          example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76
+        is_persisted:
+          type: boolean
+          example: true
+        result_hash:
+          type: string
+          example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76
+        result_number:
+          type: integer
+          format: int64
+          example: 1
+        last_modified:
+          type: string
+          format: date-time
+    RelatedIdentifierDto:
+      required:
+      - created
+      - id
+      - value
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        value:
+          type: string
+          example: 10.70124/dc4zh-9ce78
+        type:
+          type: string
+          example: DOI
+          enum:
+          - DOI
+          - URL
+          - URN
+          - ARK
+          - arXiv
+          - bibcode
+          - EAN13
+          - EISSN
+          - Handle
+          - IGSN
+          - ISBN
+          - ISTC
+          - LISSN
+          - LSID
+          - PMID
+          - PURL
+          - UPC
+          - w3id
+        relation:
+          type: string
+          example: Cites
+          enum:
+          - IsCitedBy
+          - Cites
+          - IsSupplementTo
+          - IsSupplementedBy
+          - IsContinuedBy
+          - Continues
+          - IsDescribedBy
+          - Describes
+          - HasMetadata
+          - IsMetadataFor
+          - HasVersion
+          - IsVersionOf
+          - IsNewVersionOf
+          - IsPreviousVersionOf
+          - IsPartOf
+          - HasPart
+          - IsPublishedIn
+          - IsReferencedBy
+          - References
+          - IsDocumentedBy
+          - Documents
+          - IsCompiledBy
+          - Compiles
+          - IsVariantFormOf
+          - IsOriginalFormOf
+          - IsIdenticalTo
+          - IsReviewedBy
+          - Reviews
+          - IsDerivedFrom
+          - IsSourceOf
+          - IsRequiredBy
+          - Requires
+          - IsObsoletedBy
+          - Obsoletes
+        created:
+          type: string
+          format: date-time
+        last_modified:
+          type: string
+          format: date-time
+    TableBriefDto:
+      required:
+      - columns
+      - description
+      - id
+      - internal_name
+      - name
+      - owner
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality in Austria
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnBriefDto'
+        internal_name:
+          type: string
+          example: air_quality
+    UserAttributeDto:
+      type: object
+      properties:
+        name:
+          type: string
+          example: theme_dark
+        value:
+          type: string
+          example: "true"
+    UserBriefDto:
+      required:
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+        email_verified:
+          type: boolean
+          example: true
+    UserDto:
+      required:
+      - email
+      - email_verified
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        attributes:
+          type: array
+          items:
+            $ref: '#/components/schemas/UserAttributeDto'
+        containers:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        databases:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        identifiers:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        email:
+          type: string
+          example: jcarberry@brown.edu
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+        email_verified:
+          type: boolean
+          example: true
+    ViewBriefDto:
+      required:
+      - created
+      - creator
+      - id
+      - internal_name
+      - name
+      - query
+      - vdbid
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        vdbid:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
+        created:
+          type: string
+          format: date-time
+        creator:
+          $ref: '#/components/schemas/UserDto'
+        internal_name:
+          type: string
+          example: air_quality
+        is_public:
+          type: boolean
+          example: true
+        initial_view:
+          type: boolean
+          description: True if it is the default view for the database
+          example: true
+        last_modified:
+          type: string
+          format: date-time
+    ViewCreateDto:
+      required:
+      - is_public
+      - name
+      - query
+      type: object
+      properties:
+        name:
+          type: string
+          example: Air Quality
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality`
+        is_public:
+          type: boolean
+          example: true
+    TableCsvDto:
+      required:
+      - data
+      type: object
+      properties:
+        data:
+          type: object
+          additionalProperties:
+            type: object
+    ImportDto:
+      required:
+      - location
+      - separator
+      type: object
+      properties:
+        location:
+          type: string
+          example: /tmp/file.csv
+        separator:
+          type: string
+          example: ","
+        quote:
+          type: string
+          example: '"'
+        skip_lines:
+          minimum: 0
+          type: integer
+          format: int64
+        false_element:
+          type: string
+        true_element:
+          type: string
+        null_element:
+          type: string
+          example: NA
+    ExecuteStatementDto:
+      required:
+      - statement
+      type: object
+      properties:
+        statement:
+          type: string
+          example: SELECT `id` FROM `air_quality`
+        timestamp:
+          type: string
+          description: Execute query for data at this timestamp
+          format: date-time
+    ViewDto:
+      required:
+      - created
+      - creator
+      - database
+      - id
+      - internalName
+      - name
+      - query
+      - vdbid
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        vdbid:
+          type: integer
+          format: int64
+        database:
+          $ref: '#/components/schemas/DatabaseDto'
+        name:
+          type: string
+          example: Air Quality
+        internalName:
+          type: string
+          example: air_quality
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
+        created:
+          type: string
+          format: date-time
+        creator:
+          $ref: '#/components/schemas/UserDto'
+        is_public:
+          type: boolean
+          example: true
+        initial_view:
+          type: boolean
+          description: True if it is the default view for the database
+          example: true
+        last_modified:
+          type: string
+          format: date-time
+    CreatorBriefDto:
+      required:
+      - firstname
+      - lastname
+      type: object
+      properties:
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Wesleyan University
+    IdentifierBriefDto:
+      required:
+      - container id
+      - creators
+      - database id
+      - id
+      - publication_year
+      - title
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        title:
+          type: string
+          example: "Airquality Stephansplatz, Vienna, Austria"
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        creators:
+          type: array
+          items:
+            $ref: '#/components/schemas/CreatorBriefDto'
+        container id:
+          type: integer
+          format: int64
+          example: 1
+        database id:
+          type: integer
+          format: int64
+          example: 1
+        query id:
+          type: integer
+          format: int64
+          example: 1
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+    QueryBriefDto:
+      required:
+      - cid
+      - created
+      - creator
+      - dbid
+      - id
+      - query
+      - query_hash
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        cid:
+          type: integer
+          format: int64
+        dbid:
+          type: integer
+          format: int64
+        creator:
+          $ref: '#/components/schemas/UserDto'
+        execution:
+          type: string
+          format: date-time
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality`
+        type:
+          type: string
+          example: query
+          enum:
+          - query
+          - view
+        identifier:
+          $ref: '#/components/schemas/IdentifierBriefDto'
+        created:
+          type: string
+          format: date-time
+        query_normalized:
+          type: string
+          example: SELECT `id` FROM `air_quality`
+        query_hash:
+          type: string
+          example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76
+        result_hash:
+          type: string
+          example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76
+        result_number:
+          type: integer
+          format: int64
+          example: 1
+        last_modified:
+          type: string
+          format: date-time
+    TableCsvDeleteDto:
+      required:
+      - keys
+      type: object
+      properties:
+        keys:
+          type: object
+          additionalProperties:
+            type: object
+  securitySchemes:
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
diff --git a/.docs/.swagger/api-semantics.yaml b/.docs/.swagger/api-semantics.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c001c6d7bb3539f64f83b76b093d90ac679ce30b
--- /dev/null
+++ b/.docs/.swagger/api-semantics.yaml
@@ -0,0 +1,685 @@
+openapi: 3.0.1
+info:
+  title: Database Repository Semantic Service API
+  description: Service that manages the tables
+  contact:
+    name: Prof. Andreas Rauber
+    email: andreas.rauber@tuwien.ac.at
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0
+  version: 1.2.0
+externalDocs:
+  description: Sourcecode Documentation
+  url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services
+servers:
+- url: http://localhost:9097
+  description: Generated server url
+- url: https://dbrepo2.tuwien.ac.at
+  description: Sandbox
+paths:
+  /api/semantic/ontology/{id}:
+    get:
+      tags:
+      - ontology-endpoint
+      summary: Find one ontology
+      operationId: find
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Find one ontology
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/OntologyDto'
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+    put:
+      tags:
+      - ontology-endpoint
+      summary: Update an ontology
+      operationId: update
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/OntologyModifyDto'
+        required: true
+      responses:
+        "202":
+          description: Updated ontology successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/OntologyDto'
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+    delete:
+      tags:
+      - ontology-endpoint
+      summary: Delete an ontology
+      operationId: delete
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "202":
+          description: Deleted ontology successfully
+          content:
+            application/json: {}
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/semantic/unit:
+    get:
+      tags:
+      - semantics-endpoint
+      summary: List semantic units
+      operationId: findAllUnits
+      responses:
+        "200":
+          description: Find all semantic units
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/UnitDto'
+    post:
+      tags:
+      - semantics-endpoint
+      summary: Save a semantic unit
+      operationId: saveUnit
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/UnitSaveDto'
+        required: true
+      responses:
+        "202":
+          description: Saved a semantic unit
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/UnitDto'
+      security:
+      - bearerAuth: []
+  /api/semantic/ontology:
+    get:
+      tags:
+      - ontology-endpoint
+      summary: List all ontologies
+      operationId: findAll
+      responses:
+        "200":
+          description: List all ontologies
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/OntologyDto'
+    post:
+      tags:
+      - ontology-endpoint
+      summary: Register a new ontology
+      operationId: create
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/OntologyCreateDto'
+        required: true
+      responses:
+        "201":
+          description: Registered ontology successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/OntologyDto'
+      security:
+      - bearerAuth: []
+  /api/semantic/concept:
+    get:
+      tags:
+      - semantics-endpoint
+      summary: List semantic concepts
+      operationId: findAllConcepts
+      responses:
+        "200":
+          description: Find all semantic concepts
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/ConceptDto'
+    post:
+      tags:
+      - semantics-endpoint
+      summary: Create or update a semantic concept
+      operationId: saveUnit_1
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ConceptSaveDto'
+        required: true
+      responses:
+        "202":
+          description: Saved a semantic concept
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ConceptDto'
+      security:
+      - bearerAuth: []
+  /api/semantic/ontology/{id}/entity:
+    get:
+      tags:
+      - query-endpoint
+      summary: Find entities
+      operationId: find_1
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: label
+        in: query
+        required: false
+        schema:
+          type: string
+      - name: uri
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: Found entities
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/EntityDto'
+        "417":
+          description: Generated query or uri is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Filter params are invalid
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/semantic/database/{databaseId}/table/{tableId}:
+    get:
+      tags:
+      - table-endpoint
+      summary: Suggest table semantics
+      operationId: analyseTable
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "417":
+          description: Generated query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: Could not find the table
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Suggested table semantics successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/TableColumnEntityDto'
+      security:
+      - bearerAuth: []
+  /api/semantic/database/{databaseId}/table/{tableId}/column/{columnId}:
+    get:
+      tags:
+      - table-endpoint
+      summary: Suggest table column semantics
+      operationId: analyseTableColumn
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: columnId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "417":
+          description: Generated query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Suggested table column semantics successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/TableColumnEntityDto'
+        "404":
+          description: Could not find the table column
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+components:
+  schemas:
+    OntologyModifyDto:
+      required:
+      - prefix
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: Ontology URI
+        prefix:
+          type: string
+          example: Ontology prefix
+        sparql_endpoint:
+          type: string
+          example: Ontology SPARQL endpoint
+    OntologyDto:
+      required:
+      - created
+      - id
+      - prefix
+      - rdf
+      - sparql
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        uri:
+          type: string
+          example: Ontology URI
+        prefix:
+          type: string
+          example: Ontology prefix
+        sparql:
+          type: boolean
+          example: true
+        rdf:
+          type: boolean
+          example: true
+        creator:
+          $ref: '#/components/schemas/UserBriefDto'
+        created:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21.678396092Z
+        sparql_endpoint:
+          type: string
+          example: Ontology SPARQL endpoint
+    UserBriefDto:
+      required:
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+        email_verified:
+          type: boolean
+          example: true
+    ApiErrorDto:
+      required:
+      - code
+      - message
+      - status
+      type: object
+      properties:
+        status:
+          type: string
+          example: STATUS
+          enum:
+          - 100 CONTINUE
+          - 101 SWITCHING_PROTOCOLS
+          - 102 PROCESSING
+          - 103 EARLY_HINTS
+          - 103 CHECKPOINT
+          - 200 OK
+          - 201 CREATED
+          - 202 ACCEPTED
+          - 203 NON_AUTHORITATIVE_INFORMATION
+          - 204 NO_CONTENT
+          - 205 RESET_CONTENT
+          - 206 PARTIAL_CONTENT
+          - 207 MULTI_STATUS
+          - 208 ALREADY_REPORTED
+          - 226 IM_USED
+          - 300 MULTIPLE_CHOICES
+          - 301 MOVED_PERMANENTLY
+          - 302 FOUND
+          - 302 MOVED_TEMPORARILY
+          - 303 SEE_OTHER
+          - 304 NOT_MODIFIED
+          - 305 USE_PROXY
+          - 307 TEMPORARY_REDIRECT
+          - 308 PERMANENT_REDIRECT
+          - 400 BAD_REQUEST
+          - 401 UNAUTHORIZED
+          - 402 PAYMENT_REQUIRED
+          - 403 FORBIDDEN
+          - 404 NOT_FOUND
+          - 405 METHOD_NOT_ALLOWED
+          - 406 NOT_ACCEPTABLE
+          - 407 PROXY_AUTHENTICATION_REQUIRED
+          - 408 REQUEST_TIMEOUT
+          - 409 CONFLICT
+          - 410 GONE
+          - 411 LENGTH_REQUIRED
+          - 412 PRECONDITION_FAILED
+          - 413 PAYLOAD_TOO_LARGE
+          - 413 REQUEST_ENTITY_TOO_LARGE
+          - 414 URI_TOO_LONG
+          - 414 REQUEST_URI_TOO_LONG
+          - 415 UNSUPPORTED_MEDIA_TYPE
+          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
+          - 417 EXPECTATION_FAILED
+          - 418 I_AM_A_TEAPOT
+          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
+          - 420 METHOD_FAILURE
+          - 421 DESTINATION_LOCKED
+          - 422 UNPROCESSABLE_ENTITY
+          - 423 LOCKED
+          - 424 FAILED_DEPENDENCY
+          - 425 TOO_EARLY
+          - 426 UPGRADE_REQUIRED
+          - 428 PRECONDITION_REQUIRED
+          - 429 TOO_MANY_REQUESTS
+          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
+          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
+          - 500 INTERNAL_SERVER_ERROR
+          - 501 NOT_IMPLEMENTED
+          - 502 BAD_GATEWAY
+          - 503 SERVICE_UNAVAILABLE
+          - 504 GATEWAY_TIMEOUT
+          - 505 HTTP_VERSION_NOT_SUPPORTED
+          - 506 VARIANT_ALSO_NEGOTIATES
+          - 507 INSUFFICIENT_STORAGE
+          - 508 LOOP_DETECTED
+          - 509 BANDWIDTH_LIMIT_EXCEEDED
+          - 510 NOT_EXTENDED
+          - 511 NETWORK_AUTHENTICATION_REQUIRED
+        message:
+          type: string
+          example: Error message
+        code:
+          type: string
+          example: error.service.code
+    UnitSaveDto:
+      required:
+      - description
+      - name
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+    ColumnBriefDto:
+      required:
+      - column_type
+      - database_id
+      - id
+      - internal_name
+      - name
+      - table_id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: date
+        database_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: mdb_date
+        column_type:
+          type: string
+          example: date
+          enum:
+          - enum
+          - number
+          - decimal
+          - string
+          - text
+          - boolean
+          - date
+          - timestamp
+          - blob
+    UnitDto:
+      required:
+      - columns
+      - created
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        created:
+          type: string
+          format: date-time
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnBriefDto'
+    OntologyCreateDto:
+      required:
+      - prefix
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: Ontology URI
+        prefix:
+          type: string
+          example: Ontology prefix
+        sparql_endpoint:
+          type: string
+          example: Ontology SPARQL endpoint
+    ConceptSaveDto:
+      required:
+      - description
+      - name
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+    ConceptDto:
+      required:
+      - columns
+      - created
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        created:
+          type: string
+          format: date-time
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnBriefDto'
+    EntityDto:
+      required:
+      - label
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: https://www.wikidata.org/entity/Q1686799
+        label:
+          type: string
+          example: Apache Jena
+        description:
+          type: string
+          example: open source semantic web framework for Java
+    TableColumnEntityDto:
+      required:
+      - columnId
+      - databaseId
+      - tableId
+      - uri
+      type: object
+      properties:
+        databaseId:
+          type: integer
+          format: int64
+          example: 1
+        tableId:
+          type: integer
+          format: int64
+          example: 1
+        columnId:
+          type: integer
+          format: int64
+          example: 1
+        uri:
+          type: string
+          example: https://www.wikidata.org/entity/Q1686799
+        label:
+          type: string
+          example: Apache Jena
+        description:
+          type: string
+          example: open source semantic web framework for Java
+  securitySchemes:
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
diff --git a/.docs/.swagger/api-table.yaml b/.docs/.swagger/api-table.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9639c5fc4e24d730136b88d16a7b5a526dc469d4
--- /dev/null
+++ b/.docs/.swagger/api-table.yaml
@@ -0,0 +1,860 @@
+openapi: 3.0.1
+info:
+  title: Database Repository Table Service API
+  description: Service that manages the tables
+  contact:
+    name: Prof. Andreas Rauber
+    email: andreas.rauber@tuwien.ac.at
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0
+  version: 1.2.0
+externalDocs:
+  description: Sourcecode Documentation
+  url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services
+servers:
+- url: http://localhost:9094
+  description: Generated server url
+- url: https://dbrepo2.tuwien.ac.at
+  description: Sandbox
+paths:
+  /api/container/{id}/database/{databaseId}/table/{tableId}/column/{columnId}:
+    put:
+      tags:
+      - table-column-endpoint
+      summary: Update a table column semantic mapping
+      operationId: update
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: columnId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: Authorization
+        in: header
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ColumnSemanticsUpdateDto'
+        required: true
+      responses:
+        "404":
+          description: "Table, database, semantic concept, unit of measurement or\
+            \ container could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "202":
+          description: Updated column semantics successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ColumnDto'
+        "403":
+          description: Access to the database is forbidden
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Update semantic concept query is malformed or update unit of
+            measurement query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Update column semantics not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ColumnDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/table:
+    get:
+      tags:
+      - table-endpoint
+      summary: List all tables
+      operationId: list
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Database could not be found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: List tables not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: List tables
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/TableBriefDto'
+      security:
+      - bearerAuth: []
+    post:
+      tags:
+      - table-endpoint
+      summary: Create a table
+      operationId: create
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/TableCreateDto'
+        required: true
+      responses:
+        "501":
+          description: Image is not supported
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "504":
+          description: Broker service failed to create queue
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: "Database, container or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "409":
+          description: Create table conflicts with existing table name
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Create table not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "201":
+          description: Created a new table
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/TableBriefDto'
+        "400":
+          description: Create table query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/container/{id}/database/{databaseId}/table/{tableId}:
+    get:
+      tags:
+      - table-endpoint
+      summary: Get information about table
+      operationId: findById
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "405":
+          description: Find table not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Find table successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/TableDto'
+        "403":
+          description: Access to the database is forbidden
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: "Table, database or container could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+    delete:
+      tags:
+      - table-endpoint
+      summary: Delete a table
+      operationId: delete
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "501":
+          description: Image is not supported
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "202":
+          description: Delete table successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/TableDto'
+        "405":
+          description: Delete table not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "423":
+          description: Delete table resulted in an invalid state
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "400":
+          description: Delete table query resulted in an invalid query statement
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "403":
+          description: Access to the database is forbidden
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: "Table, database or container could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+components:
+  schemas:
+    ColumnSemanticsUpdateDto:
+      type: object
+      properties:
+        concept_uri:
+          type: string
+        unit_uri:
+          type: string
+    ApiErrorDto:
+      required:
+      - code
+      - message
+      - status
+      type: object
+      properties:
+        status:
+          type: string
+          example: STATUS
+          enum:
+          - 100 CONTINUE
+          - 101 SWITCHING_PROTOCOLS
+          - 102 PROCESSING
+          - 103 EARLY_HINTS
+          - 103 CHECKPOINT
+          - 200 OK
+          - 201 CREATED
+          - 202 ACCEPTED
+          - 203 NON_AUTHORITATIVE_INFORMATION
+          - 204 NO_CONTENT
+          - 205 RESET_CONTENT
+          - 206 PARTIAL_CONTENT
+          - 207 MULTI_STATUS
+          - 208 ALREADY_REPORTED
+          - 226 IM_USED
+          - 300 MULTIPLE_CHOICES
+          - 301 MOVED_PERMANENTLY
+          - 302 FOUND
+          - 302 MOVED_TEMPORARILY
+          - 303 SEE_OTHER
+          - 304 NOT_MODIFIED
+          - 305 USE_PROXY
+          - 307 TEMPORARY_REDIRECT
+          - 308 PERMANENT_REDIRECT
+          - 400 BAD_REQUEST
+          - 401 UNAUTHORIZED
+          - 402 PAYMENT_REQUIRED
+          - 403 FORBIDDEN
+          - 404 NOT_FOUND
+          - 405 METHOD_NOT_ALLOWED
+          - 406 NOT_ACCEPTABLE
+          - 407 PROXY_AUTHENTICATION_REQUIRED
+          - 408 REQUEST_TIMEOUT
+          - 409 CONFLICT
+          - 410 GONE
+          - 411 LENGTH_REQUIRED
+          - 412 PRECONDITION_FAILED
+          - 413 PAYLOAD_TOO_LARGE
+          - 413 REQUEST_ENTITY_TOO_LARGE
+          - 414 URI_TOO_LONG
+          - 414 REQUEST_URI_TOO_LONG
+          - 415 UNSUPPORTED_MEDIA_TYPE
+          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
+          - 417 EXPECTATION_FAILED
+          - 418 I_AM_A_TEAPOT
+          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
+          - 420 METHOD_FAILURE
+          - 421 DESTINATION_LOCKED
+          - 422 UNPROCESSABLE_ENTITY
+          - 423 LOCKED
+          - 424 FAILED_DEPENDENCY
+          - 425 TOO_EARLY
+          - 426 UPGRADE_REQUIRED
+          - 428 PRECONDITION_REQUIRED
+          - 429 TOO_MANY_REQUESTS
+          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
+          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
+          - 500 INTERNAL_SERVER_ERROR
+          - 501 NOT_IMPLEMENTED
+          - 502 BAD_GATEWAY
+          - 503 SERVICE_UNAVAILABLE
+          - 504 GATEWAY_TIMEOUT
+          - 505 HTTP_VERSION_NOT_SUPPORTED
+          - 506 VARIANT_ALSO_NEGOTIATES
+          - 507 INSUFFICIENT_STORAGE
+          - 508 LOOP_DETECTED
+          - 509 BANDWIDTH_LIMIT_EXCEEDED
+          - 510 NOT_EXTENDED
+          - 511 NETWORK_AUTHENTICATION_REQUIRED
+        message:
+          type: string
+          example: Error message
+        code:
+          type: string
+          example: error.service.code
+    ColumnBriefDto:
+      required:
+      - column_type
+      - database_id
+      - id
+      - internal_name
+      - name
+      - table_id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: date
+        database_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: mdb_date
+        column_type:
+          type: string
+          example: date
+          enum:
+          - enum
+          - number
+          - decimal
+          - string
+          - text
+          - boolean
+          - date
+          - timestamp
+          - blob
+    ColumnDto:
+      required:
+      - auto_generated
+      - column_type
+      - id
+      - internal_name
+      - is_null_allowed
+      - is_primary_key
+      - is_public
+      - name
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Date
+        length:
+          type: integer
+          format: int32
+          example: 255
+        concept:
+          $ref: '#/components/schemas/ConceptDto'
+        unit:
+          $ref: '#/components/schemas/UnitDto'
+        internal_name:
+          type: string
+          example: mdb_date
+        date_format:
+          $ref: '#/components/schemas/ImageDateDto'
+        auto_generated:
+          type: boolean
+          example: false
+        is_primary_key:
+          type: boolean
+          example: true
+        index_length:
+          type: integer
+          format: int32
+        column_type:
+          type: string
+          example: string
+          enum:
+          - enum
+          - number
+          - decimal
+          - string
+          - text
+          - boolean
+          - date
+          - timestamp
+          - blob
+        is_public:
+          type: boolean
+          example: true
+        is_null_allowed:
+          type: boolean
+          example: false
+        enum_values:
+          type: array
+          items:
+            type: string
+    ConceptDto:
+      required:
+      - columns
+      - created
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        created:
+          type: string
+          format: date-time
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnBriefDto'
+    ImageDateDto:
+      required:
+      - database_format
+      - example
+      - has_time
+      - id
+      - unix_format
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        example:
+          type: string
+          example: 30.01.2022
+        database_format:
+          type: string
+          example: '%d.%c.%Y'
+        unix_format:
+          type: string
+          example: dd.MM.YYYY
+        has_time:
+          type: boolean
+          example: false
+        created_at:
+          type: string
+          format: date-time
+    UnitDto:
+      required:
+      - columns
+      - created
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        created:
+          type: string
+          format: date-time
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnBriefDto'
+    ColumnCreateDto:
+      required:
+      - name
+      - null_allowed
+      - primary_key
+      - type
+      type: object
+      properties:
+        name:
+          type: string
+          example: Date
+        type:
+          type: string
+          example: string
+          enum:
+          - enum
+          - number
+          - decimal
+          - string
+          - text
+          - boolean
+          - date
+          - timestamp
+          - blob
+        length:
+          type: integer
+          format: int32
+          example: 255
+        dfid:
+          type: integer
+          description: date format id
+          format: int64
+        primary_key:
+          type: boolean
+          example: false
+        index_length:
+          type: integer
+          format: int32
+        null_allowed:
+          type: boolean
+          example: true
+        enum_values:
+          type: array
+          description: "enum values, only considered when type = ENUM"
+          items:
+            type: string
+            description: "enum values, only considered when type = ENUM"
+    ConstraintsCreateDto:
+      type: object
+      properties:
+        uniques:
+          type: array
+          items:
+            type: array
+            items:
+              type: string
+        checks:
+          type: array
+          items:
+            type: string
+        foreign_keys:
+          type: array
+          items:
+            $ref: '#/components/schemas/ForeignKeyCreateDto'
+    ForeignKeyCreateDto:
+      type: object
+      properties:
+        columns:
+          type: array
+          items:
+            type: string
+        referenced_table:
+          type: string
+        referenced_columns:
+          type: array
+          items:
+            type: string
+        on_update:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+        on_delete:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+    TableCreateDto:
+      required:
+      - columns
+      - description
+      - name
+      type: object
+      properties:
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality in Austria
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnCreateDto'
+        constraints:
+          $ref: '#/components/schemas/ConstraintsCreateDto'
+    TableBriefDto:
+      required:
+      - columns
+      - description
+      - id
+      - internal_name
+      - name
+      - owner
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality in Austria
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnBriefDto'
+        internal_name:
+          type: string
+          example: air_quality
+    UserBriefDto:
+      required:
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+        email_verified:
+          type: boolean
+          example: true
+    ConstraintsDto:
+      type: object
+      properties:
+        uniques:
+          type: array
+          items:
+            type: array
+            items:
+              $ref: '#/components/schemas/ColumnDto'
+        checks:
+          type: array
+          items:
+            type: string
+        foreign_keys:
+          type: array
+          items:
+            $ref: '#/components/schemas/ForeignKeyDto'
+    ForeignKeyDto:
+      type: object
+      properties:
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnDto'
+        referenced_table:
+          $ref: '#/components/schemas/TableBriefDto'
+        referenced_columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnDto'
+        on_update:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+        on_delete:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+    TableDto:
+      required:
+      - columns
+      - creator
+      - description
+      - id
+      - internal_name
+      - is_public
+      - name
+      - owner
+      - queue_name
+      - routing_key
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        creator:
+          $ref: '#/components/schemas/UserBriefDto'
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        description:
+          type: string
+          example: Air Quality in Austria
+        created:
+          type: string
+          format: date-time
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnDto'
+        constraints:
+          $ref: '#/components/schemas/ConstraintsDto'
+        internal_name:
+          type: string
+          example: air_quality
+        queue_name:
+          type: string
+          example: dbrepo/air_quality/air_quality
+        routing_key:
+          type: string
+          example: dbrepo/air_quality/air_quality/1
+        is_public:
+          type: boolean
+          example: true
+  securitySchemes:
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
diff --git a/.docs/.swagger/api-user.yaml b/.docs/.swagger/api-user.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..56bd25f5380528b7f08b44b29c83363103d9bd93
--- /dev/null
+++ b/.docs/.swagger/api-user.yaml
@@ -0,0 +1,1521 @@
+openapi: 3.0.1
+info:
+  title: Database Repository User Service API
+  description: Service that manages the users
+  contact:
+    name: Prof. Andreas Rauber
+    email: andreas.rauber@tuwien.ac.at
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0
+  version: 1.2.0
+externalDocs:
+  description: Wiki Documentation
+  url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/wikis
+servers:
+- url: http://localhost:9098
+  description: Generated server url
+paths:
+  /api/user/{id}:
+    get:
+      tags:
+      - user-endpoint
+      summary: Get a user info
+      operationId: find
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: string
+      responses:
+        "404":
+          description: User was not found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Find user is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "200":
+          description: Found user
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/UserDto'
+      security:
+      - bearerAuth: []
+    put:
+      tags:
+      - user-endpoint
+      summary: Modify user information
+      operationId: modify
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/UserUpdateDto'
+        required: true
+      responses:
+        "202":
+          description: Modified user information
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/UserDto'
+        "405":
+          description: Modify user is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: User attribute was not found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+      - bearerAuth: []
+  /api/user/{id}/theme:
+    put:
+      tags:
+      - user-endpoint
+      summary: Modify user theme
+      operationId: theme
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/UserThemeSetDto'
+        required: true
+      responses:
+        "405":
+          description: Modify user is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: User or user attribute was not found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "202":
+          description: Modified user theme
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/UserDto'
+      security:
+      - bearerAuth: []
+  /api/user/{id}/password:
+    put:
+      tags:
+      - user-endpoint
+      summary: Modify user password
+      operationId: password
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/UserPasswordDto'
+        required: true
+      responses:
+        "404":
+          description: User was not found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "405":
+          description: Modify user is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "202":
+          description: Modified user password
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/UserDto'
+      security:
+      - bearerAuth: []
+  /api/maintenance/message/{id}:
+    get:
+      tags:
+      - maintenance-endpoint
+      summary: Find one maintenance message
+      operationId: find_1
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Get messages
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/BannerMessageDto'
+    put:
+      tags:
+      - maintenance-endpoint
+      summary: Update maintenance message
+      operationId: update
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/BannerMessageUpdateDto'
+        required: true
+      responses:
+        "404":
+          description: Could not find message
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/BannerMessageNotFoundException'
+        "202":
+          description: Updated message
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/BannerMessageBriefDto'
+    delete:
+      tags:
+      - maintenance-endpoint
+      summary: Delete maintenance message
+      operationId: delete
+      parameters:
+      - name: id
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "202":
+          description: Deleted message
+          content:
+            application/json: {}
+        "404":
+          description: Could not find message
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/BannerMessageNotFoundException'
+  /api/user:
+    get:
+      tags:
+      - user-endpoint
+      summary: Find all users
+      operationId: findAll
+      responses:
+        "200":
+          description: List users
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/UserBriefDto'
+    post:
+      tags:
+      - user-endpoint
+      summary: Create user
+      operationId: create
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/SignupRequestDto'
+        required: true
+      responses:
+        "409":
+          description: User with username already exists
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "404":
+          description: Realm or default role not found
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        "201":
+          description: Created user
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/UserBriefDto'
+        "417":
+          description: User with e-mail already exists
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+  /api/maintenance/message:
+    get:
+      tags:
+      - maintenance-endpoint
+      summary: Find maintenance messages
+      operationId: list
+      responses:
+        "200":
+          description: List messages
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/BannerMessageDto'
+    post:
+      tags:
+      - maintenance-endpoint
+      summary: Create maintenance message
+      operationId: create_1
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/BannerMessageCreateDto'
+        required: true
+      responses:
+        "201":
+          description: Created message
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/BannerMessageBriefDto'
+  /api/maintenance/message/active:
+    get:
+      tags:
+      - maintenance-endpoint
+      summary: Find active maintenance messages
+      operationId: active
+      responses:
+        "200":
+          description: List messages
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/BannerMessageBriefDto'
+components:
+  schemas:
+    UserUpdateDto:
+      type: object
+      properties:
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Brown University
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+    ColumnBriefDto:
+      required:
+      - column_type
+      - database_id
+      - id
+      - internal_name
+      - name
+      - table_id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: date
+        database_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: mdb_date
+        column_type:
+          type: string
+          example: date
+          enum:
+          - enum
+          - number
+          - decimal
+          - string
+          - text
+          - boolean
+          - date
+          - timestamp
+          - blob
+    ContainerDto:
+      required:
+      - created
+      - hash
+      - id
+      - internal_name
+      - name
+      - running
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        hash:
+          type: string
+          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
+        name:
+          type: string
+          example: Air Quality
+        state:
+          type: string
+          example: running
+          enum:
+          - created
+          - restarting
+          - running
+          - paused
+          - exited
+          - dead
+        database:
+          $ref: '#/components/schemas/DatabaseDto'
+        running:
+          type: boolean
+          example: true
+        image:
+          $ref: '#/components/schemas/ImageBriefDto'
+        port:
+          type: integer
+          format: int32
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        created:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21.678396092Z
+        internal_name:
+          type: string
+          example: air-quality
+        ip_address:
+          type: string
+    CreatorDto:
+      required:
+      - firstname
+      - id
+      - lastname
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Wesleyan University
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+    DatabaseAccessDto:
+      required:
+      - type
+      - user
+      type: object
+      properties:
+        user:
+          $ref: '#/components/schemas/UserDto'
+        type:
+          type: string
+          enum:
+          - read
+          - write_own
+          - write_all
+        created:
+          type: string
+          format: date-time
+    DatabaseDto:
+      required:
+      - creator
+      - exchange_name
+      - id
+      - internal_name
+      - name
+      - owner
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        identifier:
+          $ref: '#/components/schemas/IdentifierDto'
+        description:
+          type: string
+          example: Weather Australia 2009-2021
+        tables:
+          type: array
+          items:
+            $ref: '#/components/schemas/TableBriefDto'
+        views:
+          type: array
+          items:
+            $ref: '#/components/schemas/ViewBriefDto'
+        image:
+          $ref: '#/components/schemas/ImageDto'
+        container:
+          $ref: '#/components/schemas/ContainerDto'
+        accesses:
+          type: array
+          items:
+            $ref: '#/components/schemas/DatabaseAccessDto'
+        creator:
+          $ref: '#/components/schemas/UserBriefDto'
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        created:
+          type: string
+          format: date-time
+        exchange_name:
+          type: string
+          example: dbrepo/air_quality
+        internal_name:
+          type: string
+          example: weather_australia
+        is_public:
+          type: boolean
+          example: true
+    IdentifierDto:
+      required:
+      - container id
+      - creators
+      - database id
+      - execution
+      - publication_year
+      - query
+      - query_hash
+      - query_normalized
+      - result_hash
+      - result_number
+      - title
+      - type
+      - visibility
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+        title:
+          type: string
+          example: "Airquality Stephansplatz, Vienna, Austria"
+        description:
+          type: string
+          example: "Air quality reports at Stephansplatz, Vienna"
+        query:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        execution:
+          type: string
+          format: date-time
+        visibility:
+          type: string
+          example: everyone
+          enum:
+          - everyone
+          - self
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        license:
+          $ref: '#/components/schemas/LicenseDto'
+        creators:
+          type: array
+          items:
+            $ref: '#/components/schemas/CreatorDto'
+        created:
+          type: string
+          format: date-time
+        container id:
+          type: integer
+          format: int64
+          example: 1
+        database id:
+          type: integer
+          format: int64
+          example: 1
+        query id:
+          type: integer
+          format: int64
+          example: 1
+        query_normalized:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        related:
+          type: array
+          items:
+            $ref: '#/components/schemas/RelatedIdentifierDto'
+        query_hash:
+          type: string
+          description: query hash in sha512
+        result_hash:
+          type: string
+        result_number:
+          type: integer
+          format: int64
+          example: 1
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        last_modified:
+          type: string
+          format: date-time
+    ImageBriefDto:
+      required:
+      - id
+      - registry
+      - repository
+      - tag
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        registry:
+          type: string
+          example: docker.io/library
+        repository:
+          type: string
+          example: mariadb
+        tag:
+          type: string
+          example: "10.5"
+    ImageDateDto:
+      required:
+      - database_format
+      - example
+      - has_time
+      - id
+      - unix_format
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        example:
+          type: string
+          example: 30.01.2022
+        database_format:
+          type: string
+          example: '%d.%c.%Y'
+        unix_format:
+          type: string
+          example: dd.MM.YYYY
+        has_time:
+          type: boolean
+          example: false
+        created_at:
+          type: string
+          format: date-time
+    ImageDto:
+      required:
+      - default_port
+      - dialect
+      - driver_class
+      - id
+      - jdbc_method
+      - registry
+      - repository
+      - tag
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        registry:
+          type: string
+          example: docker.io/library
+        repository:
+          type: string
+          example: mariadb
+        tag:
+          type: string
+          example: "10.5"
+        dialect:
+          type: string
+          example: org.hibernate.dialect.MariaDBDialect
+        hash:
+          type: string
+          example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e
+        compiled:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21.678396092Z
+        size:
+          type: integer
+          example: 314295447
+        driver_class:
+          type: string
+          example: org.mariadb.jdbc.Driver
+        date_formats:
+          type: array
+          items:
+            $ref: '#/components/schemas/ImageDateDto'
+        jdbc_method:
+          type: string
+          example: mariadb
+        default_port:
+          type: integer
+          format: int32
+          example: 3306
+    LicenseDto:
+      required:
+      - identifier
+      - uri
+      type: object
+      properties:
+        identifier:
+          type: string
+          example: MIT
+        uri:
+          type: string
+          example: https://opensource.org/licenses/MIT
+    RelatedIdentifierDto:
+      required:
+      - created
+      - id
+      - value
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        value:
+          type: string
+          example: 10.70124/dc4zh-9ce78
+        type:
+          type: string
+          example: DOI
+          enum:
+          - DOI
+          - URL
+          - URN
+          - ARK
+          - arXiv
+          - bibcode
+          - EAN13
+          - EISSN
+          - Handle
+          - IGSN
+          - ISBN
+          - ISTC
+          - LISSN
+          - LSID
+          - PMID
+          - PURL
+          - UPC
+          - w3id
+        relation:
+          type: string
+          example: Cites
+          enum:
+          - IsCitedBy
+          - Cites
+          - IsSupplementTo
+          - IsSupplementedBy
+          - IsContinuedBy
+          - Continues
+          - IsDescribedBy
+          - Describes
+          - HasMetadata
+          - IsMetadataFor
+          - HasVersion
+          - IsVersionOf
+          - IsNewVersionOf
+          - IsPreviousVersionOf
+          - IsPartOf
+          - HasPart
+          - IsPublishedIn
+          - IsReferencedBy
+          - References
+          - IsDocumentedBy
+          - Documents
+          - IsCompiledBy
+          - Compiles
+          - IsVariantFormOf
+          - IsOriginalFormOf
+          - IsIdenticalTo
+          - IsReviewedBy
+          - Reviews
+          - IsDerivedFrom
+          - IsSourceOf
+          - IsRequiredBy
+          - Requires
+          - IsObsoletedBy
+          - Obsoletes
+        created:
+          type: string
+          format: date-time
+        last_modified:
+          type: string
+          format: date-time
+    TableBriefDto:
+      required:
+      - columns
+      - description
+      - id
+      - internal_name
+      - name
+      - owner
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality in Austria
+        owner:
+          $ref: '#/components/schemas/UserBriefDto'
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnBriefDto'
+        internal_name:
+          type: string
+          example: air_quality
+    UserAttributeDto:
+      type: object
+      properties:
+        name:
+          type: string
+          example: theme_dark
+        value:
+          type: string
+          example: "true"
+    UserBriefDto:
+      required:
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+        email_verified:
+          type: boolean
+          example: true
+    UserDto:
+      required:
+      - email
+      - email_verified
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        attributes:
+          type: array
+          items:
+            $ref: '#/components/schemas/UserAttributeDto'
+        containers:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        databases:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        identifiers:
+          type: array
+          items:
+            $ref: '#/components/schemas/ContainerDto'
+        email:
+          type: string
+          example: jcarberry@brown.edu
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+        email_verified:
+          type: boolean
+          example: true
+    ViewBriefDto:
+      required:
+      - created
+      - creator
+      - id
+      - internal_name
+      - name
+      - query
+      - vdbid
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        vdbid:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
+        created:
+          type: string
+          format: date-time
+        creator:
+          $ref: '#/components/schemas/UserDto'
+        internal_name:
+          type: string
+          example: air_quality
+        is_public:
+          type: boolean
+          example: true
+        initial_view:
+          type: boolean
+          description: True if it is the default view for the database
+          example: true
+        last_modified:
+          type: string
+          format: date-time
+    ApiErrorDto:
+      required:
+      - code
+      - message
+      - status
+      type: object
+      properties:
+        status:
+          type: string
+          example: STATUS
+          enum:
+          - 100 CONTINUE
+          - 101 SWITCHING_PROTOCOLS
+          - 102 PROCESSING
+          - 103 EARLY_HINTS
+          - 103 CHECKPOINT
+          - 200 OK
+          - 201 CREATED
+          - 202 ACCEPTED
+          - 203 NON_AUTHORITATIVE_INFORMATION
+          - 204 NO_CONTENT
+          - 205 RESET_CONTENT
+          - 206 PARTIAL_CONTENT
+          - 207 MULTI_STATUS
+          - 208 ALREADY_REPORTED
+          - 226 IM_USED
+          - 300 MULTIPLE_CHOICES
+          - 301 MOVED_PERMANENTLY
+          - 302 FOUND
+          - 302 MOVED_TEMPORARILY
+          - 303 SEE_OTHER
+          - 304 NOT_MODIFIED
+          - 305 USE_PROXY
+          - 307 TEMPORARY_REDIRECT
+          - 308 PERMANENT_REDIRECT
+          - 400 BAD_REQUEST
+          - 401 UNAUTHORIZED
+          - 402 PAYMENT_REQUIRED
+          - 403 FORBIDDEN
+          - 404 NOT_FOUND
+          - 405 METHOD_NOT_ALLOWED
+          - 406 NOT_ACCEPTABLE
+          - 407 PROXY_AUTHENTICATION_REQUIRED
+          - 408 REQUEST_TIMEOUT
+          - 409 CONFLICT
+          - 410 GONE
+          - 411 LENGTH_REQUIRED
+          - 412 PRECONDITION_FAILED
+          - 413 PAYLOAD_TOO_LARGE
+          - 413 REQUEST_ENTITY_TOO_LARGE
+          - 414 URI_TOO_LONG
+          - 414 REQUEST_URI_TOO_LONG
+          - 415 UNSUPPORTED_MEDIA_TYPE
+          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
+          - 417 EXPECTATION_FAILED
+          - 418 I_AM_A_TEAPOT
+          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
+          - 420 METHOD_FAILURE
+          - 421 DESTINATION_LOCKED
+          - 422 UNPROCESSABLE_ENTITY
+          - 423 LOCKED
+          - 424 FAILED_DEPENDENCY
+          - 425 TOO_EARLY
+          - 426 UPGRADE_REQUIRED
+          - 428 PRECONDITION_REQUIRED
+          - 429 TOO_MANY_REQUESTS
+          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
+          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
+          - 500 INTERNAL_SERVER_ERROR
+          - 501 NOT_IMPLEMENTED
+          - 502 BAD_GATEWAY
+          - 503 SERVICE_UNAVAILABLE
+          - 504 GATEWAY_TIMEOUT
+          - 505 HTTP_VERSION_NOT_SUPPORTED
+          - 506 VARIANT_ALSO_NEGOTIATES
+          - 507 INSUFFICIENT_STORAGE
+          - 508 LOOP_DETECTED
+          - 509 BANDWIDTH_LIMIT_EXCEEDED
+          - 510 NOT_EXTENDED
+          - 511 NETWORK_AUTHENTICATION_REQUIRED
+        message:
+          type: string
+          example: Error message
+        code:
+          type: string
+          example: error.service.code
+    UserThemeSetDto:
+      required:
+      - theme_dark
+      type: object
+      properties:
+        theme_dark:
+          type: boolean
+          example: true
+    UserPasswordDto:
+      required:
+      - password
+      type: object
+      properties:
+        password:
+          type: string
+    BannerMessageUpdateDto:
+      required:
+      - message
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+        display_start:
+          type: string
+          format: date-time
+        display_end:
+          type: string
+          format: date-time
+    BannerMessageNotFoundException:
+      type: object
+      properties:
+        cause:
+          type: object
+          properties:
+            stackTrace:
+              type: array
+              items:
+                type: object
+                properties:
+                  classLoaderName:
+                    type: string
+                  moduleName:
+                    type: string
+                  moduleVersion:
+                    type: string
+                  methodName:
+                    type: string
+                  fileName:
+                    type: string
+                  lineNumber:
+                    type: integer
+                    format: int32
+                  nativeMethod:
+                    type: boolean
+                  className:
+                    type: string
+            message:
+              type: string
+            suppressed:
+              type: array
+              items:
+                type: object
+                properties:
+                  stackTrace:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        classLoaderName:
+                          type: string
+                        moduleName:
+                          type: string
+                        moduleVersion:
+                          type: string
+                        methodName:
+                          type: string
+                        fileName:
+                          type: string
+                        lineNumber:
+                          type: integer
+                          format: int32
+                        nativeMethod:
+                          type: boolean
+                        className:
+                          type: string
+                  message:
+                    type: string
+                  localizedMessage:
+                    type: string
+            localizedMessage:
+              type: string
+        stackTrace:
+          type: array
+          items:
+            type: object
+            properties:
+              classLoaderName:
+                type: string
+              moduleName:
+                type: string
+              moduleVersion:
+                type: string
+              methodName:
+                type: string
+              fileName:
+                type: string
+              lineNumber:
+                type: integer
+                format: int32
+              nativeMethod:
+                type: boolean
+              className:
+                type: string
+        message:
+          type: string
+        suppressed:
+          type: array
+          items:
+            type: object
+            properties:
+              stackTrace:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    classLoaderName:
+                      type: string
+                    moduleName:
+                      type: string
+                    moduleVersion:
+                      type: string
+                    methodName:
+                      type: string
+                    fileName:
+                      type: string
+                    lineNumber:
+                      type: integer
+                      format: int32
+                    nativeMethod:
+                      type: boolean
+                    className:
+                      type: string
+              message:
+                type: string
+              localizedMessage:
+                type: string
+        localizedMessage:
+          type: string
+    BannerMessageBriefDto:
+      required:
+      - message
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+    SignupRequestDto:
+      required:
+      - email
+      - password
+      - username
+      type: object
+      properties:
+        username:
+          pattern: "^[a-z0-9]{3,}$"
+          type: string
+          example: user
+        email:
+          type: string
+          example: user@example.com
+        password:
+          type: string
+    BannerMessageCreateDto:
+      required:
+      - message
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+        display_start:
+          type: string
+          format: date-time
+        display_end:
+          type: string
+          format: date-time
+    BannerMessageDto:
+      required:
+      - id
+      - message
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+        display_start:
+          type: string
+          format: date-time
+        display_end:
+          type: string
+          format: date-time
+  securitySchemes:
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
diff --git a/.docs/.swagger/dist.tar.gz b/.docs/.swagger/dist.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..c23425955d630805b73530bf20cad4c28369bcb1
Binary files /dev/null and b/.docs/.swagger/dist.tar.gz differ
diff --git a/.docs/.swagger/fetch.sh b/.docs/.swagger/fetch.sh
new file mode 100644
index 0000000000000000000000000000000000000000..378878f0ad59e76184a4ed1febf6784e34d4256d
--- /dev/null
+++ b/.docs/.swagger/fetch.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+# This script is executed before pushing to the pipeline for the moment.
+# @author: Martin Weise
+
+declare -A services
+services[5000]=analyse
+services[9050]=mirror
+services[9093]=data
+services[9099]=metadata
+
+function retrieve () {
+  if [[ "$2" == analyse ]]; then
+    echo "... retrieve json api from localhost:$1"
+    wget "http://localhost:$1/api-$2.json" -O "./.docs/.swagger/api-$2.yaml" -q
+  else
+    echo "... retrieve yaml api from localhost:$1"
+    wget "http://localhost:$1/v3/api-docs.yaml" -O "./.docs/.swagger/api-$2.yaml" -q
+  fi
+}
+
+for key in "${!services[@]}"; do
+  echo "Generating ${services[$key]} API"
+  retrieve "$key" "${services[$key]}"
+done
\ No newline at end of file
diff --git a/.docs/.swagger/generate.sh b/.docs/.swagger/generate.sh
new file mode 100644
index 0000000000000000000000000000000000000000..86268305f3b353e5a472fc3a48a2c2c12710ed25
--- /dev/null
+++ b/.docs/.swagger/generate.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+# clean up
+echo "clean up ./dist ./site"
+rm -rf ./dist ./site
+
+# ensure target directories are present
+echo "ensure target directory ./site are present"
+mkdir -p ./site
+
+# extract static site
+echo "extract static site .docs/.swagger/dist.tar.gz"
+tar xzf .docs/.swagger/dist.tar.gz
+for service in "analyse" "mirror" "data" "metadata" "upload"; do
+  mkdir -p ./site/$service
+  echo "extract static site ./dist -> ./site/$service"
+  cp -r ./dist/* ./site/$service
+  echo "placing .docs/.swagger/api-$service.yaml -> ./site/$service/api.yaml"
+  cp ".docs/.swagger/api-$service.yaml" "./site/$service/api.yaml"
+done
diff --git a/.docs/contact.md b/.docs/contact.md
new file mode 100644
index 0000000000000000000000000000000000000000..c299b470a214a6a5fc7abcbedf7d9a135ce8c0aa
--- /dev/null
+++ b/.docs/contact.md
@@ -0,0 +1,39 @@
+---
+author: Martin Weise
+hide:
+- navigation
+---
+
+# Contact
+
+## Team
+
+### Project Management
+
+Ao.univ.Prof. Dr. [Andreas Rauber](https://www.ifs.tuwien.ac.at/~andi)<br />
+Technische Universit&auml;t Wien<br />
+Research Unit Data Science<br />
+Favoritenstra&szlig;e 9-11<br />
+A-1040 Vienna, Austria
+
+### Development
+
+Projektass. Dipl.-Ing. [Martin Weise](https://ec.tuwien.ac.at/~weise/)<br />
+Technische Universit&auml;t Wien<br />
+Research Unit Data Science<br />
+Favoritenstra&szlig;e 9-11<br />
+A-1040 Vienna, Austria
+
+## Contributors (alphabetically)
+
+- Ganguly, Raman
+- Gergely, Eva
+- Grantner, Tobias
+- Karnbach, Geoffrey
+- Michlits, Cornelia
+- Rauber, Andreas
+- Staudinger, Moritz
+- Stytsenko, Kirill
+- Taha, Josef
+- Tsepelakis, Sotiris
+- Weise, Martin
diff --git a/.docs/customization.md b/.docs/customization.md
new file mode 100644
index 0000000000000000000000000000000000000000..af996d9c644c2964a92961c94bbc3b0e72c17404
--- /dev/null
+++ b/.docs/customization.md
@@ -0,0 +1,56 @@
+---
+author: Martin Weise
+hide:
+- navigation
+---
+
+# Customization
+
+!!! info "Abstract"
+
+    On this page, we showcase the customization capabilities of DBRepo to e.g. whitelabel your deployment.
+
+## Custom Title
+
+The default title is "Database Repository" and can be replaced by changing the `TITLE` environment variable.
+
+## Custom Logo
+
+The default placeholder logo consists of the two universities that developed this software. You can replace it by
+mounting your own logo with a volume.
+
+```console
+docker run -v /path/to/your_logo.png:/logo.png ...
+```
+
+In case your logo is not in PNG format, you need to change the environment variable `LOGO` accordingly, e.g. for a logo
+in JPEG format, set `LOGO: "/logo.JPEG"` in the `.env` file and start the container with a volume.
+
+```console
+docker run -v /path/to/your_logo.JPEG:/logo.JPEG ...
+```
+
+<figure markdown>
+![](images/custom_logo.png)
+<figcaption>Custom logo which replaces the default placeholder logo</figcaption>
+</figure>
+
+## Custom Icon
+
+The default placeholder icon can be replaced by mounting your own icon with a volume.
+
+```console
+docker run -v /path/to/your_logo.ico:/favicon.ico ...
+```
+
+<figure markdown>
+![](images/custom_icon.png)
+<figcaption>Custom icon which replaces the default placeholder icon</figcaption>
+</figure>
+
+In case your icon is not in ICO format, you need to change the environment variable `ICON` accordingly, e.g. for an icon
+in GIF format, set `ICON: "/favicon.GIF"` in the `.env` file and start the container with a volume.
+
+```console
+docker run -v /path/to/favicon.GIF:/favicon.GIF ...
+```
diff --git a/.docs/deployment.md b/.docs/deployment.md
new file mode 100644
index 0000000000000000000000000000000000000000..b3a35b8525f2a644b569f6d959cc9c38cba443dd
--- /dev/null
+++ b/.docs/deployment.md
@@ -0,0 +1,76 @@
+---
+author: Martin Weise
+hide:
+- navigation
+---
+
+# Deployment
+
+!!! info "Abstract"
+
+    We modified some services and exchanged them with reviewed, open-source implementations that extend the functionality
+    even more from version 1.2 onwards. On this page, some of the configuration possible is summarized.
+
+## Authentication Service
+
+## Broker Service
+
+### Authentication
+
+The RabbitMQ client can be authenticated through plain (username, password) and OAuth2 mechanisms. Note that the access
+token already contains a field `client_id=foo`, so the username is optional in `PlainCredentials()`.
+
+=== "Plain"
+
+    ``` py
+    import pika
+
+    credentials = pika.credentials.PlainCredentials("foo", "bar")
+    parameters = pika.ConnectionParameters('localhost', 5672, '/', credentials)
+    connection = pika.BlockingConnection(parameters)
+    channel = connection.channel()
+    channel.queue_declare(queue='test', durable=True)
+    channel.basic_publish(exchange='',
+    routing_key='test',
+    body=b'Hello World!')
+    print(" [x] Sent 'Hello World!'")
+    connection.close()
+    ```
+
+=== "OAuth2"
+
+    ``` py
+    import pika
+    
+    credentials = pika.credentials.PlainCredentials("", "THE_ACCESS_TOKEN")
+    parameters = pika.ConnectionParameters('localhost', 5672, '/', credentials)
+    connection = pika.BlockingConnection(parameters)
+    channel = connection.channel()
+    channel.queue_declare(queue='test', durable=True)
+    channel.basic_publish(exchange='',
+    routing_key='test',
+    body=b'Hello World!')
+    print(" [x] Sent 'Hello World!'")
+    connection.close()
+    ```
+
+## Identifier Service
+
+From version 1.2 onwards there are two modes for the Identifier Service:
+
+1. Persistent Identifier (PID)
+2. Digital Object Identifier (DOI)
+
+By default, the URI mode is used, creating a PID for databases or subsets. If starting the Identifier Service in DOI mode,
+a DOI is minted for persistent identification of databases or subsets. Using the DOI system is entirely *optional* and
+should not be done for test-deployments.
+
+<figure markdown>
+![](images/identifier-doi.png)
+<figcaption>Minting a test-DOI for a subset</figcaption>
+</figure>
+
+## Gateway Service
+
+From version 1.2 onwards we use both HTTP and HTTPS to serve the API, especially for the Authentication Service. The Discovery
+Service lists both the non-secure and secure ports.
diff --git a/.docs/docker/mweise.pub b/.docs/docker/mweise.pub
new file mode 100644
index 0000000000000000000000000000000000000000..4057727e50fb5ab4a2feb052257a4e0cf4ce2706
--- /dev/null
+++ b/.docs/docker/mweise.pub
@@ -0,0 +1,6 @@
+-----BEGIN PUBLIC KEY-----
+role: mweise
+
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiF4l7rlcaope9LGiodp6yHRtsUek
+WjYX8mVi3AAcuoXvKtnbRZTwX78FOID2zZiQSsHWIcuMDOKJfubNzWrtMw==
+-----END PUBLIC KEY-----
diff --git a/.docs/get-started.md b/.docs/get-started.md
new file mode 100644
index 0000000000000000000000000000000000000000..eecbd290c004609a88bad70c2d29f0a47f5b6903
--- /dev/null
+++ b/.docs/get-started.md
@@ -0,0 +1,152 @@
+---
+author: Martin Weise
+hide:
+
+- navigation
+
+---
+
+# Get Started
+
+!!! info "Abstract"
+
+    In this short getting started guide we show the dependencies to run the database repository and perform a small, 
+    local, test deployment for quickly trying out the features that the repository offers.
+
+## Requirements
+
+### Hardware
+
+For this small, local, test deployment any modern hardware would suffice, we recommend a dedicated virtual machine with
+the following settings. Note that most of the CPU and RAM resources will be needed for starting the infrastructure,
+this is because of Docker.
+
+- 8 CPU cores
+- 16GB RAM memory
+- 100GB SSD memory available
+
+### Software
+
+Install Docker Engine for your operating system. There are excellent guides available for Linux, we highly recommend
+to use a stable distribution such as [Debian](https://docs.docker.com/desktop/install/debian/). In the following guide
+we only consider Debian.
+
+## Deployment
+
+### Docker Compose
+
+We maintain a rapid prototype deployment option through Docker Compose (v2.17.0 and newer). This deployment creates the
+core infrastructure and a single Docker container for all user-generated databases.
+
+Download the
+latest [`docker-compose.yml`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/docker-compose.prod.yml),
+nginx reverse proxy
+conf [`dbrepo.conf`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/dbrepo.conf)
+and [`.env`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/.env.unix.example):
+
+    curl -o docker-compose.yml https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/docker-compose.prod.yml
+    curl -o dbrepo.conf https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/dbrepo.conf
+    curl -o .env https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/.env.unix.example
+
+Increase the virtual memory max swap limit for OpenSearch to at least 262144 on the *host machine* according
+to [the official manual](https://opensearch.org/docs/1.0/opensearch/install/important-settings/), you need *sudo*
+permissions for this (check first with `cat /proc/sys/vm/max_map_count`):
+
+    echo "vm.max_map_count=262144" >> /etc/sysctl.conf
+    sysctl -p
+
+Start the services:
+
+    docker compose pull
+    docker compose up -d
+
+View the logs:
+
+    docker compose logs -f
+
+The Metadata Database still needs to know that the Docker container that holds all user-generated databases exists, we
+need to insert it:
+
+    mariadb -h 127.0.0.1 -D fda -u root -pdbrepo -e "INSERT INTO `fda`.`mdb_containers` \
+    (name, internal_name, image_id, host, port, privileged_username, privileged_password) \
+    VALUES ('MariaDB 10.5', 'mariadb_10_5', 1, 'user-db', 3306, 'root', 'dbrepo')"
+
+You should now be able to view the front end at <a href="http://127.0.0.1:80" target="_blank">http://127.0.0.1:80</a>
+
+Please be warned that the default configuration is not intended for public deployments. It is only intended to have a
+running system within minutes to play around within the system and explore features.
+
+!!! warning "Known security issues with the default configuration"
+
+    The system is auto-configured for a small, local, test deployment and is *not* secure! You need to make modifications
+    in various places to make it secure:
+
+    * **Authentication Service**:
+
+        a. You need to use your own instance or configure a secure instance using a (self-signed) certificate.
+           Additionally, when serving from a non-default Authentication Service, you need to put it into the 
+           `JWT_ISSUER` environment variable (`.env`).
+
+        b. You need to change the default admin user `fda` password in Realm
+           master > Users > fda > Credentials > Reset password.
+
+        c. You need to change the client secrets for the clients `dbrepo-client` and `broker-client`. Do this in Realm
+           dbrepo > Clients > dbrepo-client > Credentials > Client secret > Regenerate. Do the same for the
+           broker-client.
+
+        d. You need to regenerate the public key of the `RS256` algorithm which is shared with all services to verify 
+           the signature of JWT tokens. Add your securely generated private key in Realm 
+           dbrepo > Realm settings > Keys > Providers > Add provider > rsa.
+
+    * **Broker Service**: by default, this service is configured with an administrative user that has major privileges.
+      You need to change the password of the user *fda* in Admin > Update this user > Password. We found this
+      [simple guide](https://onlinehelp.coveo.com/en/ces/7.0/administrator/changing_the_rabbitmq_administrator_password.htm)
+      to be very useful.
+
+    * **Search Database**: by default, this service is configured to require authentication with an administrative user
+      that is allowed to write into the indizes. Following
+      this [simple guide](https://www.elastic.co/guide/en/elasticsearch/reference/8.7/reset-password.html), this can be
+      achieved using the command line.
+
+    * **Gateway Service**: by default, no HTTPS is used that protects the services behind. You need to provide a trusted
+      SSL/TLS certificate in the configuration file or use your own proxy in front of the Gateway Service. See this
+      [simple guide](http://nginx.org/en/docs/http/configuring_https_servers.html) on how to install a SSL/TLS
+      certificate on NGINX.
+
+##### Migration from 1.2 to 1.3
+
+In case you have a previous deployment from version 1.2, shut down the containers and back them up manually. You can do
+this by using the `busybox` image. Replace `deadbeef` with your container name or hash:
+
+```console
+export NAME=dbrepo-userdb-xyz
+docker run --rm --volumes-from $NAME -v /home/$USER/backup:/backup busybox tar pcvfz /backup/$NAME.tar.gz /var/lib/mysql
+```
+
+!!! danger "Wipe all traces of DBRepo from your system"
+
+    To erase all traces of DBRepo from your computer or virtual machine, the following commands delete all containers,
+    volumes and networks that are present, execute the following **dangerous** command. It will **wipe** all information
+    about DBRepo from your system (excluding the images).
+    
+    ```console
+    docker container stop $(docker container ls -aq -f name=^/dbrepo-.*) || true
+    docker container rm $(docker container ls -aq -f name=^/dbrepo-.*) || true
+    docker volume rm $(docker volume ls -q -f name=^dbrepo-.*) || true
+    docker network rm $(docker network ls -q -f name=^dbrepo-.*) || true
+    ```
+
+You can restore the volume *after* downloading the new 1.3 images and creating the infrastructure:
+
+```console
+export NAME=dbrepo-userdb-xyz
+export PORT=12345
+docker container create -h $NAME --name $NAME -p $PORT:3306 -e MARIADB_ROOT_PASSWORD=mariadb --network userdb -v /backup mariadb:10.5
+docker run --rm --volumes-from $NAME -v /home/$USER/backup/.tar.gz:/backup/$NAME.tar.gz busybox sh -c 'cd /backup && tar xvfz /backup/$NAME.tar.gz && cp -r /backup/var/lib/mysql/* /var/lib/mysql'
+```
+
+Future releases will be backwards compatible and will come with migration scripts.
+
+### Kubernetes
+
+We maintain a RKE2 Kubernetes deployment from version 1.3 onwards. More on that when the release date is fixed.
diff --git a/.docs/images/DS-icon_white_hiRes.png b/.docs/images/DS-icon_white_hiRes.png
new file mode 100644
index 0000000000000000000000000000000000000000..862c2124ca4190ff6a12de31aeffa08f8e77f300
Binary files /dev/null and b/.docs/images/DS-icon_white_hiRes.png differ
diff --git a/.docs/images/TU_Signet_weiss_transparent_300dpi_RGB.png b/.docs/images/TU_Signet_weiss_transparent_300dpi_RGB.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d21cd14e55afc972f3903b2cbdf4f3b3c8cebf6
Binary files /dev/null and b/.docs/images/TU_Signet_weiss_transparent_300dpi_RGB.png differ
diff --git a/.docs/images/architecture-ui.png b/.docs/images/architecture-ui.png
new file mode 100644
index 0000000000000000000000000000000000000000..ec4d56dcfdb5df8f414139df0e360a84fe6f84fa
Binary files /dev/null and b/.docs/images/architecture-ui.png differ
diff --git a/.docs/images/architecture.png b/.docs/images/architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2353af4120193e1d777f1c1eaf8fad95a5c761c
Binary files /dev/null and b/.docs/images/architecture.png differ
diff --git a/.docs/images/auth-create.png b/.docs/images/auth-create.png
new file mode 100644
index 0000000000000000000000000000000000000000..9dc593be612a46a1664e231d1ada9b33ef858ac9
Binary files /dev/null and b/.docs/images/auth-create.png differ
diff --git a/.docs/images/custom_icon.png b/.docs/images/custom_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..fde478eaffef802311bc0a370931bf6a30f3eb82
Binary files /dev/null and b/.docs/images/custom_icon.png differ
diff --git a/.docs/images/custom_logo.png b/.docs/images/custom_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..b84dcdae2f5fd04d84245c05b20b0ad9ad342b12
Binary files /dev/null and b/.docs/images/custom_logo.png differ
diff --git a/.docs/images/deployment-tuwien.png b/.docs/images/deployment-tuwien.png
new file mode 100644
index 0000000000000000000000000000000000000000..642b1de2fe6dfa660b1978bbacb24f7e70cb2886
Binary files /dev/null and b/.docs/images/deployment-tuwien.png differ
diff --git a/.docs/images/deployment.png b/.docs/images/deployment.png
new file mode 100644
index 0000000000000000000000000000000000000000..14e87c96cd53a7ad763e178490ed0b342caacc45
Binary files /dev/null and b/.docs/images/deployment.png differ
diff --git a/.docs/images/groups-roles.png b/.docs/images/groups-roles.png
new file mode 100644
index 0000000000000000000000000000000000000000..8762013cda252dd93e4278df9f5e3994c4d6a8cb
Binary files /dev/null and b/.docs/images/groups-roles.png differ
diff --git a/.docs/images/identifier-doi.png b/.docs/images/identifier-doi.png
new file mode 100644
index 0000000000000000000000000000000000000000..114f42c224a95651fbd7216b5d8c3d5e0a826898
Binary files /dev/null and b/.docs/images/identifier-doi.png differ
diff --git a/.docs/images/illustration.jpg b/.docs/images/illustration.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..5596c0087ae3fa5820360a6274b63afaa44c4e87
Binary files /dev/null and b/.docs/images/illustration.jpg differ
diff --git a/.docs/images/signet.png b/.docs/images/signet.png
new file mode 100644
index 0000000000000000000000000000000000000000..08990d0b527dddbc1339fae08c9e0a4051748903
Binary files /dev/null and b/.docs/images/signet.png differ
diff --git a/.docs/images/signet_black.png b/.docs/images/signet_black.png
new file mode 100644
index 0000000000000000000000000000000000000000..7dbb087a3420da8535f2542c76f76a3916beb961
Binary files /dev/null and b/.docs/images/signet_black.png differ
diff --git a/.docs/images/signet_white.png b/.docs/images/signet_white.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a154120f6a7c172168096ad25da80711dc9cf8b
Binary files /dev/null and b/.docs/images/signet_white.png differ
diff --git a/.docs/index.md b/.docs/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..f3c3db46fe0b0fe30904060a1beb080d9147e733
--- /dev/null
+++ b/.docs/index.md
@@ -0,0 +1,44 @@
+---
+title: Home
+author: Martin Weise
+hide:
+- navigation
+---
+
+# DBRepo: A Database Repository to Support Research
+
+## Problem Statement
+
+Digital repositories see themselves more frequently encountered with the problem of making databases accessible in their
+collection. Challenges revolve around organizing, searching and retrieving content stored within databases and
+constitute a major technical burden as their internal representation greatly differs from static documents most digital
+repositories are designed for.
+
+[Get Started](/infrastructures/dbrepo/1.3/get-started){ .action-button .md-button .md-button--primary }
+[Learn More](/infrastructures/dbrepo/system){ .action-button .md-button .md-button--secondary }
+
+## Application Areas
+
+We present a database repository system that allows researchers to ingest data into a central, versioned repository
+through common interfaces, provides efficient access to arbitrary subsets of data even when the underlying data store is
+evolving, allows reproducing of query results and supports findable-, accessible-, interoperable- and reusable data.
+
+## Releases
+
+| Release | Links                                                                                                                                       | Status           |
+|---------|---------------------------------------------------------------------------------------------------------------------------------------------|------------------|
+| 1.3     | [Docs](/infrastructures/dbrepo/1.3/) &boxv; [Source](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tree/master) | Release Candidate |
+| latest  | [Docs](/infrastructures/dbrepo/latest/) &boxv; [Source](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tree/dev) | Developer Preview |
+
+Non-maintained releases:
+
+| Release | Links                                                                                                     | Status |
+|---------|-----------------------------------------------------------------------------------------------------------|--------|
+| 1.2     | [Source](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases/v1.1.1-alpha) | EOL    |
+| 1.1     | [Source](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.1.0-alpha)     | EOL    |
+
+## More Information
+
+- Demonstration instance [https://dbrepo1.ec.tuwien.ac.at](https://dbrepo1.ec.tuwien.ac.at)
+- Sandbox instance [https://dbrepo2.ec.tuwien.ac.at](https://dbrepo2.ec.tuwien.ac.at)
+- System description [https://doi.org/10.2218/ijdc.v17i1.825](https://doi.org/10.2218/ijdc.v17i1.825)
diff --git a/.docs/overrides/main.html b/.docs/overrides/main.html
new file mode 100644
index 0000000000000000000000000000000000000000..f822d1d94f61ac53ebe86891337968c68d330e02
--- /dev/null
+++ b/.docs/overrides/main.html
@@ -0,0 +1,24 @@
+{% extends "base.html" %}
+
+{% block announce %}
+<label for="version">Version</label>
+<select style="margin-left:8px;" id="version" name="version" onchange="switchVersion(this.options[this.selectedIndex].value)">
+    <option value="latest">latest</option>
+    <option value="1.3">1.3</option>
+</select>
+<script>
+    function getVersion() {
+        const segments = location.pathname.split('/')
+        if (segments.length === 5) {
+            return segments[3]
+        } else {
+            return '1.3'
+        }
+    }
+    function switchVersion(value) {
+        if (!value) { return }
+        this.location.href = location.protocol + '//' + location.host + '/infrastructures/dbrepo/' + value + '/'
+    }
+    document.getElementById("version").value = getVersion()
+</script>
+{% endblock %}
diff --git a/.docs/publications.md b/.docs/publications.md
new file mode 100644
index 0000000000000000000000000000000000000000..6cbac0fd445769866b0ff098542af32dbbcaa527
--- /dev/null
+++ b/.docs/publications.md
@@ -0,0 +1,40 @@
+---
+author: Martin Weise
+hide:
+- navigation
+---
+
+# Publications
+
+## Refereed
+
+##### 2022
+
+1. Ekaputra, F. E., Weise, M., Flicker, K., Salleh, M. R., Rahman, N. A., Miksa, T., & Rauber, A. (2022). Towards A 
+   Data Repository for Educational Factories. *Proceedings of the 8th International Conference on Data and Software
+   Engineering*, pp. 149-154. DOI: [10.1109/ICoDSE56892.2022.9971958](https://doi.org/10.1109/ICoDSE56892.2022.9971958).
+
+2. Weise, M., Staudinger, M., Michlits, C., Gergely, E., Stytsenko, K., Ganguly, R., & Rauber, A. (2022).
+   DBRepo: a Semantic Digital Repository for Relational Databases. *International Journal of Digital Curation*,
+   17(1), 11. DOI: [10.2218/ijdc.v17i1.825](https://doi.org/10.2218/ijdc.v17i1.825)
+
+##### 2021
+
+1. Weise, M., Michlits, C., Staudinger, M., Gergely, E., Stytsenko, K., Ganguly, R. and Rauber A., 2021. FDA-DBRepo: A
+   Data Preservation Repository Supporting FAIR Principles, Data Versioning and Reproducible Queries. *Proceedings of
+   the 17th International Conference on Digital Preservation*, Beijing, China, p.34.
+   DOI: [10.17605/OSF.IO/B7NX5](http://doi.org/10.17605/OSF.IO/B7NX5)
+
+## Other
+
+1. Weise, M. (2023). A Repository and Compute Environment for Sensitive Data. FAIRness for Closed Data,
+   at *EMBL Bioimaging and the European Open Science Cloud*, (Heidelberg, Germany). April, 19-20th, 2023.
+   DOI: [10.34726/3946](https://doi.org/10.34726/3946)
+
+2. Staudinger, M. (2022). DBRepo: A Repository to Save Research Databases. [Online].
+   URL: [https://www.tuwien.at/en/tu-wien/news/news-articles/news/dbrepo](https://www.tuwien.at/en/tu-wien/news/news-articles/news/dbrepo)
+   accessed 2022-04-12
+
+2. Gergely, E. (2021). Better Support for Research: Current Cooperation Projects. [Online].
+   URL: [https://zid.univie.ac.at/it-news/artikel/news/cluster-forschungsdaten/](https://zid.univie.ac.at/it-news/artikel/news/cluster-forschungsdaten/)
+   accessed 2022-04-12
diff --git a/.docs/redirect.html b/.docs/redirect.html
new file mode 100644
index 0000000000000000000000000000000000000000..ebe3f2d128c981bf8e1a4fc61c0dfaf9826c1117
--- /dev/null
+++ b/.docs/redirect.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Redirect Notice</title>
+    <meta http-equiv="Refresh" content="0; url='https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.3/'" />
+</head>
+<body>
+<h1>Redirect Notice</h1>
+<p>
+    This page should automatically open the documentation for version 1.3. In case this page does not load the site is
+    available at:
+</p>
+<p>
+    <a href="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.3/">https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.3/</a>
+</p>
+</body>
+</html>
+
diff --git a/.docs/requirements.txt b/.docs/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1df697b8b2fc6e9019545dffdb813e149bbf823f
--- /dev/null
+++ b/.docs/requirements.txt
@@ -0,0 +1,7 @@
+mkdocs==1.4.3
+mkdocs-material==9.1.17
+mkdocs-with-pdf==0.9.3
+mkdocs-material-extensions>=1.0.3
+requests>=2.27.0
+py-dotenv>=0.1
+python-dotenv==1.0.0
diff --git a/.docs/stylesheets/extra.css b/.docs/stylesheets/extra.css
new file mode 100644
index 0000000000000000000000000000000000000000..5aaf0f0125875ecdabada48c38e1df2974369d3e
--- /dev/null
+++ b/.docs/stylesheets/extra.css
@@ -0,0 +1,26 @@
+:root {
+    --md-primary-fg-color: #1976d2;
+    --md-accent-fg-color: #166abc /* darken 10% */;
+    --md-primary-fg-color--dark: #135fa9 /* darken 10% */;
+}
+
+.md-main .md-content a:not(.action-button),
+.md-main .md-content a:not(.action-button) {
+    color: var(--md-typeset-color);
+    border-bottom: 2px solid var(--md-primary-fg-color);
+}
+
+.md-main .md-content a:not(.action-button):focus,
+.md-main .md-content a:not(.action-button):hover {
+    color: var(--md-typeset-color);
+    border-bottom: 2px solid var(--md-primary-fg-color--dark);
+}
+
+.md-banner {
+    background-color: var(--md-primary-fg-color--dark);
+}
+
+[data-md-component=announce] .md-banner__inner {
+    margin-top: 0.2rem;
+    margin-bottom: 0.2rem;
+}
diff --git a/.docs/system.md b/.docs/system.md
new file mode 100644
index 0000000000000000000000000000000000000000..93e96237eca51da0c16559fad8cf8d58508ebf42
--- /dev/null
+++ b/.docs/system.md
@@ -0,0 +1,497 @@
+---
+author: Martin Weise
+hide:
+
+- navigation
+
+---
+
+# System
+
+!!! info "Abstract"
+
+    This is the full system description from a technical/developer view.
+
+We invite all open-source developers to help us fixing bugs and introducing features to the source code. Get involved by
+sending a mail to Prof. Andreas Rauber and Projektass. Martin Weise.
+
+## Architecture
+
+The repository is designed as a microservice architecture to ensure scalability and the utilization of various
+technologies. The conceptualized microservices operate the basic database operations, data versioning as well as
+*findability*, *accessability*, *interoperability* and *reuseability* (FAIR).
+
+<figure markdown>
+![DBRepo architecture](images/architecture.png)
+<figcaption>Architecture</figcaption>
+</figure>
+
+## Services
+
+View the docker images for the documentation of the service.
+
+### Analyse Service
+
+!!! debug "Debug Information"
+
+    * Ports: 5000/tcp
+    * Prometheus: `http://:5000/metrics`
+    * Swagger UI: `http://:5000/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/analyse" target="_blank">:fontawesome-solid-square-up-right: view online</a>
+
+It suggests data types for the FAIR Portal when creating a table from a *comma separated values* (CSV) file. It
+recommends enumerations for columns and returns e.g. a list of potential primary key candidates. The researcher is able
+to confirm these suggestions manually. Moreover, the *Analyze Service* determines basic statistical properties of
+numerical columns.
+
+### Authentication Service
+
+!!! debug "Debug Information"
+
+    * Ports: 8080/tcp, 8443/tcp
+    * Admin Console: `http://:8443/`
+
+Very specific to the deployment of the organization. In our reference implementation we implement a *security assertion
+markup language* (SAML) service provider and use our institutional SAML identity provider for obtaining account data
+through an encrypted channel.
+
+From version 1.2 onwards we use Keycloak for authentication and deprecated the previous Spring Boot application.
+Consequently,
+the authentication will be through Keycloak.
+
+!!! warning "Unsupported Keycloak features"
+
+    Due to no demand at the time, we currently do not support the following Keycloak features:
+
+    * E-Mail verification
+    * Temporary passwords
+
+By default, the Authentication Service comes with a self-signed certificate valid 3 months from build date. For
+deployment it is *highly encouraged* to use your own certificate, properly issued by a trusted PKI, e.g. G&#201;ANT. For
+local deployments you can use the self-signed certificate. You need to accept the risk in most browsers when visiting
+the [admin panel](https://localhost:8443/admin/).
+
+Sign in with the default credentials (username `fda`, password `fda`) or the one you configured during set-up. Be
+default, users are created using the frontend and the sign-up page. But it is also possible to create users from
+Keycloak, they will still act as "self-sign-up" created users. Since we do not support all features of Keycloak, leave
+out required user actions as they will not be enforced, also the temporary password.
+
+Each user has attributes associated to them. In case you manually create a user in Keycloak directly, you need to add
+them in Users > Add user > Attributes:
+
+* `theme_dark` (*boolean*, default: false)
+* `orcid` (*string*)
+* `affiliation` (*string*)
+
+#### Groups
+
+The authorization scheme follows a group-based access control (GBAC). Users are organized in three distinct
+(non-overlapping) groups:
+
+1. Researchers (*default*)
+2. Developers
+3. Data Stewards
+
+Based on the membership in one of these groups, the user is assigned a set of roles that authorize specific actions. By
+default, all users are assigned to the `researchers` group.
+
+#### Roles
+
+We organize the roles into default- and escalated composite roles. There are three composite roles, one for each group.
+Each of the composite role has a set of other associated composite roles.
+
+<figure markdown>
+![](images/groups-roles.png)
+<figcaption>Three groups (Researchers, Developers, Data Stewards) and their composite roles associated.</figcaption>
+</figure>
+
+There is one role for one specific action in the services. For example: the `create-database` role authorizes a user to
+create a database in a Docker container. Therefore,
+the [`DatabaseEndpoint.java`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/blob/a5bdd1e2169bae6497e2f7eee82dad8b9b059850/fda-database-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java#L78)
+endpoint requires a JWT access token with this authority.
+
+```java
+@PostMapping
+@PreAuthorize("hasAuthority('create-database')")
+public ResponseEntity<DatabaseBriefDto> create(@NotNull Long containerId,
+                                               @Valid @RequestBody DatabaseCreateDto createDto,
+                                               @NotNull Principal principal) {
+...
+}
+```
+
+##### Default Container Handling
+
+| Name                     | Description                          |
+|--------------------------|--------------------------------------|
+| `create-container`       | Can create a container               |
+| `find-container`         | Can find a specific container        |
+| `list-containers`        | Can list all containers              |
+| `modify-container-state` | Can start and stop the own container |
+
+##### Default Database Handling
+
+| Name                         | Description                                          |
+|------------------------------|------------------------------------------------------|
+| `check-database-access`      | Can check the access to a database of a user         |
+| `create-database`            | Can create a database                                |
+| `create-database-access`     | Can give a new access to a database of a user        |
+| `delete-database-access`     | Can delete the access to a database of a user        |
+| `find-database`              | Can find a specific database in a container          |
+| `list-databases`             | Can list all databases in a container                |
+| `modify-database-visibility` | Can modify the database visibility (public, private) |
+| `modify-database-owner`      | Can modify the database owner                        |
+| `update-database-access`     | Can update the access to a database of a user        |
+
+##### Default Table Handling
+
+| Name                            | Description                                          |
+|---------------------------------|------------------------------------------------------|
+| `create-table`                  | Can create a table                                   |
+| `find-tables`                   | Can list a specific table in a database              |
+| `list-tables`                   | Can list all tables                                  |
+| `modify-table-column-semantics` | Can modify the column semantics of a specific column |
+
+##### Default Query Handling
+
+| Name                      | Description                                   |
+|---------------------------|-----------------------------------------------|
+| `create-database-view`    | Can create a view in a database               |
+| `delete-database-view`    | Can delete a view in a database               |
+| `delete-table-data`       | Can delete data in a table                    |
+| `execute-query`           | Can execute a query statement                 |
+| `export-query-data`       | Can export the data that a query has produced |
+| `export-table-data`       | Can export the data stored in a table         |
+| `find-database-view`      | Can find a specific database view             |
+| `find-query`              | Can find a specific query in the query store  |
+| `insert-table-data`       | Can insert data into a table                  |
+| `list-database-views`     | Can list all database views                   |
+| `list-queries`            | Can list all queries in the query store       |
+| `persist-query`           | Can persist a query in the query store        |
+| `re-execute-query`        | Can re-execute a query to reproduce a result  |
+| `view-database-view-data` | Can view the data produced by a database view |
+| `view-table-data`         | Can view the data in a table                  |
+| `view-table-history`      | Can view the data history of a table          |
+
+##### Default Identifier Handling
+
+| Name                | Description                                 |
+|---------------------|---------------------------------------------|
+| `create-identifier` | Can create an identifier (subset, database) |
+| `find-identifier`   | Can find a specific identifier              |
+| `list-identifier`   | Can list all identifiers                    |
+
+##### Default User Handling
+
+| Name                      | Description                             |
+|---------------------------|-----------------------------------------|
+| `modify-user-theme`       | Can modify the user theme (light, dark) |
+| `modify-user-information` | Can modify the user information         |
+
+##### Default Maintenance Handling
+
+| Name                         | Description                              |
+|------------------------------|------------------------------------------|
+| `create-maintenance-message` | Can create a maintenance message banner  |
+| `delete-maintenance-message` | Can delete a maintenance message banner  |
+| `find-maintenance-message`   | Can find a maintenance message banner    |
+| `list-maintenance-messages`  | Can list all maintenance message banners |
+| `update-maintenance-message` | Can update a maintenance message banner  |
+
+##### Default Semantics Handling
+
+| Name                      | Description                                                     |
+|---------------------------|-----------------------------------------------------------------|
+| `create-semantic-unit`    | Can save a previously unknown unit for a table column           |
+| `create-semantic-concept` | Can save a previously unknown concept for a table column        |
+| `execute-semantic-query`  | Can query remote SPARQL endpoints to get labels and description |
+| `table-semantic-analyse`  | Can automatically suggest units and concepts for a table        |
+
+##### Escalated User Handling
+
+| Name        | Description                                   |
+|-------------|-----------------------------------------------|
+| `find-user` | Can list user information for a specific user |
+
+##### Escalated Container Handling
+
+| Name                             | Description                                  |
+|----------------------------------|----------------------------------------------|
+| `delete-container`               | Can delete any container                     |
+| `modify-foreign-container-state` | Can modify any container state (start, stop) |
+
+##### Escalated Database Handling
+
+| Name              | Description                              |
+|-------------------|------------------------------------------|
+| `delete-database` | Can delete any database in any container |
+
+##### Escalated Table Handling
+
+| Name           | Description                          |
+|----------------|--------------------------------------|
+| `delete-table` | Can delete any table in any database |
+
+##### Escalated Query Handling
+
+| Name | Description |
+|------|-------------|
+| /    |             |
+
+##### Escalated Identifier Handling
+
+| Name                         | Description                                       |
+|------------------------------|---------------------------------------------------|
+| `create-foreign-identifier`  | Can create an identifier to any database or query |
+| `delete-identifier`          | Can delete any identifier                         |
+| `modify-identifier-metadata` | Can modify any identifier metadata                |
+
+##### Escalated Semantics Handling
+
+| Name                                    | Description                                  |
+|-----------------------------------------|----------------------------------------------|
+| `create-ontology`                       | Can register a new ontology                  |
+| `delete-ontology`                       | Can unregister an ontology                   |
+| `list-ontologies`                       | Can list all ontologies                      |
+| `modify-foreign-table-column-semantics` | Can modify any table column concept and unit |
+| `update-ontology`                       | Can update ontology metadata                 |
+| `update-semantic-concept`               | Can update own table column concept          |
+| `update-semantic-unit`                  | Can update own table column unit             |
+
+#### API
+
+##### Obtain Access Token
+
+Access tokens are needed for almost all operations.
+
+=== "Terminal"
+
+    ``` console
+    curl -X POST \
+      -d "username=foo&password=bar&grant_type=password&client_id=dbrepo-client&scope=openid&client_secret=MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG" \
+      http://localhost/api/auth/realms/dbrepo/protocol/openid-connect/token
+    ```
+
+=== "Python"
+
+    ``` py
+    import requests
+
+    auth = requests.post("http://localhost/api/auth/realms/dbrepo/protocol/openid-connect/token", data={
+        "username": "foo",
+        "password": "bar",
+        "grant_type": "password",
+        "client_id": "dbrepo-client",
+        "scope": "openid",
+        "client_secret": "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG"
+    })
+    print(auth.json()["access_token"])
+    ```
+
+##### Refresh Access Token
+
+Using the response from above, a new access token can be created via the refresh token provided.
+
+=== "Terminal"
+
+    ``` console
+    curl -X POST \
+      -d "grant_type=refresh_token&client_id=dbrepo-client&refresh_token=THE_REFRESH_TOKEN&client_secret=MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG" \
+      http://localhost/api/auth/realms/dbrepo/protocol/openid-connect/token
+    ```
+
+=== "Python"
+
+    ``` py
+    import requests
+
+    auth = requests.post("http://localhost/api/auth/realms/dbrepo/protocol/openid-connect/token", data={
+        "grant_type": "refresh_token",
+        "client_id": "dbrepo-client",
+        "client_secret": "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG",
+        "refresh_token": "THE_REFRESH_TOKEN"
+    })
+    print(auth.json()["access_token"])
+    ```
+
+### Broker Service
+
+!!! debug "Debug Information"
+
+    * Ports: 5672/tcp, 15672/tcp
+    * RabbitMQ Management Plugin: `http://:15672`
+    * RabbitMQ Prometheus Plugin: `http://:15692/metrics`
+
+It holds exchanges and topics responsible for holding AMQP messages for later consumption. We
+use [RabbitMQ](https://www.rabbitmq.com/) in the implementation. The AMQP endpoint listens to port `5672` for
+regular declares and offers a management interface at port `15672`.
+
+The default credentials are:
+
+* Username: `fda`
+* Password: `fda`
+
+### Container Service
+
+!!! debug "Debug Information"
+
+    * Ports: 9091/tcp
+    * Info: `http://:9091/actuator/info`
+    * Health: `http://:9091/actuator/health`
+    * Prometheus: `http://:9091/actuator/prometheus`
+    * Swagger UI: `http://:9091/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/container" target="_blank">:fontawesome-solid-square-up-right: view online</a>
+
+It is responsible for Docker container lifecycle operations and updating the local copy of the Docker images.
+
+### Database Service
+
+!!! debug "Debug Information"
+
+    * Ports: 9092/tcp
+    * Info: `http://:9092/actuator/info`
+    * Health: `http://:9092/actuator/health`
+    * Prometheus: `http://:9092/actuator/prometheus`
+    * Swagger UI: `http://:9092/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/database" target="_blank">:fontawesome-solid-square-up-right: view online</a>
+
+It creates the databases inside a Docker container and the Query Store. Currently, we only
+support [MariaDB](https://mariadb.org/) images that allow table versioning with low programmatic effort.
+
+### Gateway Service
+
+!!! debug "Debug Information"
+
+    * Ports: 9095/tcp
+    * Info: `http://:9095/actuator/info`
+    * Health: `http://:9095/actuator/health`
+    * Prometheus: `http://:9095/actuator/prometheus`
+
+Provides a single point of access to the *application programming interface* (API) and configures a 
+standard [NGINX](https://www.nginx.com/) reverse proxy for load balancing, SSL/TLS configuration.
+
+### Identifier Service
+
+!!! debug "Debug Information"
+
+    * Ports: 9096/tcp
+    * Info: `http://:9096/actuator/info`
+    * Health: `http://:9096/actuator/health`
+    * Prometheus: `http://:9096/actuator/prometheus`
+    * Swagger UI: `http://:9096/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/identifier" target="_blank">:fontawesome-solid-square-up-right: view online</a>
+
+This microservice is responsible for creating and resolving a *persistent identifier* (PID) attached to a query to
+obtain the metadata attached to it and allow re-execution of a query. We store both the query and hashes of the query
+and result set to allow equality checks of the originally obtained result set and the currently obtained result set. In
+the reference implementation we currently only use a numerical id column and plan to integrate *digital object
+identifier* (DOI) through our institutional library soon.
+
+### Metadata Database
+
+!!! debug "Debug Information"
+
+    * Ports: 3306/tcp, 9100/tcp
+    * Prometheus: `http://:9100/metrics`
+
+It is the core component of the project. It is a relational database that contains metadata about all researcher
+databases
+created in the database repository like column names, check expressions, value enumerations or key/value constraints and
+relevant data for citing data sets. Additionally, the concept, e.g. URI of units of measurements of numerical columns is
+stored in the Metadata Database in order to provide semantic knowledge context. We use MariaDB for its rich capabilities
+in the reference implementation.
+
+The default credentials are `root:dbrepo` for the database `fda`. Connect to the database via the JDBC connector on
+port `3306`.
+
+### Metadata Service
+
+!!! debug "Debug Information"
+
+    * Ports: 9099/tcp
+    * Info: `http://:9099/actuator/info`
+    * Health: `http://:9099/actuator/health`
+    * Prometheus: `http://:9099/actuator/prometheus`
+    * Swagger UI: `http://:9099/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/metadata" target="_blank">:fontawesome-solid-square-up-right: view online</a>
+
+This service provides an OAI-PMH endpoint for metadata crawler.
+
+### Query Service
+
+!!! debug "Debug Information"
+
+    * Ports: 9093/tcp
+    * Info: `http://:9093/actuator/info`
+    * Health: `http://:9093/actuator/health`
+    * Prometheus: `http://:9093/actuator/prometheus`
+    * Swagger UI: `http://:9093/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/query" target="_blank">:fontawesome-solid-square-up-right: view online</a>
+
+It provides an interface to insert data into the tables created by the Table Service. It also allows for view-only,
+paginated and versioned query execution to the raw data and consumes messages in the message queue from the Broker
+Service.
+
+### Search Database
+
+!!! debug "Debug Information"
+
+    * Ports: 9200/tcp
+    * Indexes: `http://:9200/_all`
+    * Health: `http://:9200/_cluster/health/`
+
+It processes search requests from the Gateway Service for full-text lookups in the metadata database. We use
+[Elasticsearch](https://www.elastic.co/) in the reference implementation. The search database implements Elastic Search
+and creates a retrievable index on all databases that is getting updated with each save operation on databases in the
+metadata database.
+
+All requests need to be authenticated, by default the credentials `elastic:elastic` are used.
+
+### Semantics Service
+
+!!! debug "Debug Information"
+
+    * Ports: 9097/tcp
+    * Info: `http://:9097/actuator/info`
+    * Health: `http://:9097/actuator/health`
+    * Prometheus: `http://:9097/actuator/prometheus`
+    * Swagger UI: `http://:9097/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/semantics" target="_blank">:fontawesome-solid-square-up-right: view online</a>
+
+It is designed to map terms in the domain of units of measurement to controlled vocabulary, modelled in
+the [ontology of units of measure](https://github.com/HajoRijgersberg/OM). This service validates researcher provided in
+units and provides a *uniform resource identifier* (URI) to the related concept, which will be stored in the system.
+Furthermore, there is a method for auto-completing text and listing a description as well as commonly used unit symbols.
+
+### Table Service
+
+!!! debug "Debug Information"
+
+    * Ports: 9094/tcp
+    * Info: `http://:9094/actuator/info`
+    * Health: `http://:9094/actuator/health`
+    * Prometheus: `http://:9094/actuator/prometheus`
+    * Swagger UI: `http://:9094/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/table" target="_blank">:fontawesome-solid-square-up-right: view online</a>
+
+This microservice handles table operations inside a database that is managed by the Database Service. We
+use [Hibernate](https://hibernate.org/orm/) for schema and data ingest operations.
+
+### UI
+
+!!! debug "Debug Information"
+
+    * Ports: 3000/tcp, 9100/tcp
+    * Prometheus: `http://:9100/metrics`
+    * UI: `http://:3000/`
+
+It provides a *graphical user interface* (GUI) for a researcher to interact with the database repository's API.
+
+<figure markdown>
+![UI microservice architecture detailed](images/architecture-ui.png)
+<figcaption>Architecture of the UI microservice</figcaption>
+</figure>
+
+### User Service
+
+!!! debug "Debug Information"
+
+    * Ports: 9098/tcp
+    * Info: `http://:9098/actuator/info`
+    * Health: `http://:9098/actuator/health`
+    * Prometheus: `http://:9098/actuator/prometheus`
+    * Swagger UI: `http://:9098/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/user" target="_blank">:fontawesome-solid-square-up-right: view online</a>
+
+This microservice handles user information.
diff --git a/mkdocs.yml b/mkdocs.yml
new file mode 100644
index 0000000000000000000000000000000000000000..11f0e4828c10502dc9a58bc6500f319faa879b1c
--- /dev/null
+++ b/mkdocs.yml
@@ -0,0 +1,57 @@
+site_name: Database Repository
+repo_url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services
+repo_name: fda-services
+site_author: Research Unit Data Science, Technische Universit&auml;t Wien
+copyright: CC-BY 4.0 Technische Universit&auml;t Wien & Universit&auml;t Wien
+nav:
+  - Home: index.md
+  - get-started.md
+  - customization.md
+  - system.md
+  - publications.md
+  - contact.md
+extra_css:
+  - stylesheets/extra.css
+theme:
+  favicon: images/signet_white.png
+  custom_dir: docs/overrides
+  logo: images/signet_white.png
+  font:
+    text: IBM Plex Serif
+    code: IBM Plex Mono
+  features:
+    - navigation.tabs
+    - navigation.tabs.sticky
+    - content.code.annotate
+  icon:
+    repo: fontawesome/brands/git-alt
+  palette:
+    scheme: default
+    primary: custom
+    font:
+      code: Roboto Mono
+    toggle:
+      icon: material/weather-night
+      name: Switch to light mode
+  name: material
+markdown_extensions:
+  - attr_list
+  - md_in_html
+  - admonition
+  - pymdownx.details
+  - pymdownx.superfences
+  - pymdownx.tabbed:
+      alternate_style: true
+  - toc:
+      permalink: True
+  - pymdownx.emoji:
+      emoji_index: !!python/name:materialx.emoji.twemoji
+      emoji_generator: !!python/name:materialx.emoji.to_svg
+      options:
+        custom_icons:
+          - overrides/.icons
+extra:
+  homepage: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/
+  social:
+    - icon: fontawesome/brands/gitlab
+      link: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services