Repository: owncloud/ocis
Pull request #7705 (2023-11-09 16:13:56)

fix libre-graph status codes
<!--
Thanks for submitting a change to ownCloud!

This is the bug tracker for the oCIS component. Find other components at https://github.com/owncloud/core/blob/master/.github/CONTRIBUTING.md#guidelines

For fixing potential security issues please see https://owncloud.org/security/

To make it possible for us to get your change reviewed and merged please carefully fill out the requested information below.

Please note that any kind of change needs first be submitted to the master branch which holds the next version of oCIS.

Please set the following labels:

- Set label "Status:Needs-Review" for review or "Status:In-Progress" if the PR still has open tasks.
- Assignment: assign to self
- Reviewers: pick at least one
-->

## Description
<!--- Describe your changes in detail -->

## Related Issue
<!--- This project only accepts pull requests related to open issues -->
<!--- If suggesting a new feature or change, please discuss it in an issue first -->
<!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->
<!--- Please link to the issue here: -->
- Fixes [https://github.com/owncloud/ocis/issues/7678](https://github.com/owncloud/ocis/issues/7678)
- Required dependencies are web tests changes: [https://github.com/owncloud/web/tree/changeRespCode](https://github.com/owncloud/web/tree/changeRespCode) 

## Motivation and Context
<!--- Why is this change required? What problem does it solve? -->

## How Has This Been Tested?
<!--- Please describe in detail how you tested your changes. -->
<!--- Include details of your testing environment, and the tests you ran to -->
<!--- see how your change affects other areas of the code, etc. -->
The test scenarios have been updated

## Screenshots (if appropriate):

## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
- [x] Technical debt
- [ ] Tests only (no source changes)

## Checklist:
<!-- Tick the checkboxes when done. -->
<!-- Raise documentation ticket in owncloud.github.io/ -->
- [x] Code changes
- [ ] Unit tests added
- [ ] Acceptance tests added
- [ ] Documentation ticket raised: <link> 


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=7705)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL)

[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/0-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list) [0.0% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list)  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=7705)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL)

[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/0-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list) [0.0% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list)  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=7705)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL)

[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/0-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list) [0.0% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list)  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=7705)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL)

[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/0-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list) [0.0% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list)  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=7705)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL)

[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/0-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list) [0.0% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list)  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=7705)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL)

[![66.7%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/60-16px.png '66.7%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list) [66.7% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list)  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=7705)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL)

[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/0-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list) [0.0% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list)  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=7705)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL)

[![66.7%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/60-16px.png '66.7%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list) [66.7% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list)  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=7705)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL)

[![66.7%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/60-16px.png '66.7%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list) [66.7% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list)  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=7705)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL)

[![66.7%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/60-16px.png '66.7%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list) [66.7% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list)  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=7705)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7705&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7705&resolved=false&types=CODE_SMELL)

[![66.7%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/60-16px.png '66.7%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list) [66.7% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_coverage&view=list)  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7705&metric=new_duplicated_lines_density&view=list)



Patch:
diff --git a/.drone.env b/.drone.env
index d38e3983250..4fc3343cace 100644
--- a/.drone.env
+++ b/.drone.env
@@ -1,3 +1,3 @@
 # The test runner source for UI tests
-WEB_COMMITID=e518f4c2d19ccd233666e7dd46ad8f38ecdbdf00
-WEB_BRANCH=master
+WEB_COMMITID=67ced24b3a6f06b767ff8111537b4a0b85c40993
+WEB_BRANCH=changeRespCode
diff --git a/.drone.star b/.drone.star
index 89759af0aa8..e32509a58d3 100644
--- a/.drone.star
+++ b/.drone.star
@@ -18,7 +18,7 @@ OC_CI_PHP = "owncloudci/php:%s"
 OC_CI_WAIT_FOR = "owncloudci/wait-for:latest"
 OC_CS3_API_VALIDATOR = "owncloud/cs3api-validator:0.2.0"
 OC_LITMUS = "owncloudci/litmus:latest"
-OC_OC_TEST_MIDDLEWARE = "owncloud/owncloud-test-middleware:1.8.5"
+OC_OC_TEST_MIDDLEWARE = "owncloud/owncloud-test-middleware:1.8.6"
 OC_UBUNTU = "owncloud/ubuntu:20.04"
 PLUGINS_CODACY = "plugins/codacy:1"
 PLUGINS_DOCKER = "plugins/docker:latest"
diff --git a/.gitignore b/.gitignore
index c4c08a62aa2..69b344d068c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,6 +24,7 @@ ocis/cmd/ocis/config/
 
 # docs
 /hugo
+/docs/services/*/_index.md
 
 # IDEs
 .idea
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2184dc404aa..97eb01e2576 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -40,6 +40,7 @@ The following sections list the changes for unreleased.
 * Enhancement - Bump reva: [#7721](https://github.com/owncloud/ocis/pull/7721)
 * Enhancement - Add Sharing NG endpoints: [#7633](https://github.com/owncloud/ocis/pull/7633)
 * Enhancement - Add new permissions: [#7700](https://github.com/owncloud/ocis/pull/7700)
+* Enhancement - Add preferred language to user settings: [#7720](https://github.com/owncloud/ocis/pull/7720)
 
 ## Details
 
@@ -148,6 +149,14 @@ The following sections list the changes for unreleased.
 
    https://github.com/owncloud/ocis/pull/7700
 
+* Enhancement - Add preferred language to user settings: [#7720](https://github.com/owncloud/ocis/pull/7720)
+
+   We have added the preferred language to the libre-graph api & added endpoints for that to ocis.
+
+   https://github.com/owncloud/ocis/issues/5455
+   https://github.com/owncloud/ocis/pull/7720
+   https://github.com/owncloud/libre-graph-api/pull/130
+
 # Changelog for [5.0.0] (2023-11-08)
 
 The following sections list the changes for 5.0.0.
diff --git a/changelog/unreleased/fix-graph-codes.md b/changelog/unreleased/fix-graph-codes.md
new file mode 100644
index 00000000000..1354faa3bef
--- /dev/null
+++ b/changelog/unreleased/fix-graph-codes.md
@@ -0,0 +1,15 @@
+Bugfix: Fix libre-graph status codes
+
+creating group: https://owncloud.dev/libre-graph-api/#/groups/CreateGroup
+changed: 200 -> 201
+
+creating users:
+https://owncloud.dev/libre-graph-api/#/users/CreateUser
+changed: 200 -> 201
+
+export GDPR:
+https://owncloud.dev/libre-graph-api/#/user/ExportPersonalData
+changed: 201 -> 202
+
+https://github.com/owncloud/ocis/issues/7678
+https://github.com/owncloud/ocis/pull/7705
diff --git a/changelog/unreleased/preferred-language.md b/changelog/unreleased/preferred-language.md
new file mode 100644
index 00000000000..5bc03f56029
--- /dev/null
+++ b/changelog/unreleased/preferred-language.md
@@ -0,0 +1,7 @@
+Enhancement: Add preferred language to user settings
+
+We have added the preferred language to the libre-graph api & added endpoints for that to ocis.
+
+https://github.com/owncloud/ocis/pull/7720
+https://github.com/owncloud/ocis/issues/5455
+https://github.com/owncloud/libre-graph-api/pull/130
diff --git a/docs/apis/http/webdav/_index.md b/docs/apis/http/webdav/_index.md
new file mode 100644
index 00000000000..b947d3e9394
--- /dev/null
+++ b/docs/apis/http/webdav/_index.md
@@ -0,0 +1,532 @@
+---
+title: "WebDAV"
+date: 2023-07-02T00:00:00+00:00
+weight: 20
+geekdocRepo: https://github.com/owncloud/ocis
+geekdocEditPath: edit/master/docs/apis/http/webdav
+geekdocFilePath: _index.md
+geekdocCollapseSection: true
+---
+
+{{< toc >}}
+
+**Web** **D**istributed **A**uthoring and **V**ersioning (WebDAV) consists of a set of methods, headers, and content-types extending HTTP/1.1 for the management of resources and -properties, creation and management of resource collections, URL namespace manipulation, and resource locking (collision avoidance). WebDAV is one of the central APIs that ownCloud uses for handling file resources, metadata and locks.
+
+
+{{< hint type=info title="RFC" >}}
+**WebDAV RFCs**
+
+RFC 2518 was published in February 1999. [RFC 4918](https://datatracker.ietf.org/doc/html/rfc4918), published in June 2008 obsoletes RFC 2518 with minor revisions mostly due to interoperability experience.
+
+{{< /hint >}}
+## Calling the WebDAV API
+
+### Request URI
+
+```sh
+{HTTP method} https://ocis.url/{webdav-base}/{resourceID}/{path}
+```
+
+The request URI consists of:
+
+| Component     | Description                                                                                            |
+|---------------|--------------------------------------------------------------------------------------------------------|
+| {HTTP method} | The HTTP method which is used in the request.                                                          |
+| {webdav-base} | The WebDAV base path component. Possible options are                                                   |
+|               | `dav/spaces/` This is the default and optimized endpoint for all WebDAV requests.                      |
+|               | `remote.php/dav/spaces/`*                                                                              |
+|               | `remote.php/webdav/`*                                                                                  |
+|               | `webdav/`*                                                                                             |
+|               | `dav/`*                                                                                                |
+| {resourceID}  | This resourceID is used as the WebDAV root element. All children are accessed by their relative paths. |
+| {path}        | The relative path to the WebDAV root. In most of the casese, this is the space root.                   |
+
+\* these dav endpoints are implemented for legacy reasons and should not be used. Note: The legacy endpoints **do not take the resourceID as an argument.**
+
+### HTTP methods
+
+| Method    | Description                                                                                                                                                                                                                                  |
+|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| PROPFIND  | Retrieve properties as XML from a web resource. It is also overloaded to retrieve the collection structure (a.k.a. directory hierarchy) of a remote system.                                                                                  |
+| PROPPATCH | Process instructions specified in the request body to set and/or remove properties defined on the resource identified by the request uri.                                                                                                    |
+| MKCOL     | Create a WebDAV collection (folder) at the location specified by the request uri.                                                                                                                                                            |
+| GET       | Retrieve a WebDAV resource.                                                                                                                                                                                                                  |
+| HEAD      | Retrieve a WebDAV resource without reading the body.                                                                                                                                                                                         |
+| PUT       | A PUT performed on an existing resource replaces the GET response entity of the resource.                                                                                                                                                    |
+| POST      | Not part of the WebDAV rfc and has no effect on a WebDAV resource. However, this method is used in the TUS protocol for uploading resources.                                                                                      |
+| PATCH     | Not part of the WebDAV rfc and has no effect on a WebDAV resource. However, this method is used in the TUS protocol for uploading resources.                                                                                           |
+| COPY      | Creates a duplicate of the source resource identified by the Request-URI, in the destination resource identified by the URI in the Destination header.                                                                                       |
+| MOVE      | The MOVE operation on a non-collection resource is the logical equivalent of a copy (COPY), followed by consistency maintenance processing, followed by a delete of the source, where all three actions are performed in a single operation. |                                                                                                                             |
+| DELETE    | Delete the resource identified by the Request-URI.                                                                                                                                                                                           |
+| LOCK      | A LOCK request to an existing resource will create a lock on the resource identified by the Request-URI, provided the resource is not already locked with a conflicting lock.                                                                |
+| UNLOCK    | The UNLOCK method removes the lock identified by the lock token in the Lock-Token request header. The Request-URI must identify a resource within the scope of the lock.                                                                     |
+
+The methods `MKCOL`, `GET`, `HEAD`, `LOCK`, `COPY`, `MOVE`, `UNLOCK` and `DELETE` need no request body.
+
+The methods `PROPFIND`, `PROPPATCH`, `PUT` require a request body, normally in XML format to provide the needed values.
+
+{{< hint type=tip title="Tooling" >}}
+**WebDAV is not REST**
+
+The WebDAV protocol was created before the REST paradigm has become the de-facto standard for API design. WebDAV uses http methods which are not part of REST. Therefore all the tooling around API design and documentation is not usable (like OpenApi 3.0 / Swagger or others).
+{{< /hint >}}
+
+### Authentication
+
+For development purposes the examples in the developer documentation use Basic Auth. It is disabled by default and should only be enabled by setting `PROXY_ENABLE_BASIC_AUTH` in [the proxy](../../../services/proxy/configuration/#environment-variables) for development or test instances.
+
+To authenticate with a Bearer token or OpenID Connect access token replace the `-u user:password` Basic Auth option of curl with a `-H 'Authorization: Bearer <token>'` header. A `<token>` can be obtained by copying it from a request in the browser, although it will time out within minutes. To automatically refresh the OpenID Connect access token an ssh-agent like solution like [oidc-agent](https://github.com/indigo-dc/oidc-agent) should be used.
+
+## Listing Properties
+
+This method is used to list the properties of a resource in xml. This method can also be used to retrieve the listing of a WebDAV collection which means the content of a remote directory.
+
+{{< tabs "list-properties" >}}
+{{< tab "Curl" >}}
+```shell
+curl -L -X PROPFIND 'https://localhost:9200/dav/spaces/storage-users-1%24some-admin-user-id-0000-000000000000/' \
+-H 'Depth: 1' \
+-d '<?xml version="1.0"?>
+<d:propfind  xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
+  <d:prop>
+    <oc:permissions />
+    <oc:favorite />
+    <oc:fileid />
+    <oc:owner-id />
+    <oc:owner-display-name />
+    <oc:share-types />
+    <oc:privatelink />
+    <d:getcontentlength />
+    <oc:size />
+    <d:getlastmodified />
+    <d:getetag />
+    <d:getcontenttype />
+    <d:resourcetype />
+    <oc:downloadURL />
+  </d:prop>
+</d:propfind>'
+```
+{{< /tab >}}
+{{< tab "HTTP" >}}
+```shell
+PROPFIND /dav/spaces/storage-users-1%24some-admin-user-id-0000-000000000000/ HTTP/1.1
+Host: localhost:9200
+Origin: https://localhost
+Access-Control-Request-Method: PROPFIND
+Depth: 1
+Content-Type: application/xml
+Authorization: Basic YWRtaW46YWRtaW4=
+Content-Length: 436
+
+<?xml version="1.0"?>
+<d:propfind  xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
+  <d:prop>
+    <oc:permissions />
+    <oc:favorite />
+    <oc:fileid />
+    <oc:owner-id />
+    <oc:owner-display-name />
+    <oc:share-types />
+    <oc:privatelink />
+    <d:getcontentlength />
+    <oc:size />
+    <d:getlastmodified />
+    <d:getetag />
+    <d:getcontenttype />
+    <d:resourcetype />
+    <oc:downloadURL />
+  </d:prop>
+</d:propfind>
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+The request consists of a request body and an optional `Depth` Header.
+
+{{< hint type=tip title="PROPFIND usage" >}}
+**Metadata and Directory listings**
+
+Clients can use the `PROPFIND` method to retrieve properties of resources (metadata) and to list the content of a directories.
+{{< /hint >}}
+### Response
+
+{{< tabs "response list properties" >}}
+{{< tab "207 - Multistatus" >}}
+
+#### Multi Status Response
+
+A Multi-Status response conveys information about multiple resources
+in situations where multiple status codes might be appropriate.  The
+default Multi-Status response body is an application/xml
+HTTP entity with a `multistatus` root element.  Further elements
+contain `200`, `300`, `400`, and `500` series status codes generated during
+the method invocation.
+
+Although `207` is used as the overall response status code, the
+recipient needs to consult the contents of the multistatus response
+body for further information about the success or failure of the
+method execution.  The response MAY be used in success, partial
+success and also in failure situations.
+
+The `multistatus` root element holds zero or more `response` elements
+in any order, each with information about an individual resource.
+
+#### Body
+
+```xml
+<d:multistatus xmlns:s="http://sabredav.org/ns" xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
+    <d:response>
+        <d:href>/dav/spaces/storage-users-1$some-admin-user-id-0000-000000000000/</d:href>
+        <d:propstat>
+            <d:prop>
+                <oc:permissions>RDNVCKZP</oc:permissions>
+                <oc:favorite>0</oc:favorite>
+                <oc:fileid>storage-users-1$some-admin-user-id-0000-000000000000!some-admin-user-id-0000-000000000000</oc:fileid>
+                <oc:id>storage-users-1$some-admin-user-id-0000-000000000000!some-admin-user-id-0000-000000000000</oc:id>
+                <oc:owner-id>admin</oc:owner-id>
+                <oc:owner-display-name>Admin</oc:owner-display-name>
+                <oc:privatelink>https://localhost:9200/f/storage-users-1$some-admin-user-id-0000-000000000000%21some-admin-user-id-0000-000000000000</oc:privatelink>
+                <oc:size>10364682</oc:size>
+                <d:getlastmodified>Mon, 04 Sep 2023 20:10:09 GMT</d:getlastmodified>
+                <d:getetag>"c4d3610dfe4fac9b44e1175cfc44b12b"</d:getetag>
+                <d:resourcetype>
+                    <d:collection/>
+                </d:resourcetype>
+            </d:prop>
+            <d:status>HTTP/1.1 200 OK</d:status>
+        </d:propstat>
+        <d:propstat>
+            <d:prop>
+                <oc:checksums></oc:checksums>
+                <oc:share-types></oc:share-types>
+                <d:getcontentlength></d:getcontentlength>
+                <d:getcontenttype></d:getcontenttype>
+            </d:prop>
+            <d:status>HTTP/1.1 404 Not Found</d:status>
+        </d:propstat>
+    </d:response>
+    <d:response>
+        <d:href>/dav/spaces/storage-users-1$some-admin-user-id-0000-000000000000/New%20file.txt</d:href>
+        <d:propstat>
+            <d:prop>
+                <oc:permissions>RDNVWZP</oc:permissions>
+                <oc:checksums>
+                    <oc:checksum>SHA1:1c68ea370b40c06fcaf7f26c8b1dba9d9caf5dea MD5:2205e48de5f93c784733ffcca841d2b5 ADLER32:058801ab</oc:checksum>
+                </oc:checksums>
+                <oc:favorite>0</oc:favorite>
+                <oc:fileid>storage-users-1$some-admin-user-id-0000-000000000000!90cc3e73-0c6c-4346-9c4d-f529976d4990</oc:fileid>
+                <oc:id>storage-users-1$some-admin-user-id-0000-000000000000!90cc3e73-0c6c-4346-9c4d-f529976d4990</oc:id>
+                <oc:owner-id>admin</oc:owner-id>
+                <oc:owner-display-name>Admin</oc:owner-display-name>
+                <oc:share-types>
+                    <oc:share-type>0</oc:share-type>
+                    <oc:share-type>1</oc:share-type>
+                    <oc:share-type>3</oc:share-type>
+                </oc:share-types>
+                <oc:privatelink>https://localhost:9200/f/storage-users-1$some-admin-user-id-0000-000000000000%2190cc3e73-0c6c-4346-9c4d-f529976d4990</oc:privatelink>
+                <d:getcontentlength>5</d:getcontentlength>
+                <oc:size>5</oc:size>
+                <d:getlastmodified>Mon, 28 Aug 2023 20:45:03 GMT</d:getlastmodified>
+                <d:getetag>"75115347c74701a3be9c635ddebbf5c4"</d:getetag>
+                <d:getcontenttype>text/plain</d:getcontenttype>
+                <d:resourcetype></d:resourcetype>
+            </d:prop>
+            <d:status>HTTP/1.1 200 OK</d:status>
+        </d:propstat>
+    </d:response>
+    <d:response>
+        <d:href>/dav/spaces/storage-users-1$some-admin-user-id-0000-000000000000/NewFolder/</d:href>
+        <d:propstat>
+            <d:prop>
+                <oc:permissions>RDNVCKZP</oc:permissions>
+                <oc:favorite>0</oc:favorite>
+                <oc:fileid>storage-users-1$some-admin-user-id-0000-000000000000!5c73ecd9-d9f4-44f4-b685-ca4cb40aa6b7</oc:fileid>
+                <oc:id>storage-users-1$some-admin-user-id-0000-000000000000!5c73ecd9-d9f4-44f4-b685-ca4cb40aa6b7</oc:id>
+                <oc:owner-id>admin</oc:owner-id>
+                <oc:owner-display-name>Admin</oc:owner-display-name>
+                <oc:privatelink>https://localhost:9200/f/storage-users-1$some-admin-user-id-0000-000000000000%215c73ecd9-d9f4-44f4-b685-ca4cb40aa6b7</oc:privatelink>
+                <oc:size>0</oc:size>
+                <d:getlastmodified>Mon, 28 Aug 2023 20:45:10 GMT</d:getlastmodified>
+                <d:getetag>"e83367534cc595a45d706857fa5f03d8"</d:getetag>
+                <d:resourcetype>
+                    <d:collection/>
+                </d:resourcetype>
+            </d:prop>
+            <d:status>HTTP/1.1 200 OK</d:status>
+        </d:propstat>
+        <d:propstat>
+            <d:prop>
+                <oc:checksums></oc:checksums>
+                <oc:share-types></oc:share-types>
+                <d:getcontentlength></d:getcontentlength>
+                <d:getcontenttype></d:getcontenttype>
+            </d:prop>
+            <d:status>HTTP/1.1 404 Not Found</d:status>
+        </d:propstat>
+    </d:response>
+</d:multistatus>
+```
+{{< /tab >}}
+{{< tab "400 - Bad Request" >}}
+
+#### Body
+
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<d:error xmlns:d="DAV" xmlns:s="http://sabredav.org/ns">
+    <s:exception>Sabre\DAV\Exception\BadRequest</s:exception>
+    <s:message>Invalid Depth header value: 3</s:message>
+</d:error>
+```
+
+This can occur if the request is malformed e.g. due to an invalid xml request body or an invalid depth header value.
+{{< /tab >}}
+{{< tab "404 - Not Found" >}}
+
+#### Body
+
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<d:error xmlns:d="DAV" xmlns:s="http://sabredav.org/ns">
+    <s:exception>Sabre\DAV\Exception\NotFound</s:exception>
+    <s:message>Resource not found</s:message>
+</d:error>
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+### Request Body
+
+The `PROPFIND` Request can include an XML request body containing a list of namespaced property names.
+
+### Namespaces
+
+When building the body of your DAV request, you will request properties that are available under a specific namespace URI. It is usual to declare prefixes for those namespace in the `d:propfind` element of the body.
+
+Available namespaces:
+
+| URI                                       | Prefix |
+|-------------------------------------------|--------|
+| DAV:                                      | d      |
+| http://sabredav.org/ns                    | s      |
+| http://owncloud.org/ns                    | oc     |
+| http://open-collaboration-services.org/ns | ocs    |
+| http://open-cloud-mesh.org/ns             | ocm    |
+
+### Request Example with declared namespaces
+
+```xml
+<?xml version="1.0"?>
+    <d:propfind xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
+    </d:propfind>
+```
+
+### Supported WebDAV Properties
+
+| Property                    | Desription                                                                 | Example                                                                                                                                          |
+|-----------------------------|----------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
+| `<d:getlastmodified />`     | The latest modification time.                                              | `Fri, 30 Dec 2022 14:22:43 GMT`                                                                                                                  |
+| `<d:getetag />`             | The file's etag.                                                           | `"c3a1ee4a0c28edc15b9635c3bf798013"`                                                                                                             |
+| `<d:getcontenttype />`      | The mime type of the file.                                                 | `image/jpeg`                                                                                                                                     |
+| `<d:resourcetype />`        | Specifies the nature of the resource.                                      | `<d:collection />` for a folder                                                                                                                  |
+| `<d:getcontentlength />`    | The size if it is a file in bytes.                                         | `5` bytes                                                                                                                                        |
+| `<d:lockdiscovery />`       | Describes the active locks on a resource.                                  | Detailed Example in [Locking]()                                                                                                                  |
+| `<oc:id />`                 | The globally unique ID of the resource.                                    | `storage-1$27475553-7fb7-4689-b4cf-bbb635daff79!27475553-7fb7-4689-b4cf-bbb635daff79`                                                            |
+| `<oc:fileid />`             | The globally unique ID of the resource.                                    | `storage-1$27475553-7fb7-4689-b4cf-bbb635daff79!27475553-7fb7-4689-b4cf-bbb635daff79`                                                            |
+| `<oc:downloadURL />`        | Direct URL to download a file from.                                        | Not implemented.                                                                                                                                 |
+| `<oc:permissions />`        | The permissions a user has on the resource.                                | The value is a string containing letters for all available permissions.                                                                          |
+|                             |                                                                            | `S`: Shared                                                                                                                                      |
+|                             |                                                                            | `M`: Mounted                                                                                                                                     |
+|                             |                                                                            | `D`: Deletable                                                                                                                                   |
+|                             |                                                                            | `NV`: Updateable, Renameable, Moveable                                                                                                           |
+|                             |                                                                            | `W`: Updateable (file)                                                                                                                           |
+|                             |                                                                            | `CK`: Creatable (folders only)                                                                                                                   |
+|                             |                                                                            | `Z`: Deniable                                                                                                                                    |
+|                             |                                                                            | `P`: Trashbin Purgable                                                                                                                           |
+| `<oc:tags />`               | List of user specified tags.                                               | `<oc:tag>test</oc:tag>`                                                                                                                          |
+| `<oc:favorite />	`          | The favorite state.                                                        | `0` for not favourited,  `1` for favourited                                                                                                      |
+| `<oc:owner-id />`           | The user id of the owner of a resource. Project spaces have no owner.      | `einstein`                                                                                                                                       |
+| `<oc:owner-display-name />` | The display name of the owner of a resource. Project spaces have no owner. | `Albert Einstein`                                                                                                                                |
+| `<oc:share-types />`        | List of share types.                                                       | `0` = User Share                                                                                                                                 |
+|                             |                                                                            | `1` = Group Share                                                                                                                                |
+|                             |                                                                            | `2` = Public Link                                                                                                                                |
+| `<oc:checksums />`          |                                                                            | `<oc:checksum>`<br/>`SHA1:1c68ea370b40c06fcaf7f26c8b1dba9d9caf5dea MD5:2205e48de5f93c784733ffcca841d2b5 ADLER32:058801ab`<br /> `</oc:checksum>` |
+|                             |                                                                            | Due to a bug in the very early development of ownCloud, this value is not an array, but a string separated by whitespaces.                       |
+| `<oc:size />`               | Similar to `getcontentlength` but it also works for folders.               | `10` bytes                                                                                                                                       |
+
+### Request Headers
+
+A client executing a `PROPFIND` request MUST submit a Depth Header value. In practice, support for infinite-depth requests MAY be disabled, due to the performance and security concerns associated with this behavior.  Servers SHOULD treat a
+request without a Depth header as if a `Depth: infinity` header was included. Infinite depth requests are disabled by default in ocis.
+
+| Name                                      | Value                                                                                 |
+|-------------------------------------------|---------------------------------------------------------------------------------------|
+| Depth                                     | `0` = Only return the desired resource.                                               |
+|                                           | `1` = Return the desired resource and all resources one level below in the hierarchy. |
+|                                           | `infinity` = Return all resources below the root.                                     |
+
+{{< hint type=caution title="Use the Depth header with caution" >}}
+**Depth: infinity**
+
+Using the `Depth: infinity` header value can cause heavy load on the server, depending on the size of the file tree.
+
+The request can run into a timeout and the server performance could be affected for other users.
+
+{{< /hint >}}
+
+## Create a Directory
+
+Clients create directories (WebDAV collections) by executing a `MKCOL` request at the location specified by the request url.
+
+{{< tabs "create-folder" >}}
+{{< tab "Curl" >}}
+```shell
+curl -L -X MKCOL 'https://localhost:9200/dav/spaces/storage-users-1%24some-admin-user-id-0000-000000000000/NewFolder/' \
+-H 'Authorization: Basic YWRtaW46YWRtaW4='
+```
+{{< /tab >}}
+{{< tab "HTTP" >}}
+```shell
+MKCOL /dav/spaces/storage-users-1%24some-admin-user-id-0000-000000000000/NewFolder/ HTTP/1.1
+Host: localhost:9200
+Authorization: Basic YWRtaW46YWRtaW4=
+```
+{{< /tab >}}
+{{< /tabs >}}
+### Response
+
+{{< tabs "response create folder" >}}
+{{< tab "201 - Created" >}}
+This indicates that the Resource has been created successfully.
+
+#### Body
+
+The response has no body.
+{{< /tab >}}
+{{< tab "403 - Forbidden" >}}
+
+#### Body
+
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<d:error xmlns:d="DAV" xmlns:s="http://sabredav.org/ns">
+    <s:exception>Sabre\DAV\Exception\Forbidden</s:exception>
+    <s:message></s:message>
+</d:error>
+```
+{{< /tab >}}
+{{< tab "405 - Method not allowed" >}}
+
+#### Body
+
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<d:error xmlns:d="DAV" xmlns:s="http://sabredav.org/ns">
+    <s:exception>Sabre\DAV\Exception\MethodNotAllowed</s:exception>
+    <s:message>The resource you tried to create already exists</s:message>
+</d:error>
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+## Upload File
+
+To upload files to the remote server, clients can use the `PUT` method to create or fully replace the content of the remote file.
+
+### Request Headers
+
+| Name          | Usage                                                                                                                                                                                                                                                                                                               |
+|---------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `X-OC-Mtime`  | Send the last modified <br> time of the file to the server in unixtime format. The server applies this mtime to the resource rather than the actual time.                                                                                                                                                           |
+| `OC-Checksum` | Provide the checksum of the <br> file content to the server. <br> This is used to prevent corrupted data transfers.                                                                                                                                                                                                 |
+| `If-Match`    | The If-Match request-header field is used with a method to make it <br> conditional. A client that has one or more entities previously <br> obtained from the resource can verify that one of those entities is <br> current by including a list of their associated entity tags in the <br> If-Match header field. |
+
+{{< tabs "upload-file" >}}
+{{< tab "Curl" >}}
+```shell
+curl -L -X PUT 'https://localhost:9200/dav/spaces/storage-users-1%24some-admin-user-id-0000-000000000000/test.txt' \
+-H 'X-OC-Mtime: 1692369418' \
+-H 'OC-Checksum: SHA1:40bd001563085fc35165329ea1ff5c5ecbdbbeef' \
+-H 'If-Match: "4436aef907f41f1ac7dfd1ac3d0d455f"' \
+-H 'Content-Type: text/plain' \
+-H 'Authorization: Basic YWRtaW46YWRtaW4=' \
+-d '123'
+```
+{{< /tab >}}
+{{< tab "HTTP" >}}
+```shell
+PUT /dav/spaces/storage-users-1%24some-admin-user-id-0000-000000000000/test.txt HTTP/1.1
+Host: localhost:9200
+X-OC-Mtime: 1692369418
+OC-Checksum: SHA1:40bd001563085fc35165329ea1ff5c5ecbdbbeef
+If-Match: "4436aef907f41f1ac7dfd1ac3d0d455f"
+Content-Type: text/plain
+Authorization: Basic YWRtaW46YWRtaW4=
+Content-Length: 3
+
+123
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+### Response
+
+{{< tabs "response upload file" >}}
+{{< tab "201 - Created" >}}
+This indicates that the Resource has been created successfully.
+
+#### Body
+
+The response has no body.
+
+#### Headers
+
+```yaml
+Oc-Etag: "4436aef907f41f1ac7dfd1ac3d0d455f"
+Oc-Fileid: storage-users-1$some-admin-user-id-0000-000000000000!07452b22-0ba9-4539-96e1-3511aff7fd2f
+Last-Modified: Fri, 18 Aug 2023 14:36:58 +0000
+X-Oc-Mtime: accepted
+```
+{{< /tab >}}
+{{< tab "204 - No Content" >}}
+This indicates that the Resource has been updated successfully.
+
+#### Body
+
+The response has no body.
+
+#### Headers
+
+```yaml
+Oc-Etag: "4436aef907f41f1ac7dfd1ac3d0d455f"
+Oc-Fileid: storage-users-1$some-admin-user-id-0000-000000000000!07452b22-0ba9-4539-96e1-3511aff7fd2f
+Last-Modified: Fri, 18 Aug 2023 14:36:58 +0000
+X-Oc-Mtime: accepted
+```
+{{< /tab >}}
+{{< tab "400 - Bad Request" >}}
+This indicates that the checksum, which was sent by the client, does not match the computed one after all bytes have been received by the server.
+
+#### Body
+
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<d:error xmlns:d="DAV" xmlns:s="http://sabredav.org/ns">
+    <s:exception>Sabre\DAV\Exception\BadRequest</s:exception>
+    <s:message>The computed checksum does not match the one received from the client.</s:message>
+</d:error>
+```
+{{< /tab >}}
+{{< tab "403 - Forbidden" >}}
+
+The user cannot create files in that remote location.
+{{< /tab >}}
+{{< tab "404 - Not Found" >}}
+
+The remote target space cannot be found.
+{{< /tab >}}
+{{< tab "409 - Conflict" >}}
+
+This error can occur when the request cannot be executed due to a missing precondition. One example is a PUT into a non-existing remote folder. It can also happen when the client sends the wrong etag in the `If-Match` header.
+{{< /tab >}}
+{{< /tabs >}}
diff --git a/docs/ocis/deployment/ocis_and_wopi_drawio.svg b/docs/ocis/deployment/ocis_and_wopi_drawio.svg
new file mode 100644
index 00000000000..2ceaeddfd96
--- /dev/null
+++ b/docs/ocis/deployment/ocis_and_wopi_drawio.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Do not edit this file with editors other than diagrams.net -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1651px" height="816px" viewBox="-0.5 -0.5 1651 816" content="&lt;mxfile host=&quot;Electron&quot; modified=&quot;2023-01-02T15:53:47.179Z&quot; agent=&quot;5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.7.4 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36&quot; etag=&quot;3g1Ld0YoR6MTAWI36Y9D&quot; version=&quot;20.7.4&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;n2S8zIRfchnmVBpZdI-E&quot; name=&quot;Seite-1&quot;&gt;7V1bc5u6Fv4t5yEz7YMZhLg+Jmmc9vSSNElv56WDMbbZwUCB2M7+9UcSF4MkMHawTWPcTmsLWeC1lj6tm5bO4OV8dR2aweyzP7bdM0kcr87guzNJApoG0X+45TlpUWWQNExDZ5x2WjfcO//aaaOYtj45YzsqdYx9342doNxo+Z5nW3GpzQxDf1nuNvHd8l0Dc2ozDfeW6bKtP5xxPEtadUlbt7+3neksuzNQjeTK3Mw6p78kmpljf1logldn8DL0/Th5N19d2i4mXkaX5HvDiqv5g4W2Fzf5wh0MFkttcf3lx+ev50/xIvgYiIN0lIXpPqU/OH3Y+DmjQOg/eWMbDyKewYvlzInt+8C08NUl4jlqm8VzF30C6C37UNkd7DC2V4Wm9CGvbX9ux+Ez6pJeHQA5pVgqMkr6cbmmvwzTtlmB9pKaNpopz6f52GuyoDcpZbagkrKZSrY3Psfihj5ZrhlFjlUmTJmKUWyGMdufNA8dN/sSImL4/BN/RxB1I2v4RRoMVcsa3q3SYZNPz8VPt3boICLYYda4cuJkRAPA9DMeEAiiBNLP6/Hwh+fCB3q0SnZH/lNopaT58vsRjm+n13cf/1yu/oBfz/oPcwCzyWyGUztu0NEelyYqKz4F8VA40pG1hbZrxs6iPL15EpPe4dZ30G/LpTMHplQ4IaSELvnl6beK05EaCIjUQCI1UEIZZiAkNeZzoVuAO0Q1D0zNJkkX659L27K/WNsfvUmeeD37cp41mpAP2p+Ldz//fJcfoPXh2VE00zvnwJYVQTNw2GmJpOaTOUKLUmk2mq4z9fDUQ3KLhfkCw5ODUP88vTB3xmM8xkVoR86/5oiMhyU+JTcaXLk4U95x50AthtA4mC9d6U1KqwMPH0UBSIpSonlGjxfKtiyXRqW+708mkR1TvN2Wm/xFSOfy7T796IfxzJ/6nulerVspQF33+eT7Qcrlf+w4fk5VCvMp9ssysEZCHYICEg4Q2AJlayhsCOmNEJNPJbUhEL5QCqoAoG1gUin8k7fDJar/i3FmeX/19BGC638+3KgTaz53P11/5apHqosYdzFCb6b4jRkEhOZTJyJkTS6ju+U9OqBRURgNAKtSAYmzaLahUXEJKx9zxhdnuyjUT/UdNDUxb/iVwouyi6bWCCm4xJVY1epaDr5dXqkP0c+flrx6WPy6HjwOQFPV6oWIAikVBBjNEIUdyKAG0g1B1cX1S22ki22LVJDS+SSxHqro/qBllYivJ4uVWBUFpleabOqfJ2x1Xkx8Lx5EZLqcow5AClZE8MSRaT1OyXwbWL7rh8n1cDp6I8losUZPKEqykb5RxLfkW9moa9wbEnAcuggaC8CYPE7WJ4XT8CgP2A36+IHtVdKnCwptHYS/XKHFCpdiSK2osJm1mBtVe9BhudRQj6rCbrGg5SsVtUptWqPa1G+brlp1OlnLi9a2awJtVW9YEugV8BDKq8YsCJmRvMbcHIkwRiM0irgXMUARqOosGKktghEwJLXErZbMa6lsXhuHgiapUjHITZRJiFY62xt30nwBtDqlHdt6yRTnYzkslCLet2G+7I7a+l+F2gMatumYyXb99+R0YCdsDXAnngc77DY+g6pZvxNAawYsI0Ir+FxWHTOH7f7x2TgKmOQOi+3UwDUIgSQAlaudhq4e1WnaFJ64zlWjG/Ckl+FGNWrgZuO3oUStfxXukNZwi/VAXF89nOGnGM78KHa8KXo3diLLRzCAXaXmHGsL3igKum3qGm2BlyioYpY60Cp2Qb28Tu0jdsNn+nE8uWt3K4RqEcGwM0ECm0CsPjKuQ5lCNvj3ItuewkaNoY2KkzeEMomCsl2j7PQ4CjVOhee5tdnByxwZOn7m9RMEocOwB1pz8SG9wjAoiGoF98pjDg5mU+scvnIDg0HoL5yxHfIta1qffxPgnuLSRn1E9PSOZb9lBOTo4UMJGIKWkvoQNjg3BYQ3sygOTHFKIktkRN2xuWDbfSv6K/wfxgHdH9wlBR5lyT9A8HbAid6CtX7RevS2TrC7E72FlPtNbraGcnRUBBtlzypQREGTGy3tLw3agg2uHqZ/qlLvNWh7FOV521lBTQhpk4ugUvQ35npm6tK+RVqFaKKr67SBsudHMdCPBI2EkhlZkbD9oWqaAkSITL2yn0pFC6dqaKoGVVnUoUi5mFpKrFIopVcx6iWf7q+mbNir5HMV4wgvo4jyw4nvC2PfWnGnx8GV47qp21LEiUroTAd/qUOTyhKlgLYV7ZhLG5Vh7rcIK7YUM6OZGeC3T3P33Ir9It8Ij2/9yIkdH/Nv5MexP+cwNvYphct/il3Hsy/z/SC1kNRcC0Mztg4ztDVmFPQynlpGL5+7qGVcqmt/4WKivfbFRNX2tpgggdSwl1eFigFUg5rde1pMVG3LxUQ+wGLCs8aTxQS/GZlh1xeTLFWjjcVEAmJLy4d0qPUCHNWiJFZf2eO73hGwIYlKFAxDKUOaLu3qfd6nD7kWIjdj6X7iY6zIQUOQxSos1SRdMNirbW+YojYmqEo94tH9tTSzZ6+Il7tm15A3cVwbfQdBRoeBLpvp7SAdsqFaQToqyyNzcB0A+AyGjT+I7/eG+H4ZRh7a9UjtuVH1A7oe+QTrNr1o6DhkplpdXkNX6aVQ9FKPLV/Zzcq5V36IMxeWfuAgM3bBsWQPHpKhfLKyfGxBA6zN30nCUVCfFxI4HuGOuhVum1zSgtJbUnk3ZVvsfWdsCnLHSoVgtVhDFspxDhUown6cvXRwUN2wjZYxzw+wW19ioAEjAlfsu7FXv73EB6Slwsy3u6tU5bsQ9pHUxdeyRC5zDpXUtZ+dSdwKLaix2CVHRVGUSg4BoB2yOArPLu9w2ioDKmADBtH9t0pzBRXf3j4eXfHYe8iX5euarDGT2/BmN9CxFh1aQUdZg9LL4DHX7Kj8/cOh5XF3A5VwquneTzbPRVV2yprtkI/yMModnQ6j71wASjIEXTPyl1qO1mqiIciF2gbSXtRH2vWlwg3QTfVHT9mq/sjnLKtA5kA56jJQtrnpSdKg2gpQgoN5NyU2yeO15wGoyvHzAAC78ZtJjb30Xdcc+aHJzXjF1Szo7NgJ4guW2/R7RAAx2jpYtCIb4b7vcXaPm/Q2nwix7ZHgMOIQHmKEP2TzmUmInoSI3YiWyGC8D623+Leju4iebePVk7MhsrIla7jx3OfM/dnwt+PVd45+soVZaHpjl2xloqQYyU+8P8jBj5BUIknTLkL/EQk3qT3yzvM9PAoioks1tSDwSOIFo/gqC7ymCIAV+KzkTUniAa1gtybykFWlHUJzLJrhAvE6IsI7nz95iAEETF7kihyb0Yz0zT7cmjG6n0daJBJNboH0elklkCDSGDh59xqP1usU/ZdQO/rufX0ff7ox7V/vv88u7+KfYdCkHOruxNyPEA8Arbaxfl8ZcOiYQ3frVGQd5ib5EoLFyBnbNG5SwisuHBNrxTMMoUHor57Xso7evSHbxcWpGdtL85ndQ8KCVVNEaQ5qPK6X5aINxhrlOcIpFpyXHyvyldbad2GrPB+o5rfL6w+KP374r62NHrXpgA3Mc8xD13WCqIpGxRUkChLlZeKsMNVKDDmT4ETBf86SSlWF9uTFcBVdUclrM4K1FRDFkEVxSK5QkfLW0vxj0+daYxWLYyyQnRCrahVbTWIn1hFYxqq2nNqxJ8MyuiaqoqiCJDKq2nFZxiZncgpenAzLFKyXFXLYxHKgUOFUZj0Cz9i0EU59u5PhGaQqdynZinZcJnHqbXByCU6GS3gLRo1jxuiK1pF7Bdds46Q/92xLV7TOsE1i2MbZcHMybAP0QiaVp5vELRFwDL5Bhm/glBUQiDgjgyp3HgBkAwkzHY/MQ9aozk9V6nnI8FDHbsLCS+8ED1lrm7ft52R4iBYUaqpRp68YhqBoneMi67XkpT+cDhcptzIERjlYIneCa6zbhJfidzpco/e1yJ3RVlhvSaZ4niSngLbmDF3WckN8vY3ADZ9HrHcEnLIpgMOSJcyjClwqXZlcnM09mVZykozbpILoFF+7wUTWfcI7P+5kmLhh9nWTh6wvhbcN6mR4OKB8KbAcMQWcZIVjcI3jSTnlsIAql81sqrQdmpfKoW02bqFAzhJ30ArNAOFzKdVcRBrUDqnmWA7S+0mNSwNxKZJizb5TxWWtvJ6q9EmaLZU6pO+jbdh/o8Da/i9O4uaiB+s4OOnEGBmhR8mFV0aPjqRbSKzj9ZQVZlkFdUxTFMjLzzwC5LM6Msu19XbINLOvREMqPbNMzjUvfqQ/U2LWjEpyd+Qgd5mqPQHpHf5N9/EMJPrcDXqk9orMc5nNKtM9szcwW6HPAdiZ2cxIe2Y2q4P76V4G0QwCtyq5vZObE2iFjnxOnxm0ANcDyWCYJcgSA9D5ecRtb8+pUz4LHJzFcRCRjSdD8jfZfoKpcUZ23KSr3fr8WDiZkBWROVI2kYVBQRIEf+lZrv80FmK7dApvMnxFifu/QlzaWNANKsuVlz6uHlI62EhNi9JhOVEvD7XyAEQh24+eV88WiumavIQI3sK1NwFhA0RJMRWxosLSX8G69pGf2nQAeZXF4CH5xgaN8HTs2cVXodkE24OiMCe1luFUr1OXgZLZ3dlUp0YDCdmegJz/1N7FPWvVvBj7/n2k9LSqPYcGqyptnkOz0UmqNZS2l9bToHR0QMftm4oRpDfDNDPMtj5Xhnperd0CGLVH/RTgKLQRvEaFzZ+U+B66sCJU5Ny0yiMgB6ytyKcbay33ML4Bxnf2g9E+Fl08rGeEkyT891cbUUQFTauq3REAaptzRFnJ2ZvaxEmwySzMKDC9Eh8y4xQvgoNEJ0UmrghAsEpMVsp4Ta2cQb4vPrVUxant2aHpCgVbNrlZuf5HKw/wFLrF6iAvGG3fT2uOx8gcwFUvyEB8J6FokYuhbVqzs6yYAGVO7vfXNrZ+XHsSH9v2Afh7LsaIC9N6nBKc5/QemnPHxTP0ve0ubPy47WCBJOfRpUzF4Vi10kGdmRLrr+qeZgIFTa8M2h20dDafhqxLZxefH14e+KiVTOXe81fr+UNSwkvcz6TE0HhJrJBXMqaNyXbzfvH9n6tr0Xz4+OXp66+fP2+k/3GjupslA78mk2JTAyCHFUB+fnv7+/bu5vuHd1d3v9/dffh+dVclSWSgZDHZag2pujVdEOcMT9LNP18UDaM8MV70DMiiEJNSaGMnClxiOgZPYeBHpMSU7yHkr5paxyTD/qTgx83th9+45cv556taYUiqrg3OiyrIKxONtdrlT3KNqkL5KmtYpyYt3+4+1QpLeQlsGth8NYK0nNmhnWvoiRzRJ8pzFPfTlSnyz/3VHVqRfl/9fLi6+3L+aUsh26QrvRbhYh4jkZ+RSbR2QjMx9rHAWVYKZiRUJb6Zuv7IxHrKzeWH+4S6l/gyJoyP6LYMnTi2scSSqp7puLbrL9+eokwObz7h94hOvy/O76+2xTxOuJ6vnW8wooomLDxj0iuHQ2I6tKJGa0AUONHytb3Ky79Ree7NvLbVS9To0eDii//tq/fr8p0sRsvw431gcdToSt8SZsHv5OrQ8r2JQx9nVMQM3EFAWmGOF2NnwRWoVBQxx8Pp6I2YTKLsv7fJrYnUTVJXAu5a9iaIlFQivq2KF5Kb4iueH85Nt3BtYYaOif5H5poZPyF1ZUM/ywyquixThuGLcipDomtjH/kAn7+K6+Qy3/TDYGZ66ZBSikBIkAepZXlOxpjEhSuONyYyiS/lP5RciUM0FFLI59l90oqhWL78ZfkmSz8clx8rHwv9ktGjg4bDYyZm6CCVUPaeY9siFZB9bxDPHOvRwyBJ+jmeEzvZ76T7FnhS268gHsV+NT41Imj1BvwGiKi04VvAhAEV3Nc5ue17q9HJRQA2F4MhG/buBc1//NYV3RWl7MoDosaroyzzvHlQkXJPYOtOBjaKwtAmi6BMXHuVxs74p+sUBKzs9SuuSDpvRUoT/jNKGAJQi69kQ9E4HQIKhiolpwSNs0AcWocA1NcvgyvLddLRkficIQoQVPqlAHEKA6CLoi4qqizr5fGbBu823EWBggIkaADNQB/kZkeN7xDY4/KDV256Q5RkHyssUPsV9nWvsOLE9c2Y/pmZny/tjsO86M1/nHngh7HpxdzF2RRQn5uAmEI+FrolPna1NuRXYQH1otyLcnvKYo+YvZh1EzFHGDE/EetZjIid0sNlL8c9XPZi9nrErEW4tDBc3tsuzjZMjs/q8bIX5B4vezF7RWLWIl6OCwZ5RGATHx+YAmd6mFYxT6NH017MezTtxewViVmLaGpjNCV+zR/Yryn6CFijIoKSjRKIhDFJT0LE8NgMjd02QPSy38v+UWXfwXJJhNOZhOa82u7aKRC/XYyyQRC+GGTnH8orC7KO/qjoL1QMDVZHKF8UdGd3OTQNum9FgeaR+Cy4qeLMf3yCjSZCRVRl2CwKD3QgSKqmajLQoCxKLQTkuT+ULZzYY2SPkd3GSBL+RKONydd4qZls05BYXUM3CQEk8lzOxlvvuDAXpuOSCV622qLebOvnS2+29WL2isSsTVg+ky6QuXZhNcXkLjZxFgZ/FJtELU/deUif6teBfoL260AvZq9HzNp231kmtkMbq+d0U6qu+ySk0oNtPwt6sO3F7NWIWYtg2whN+9jIPmW9l2jOrM/r97AiG9qIfWk3KqRH9oWTRZ+oDi1GPop7wvCRLvWFthpGCfSKKEF9nIRXa9hQBBmJIjREqKsQtnByC/eB2XpaB9xN3M/tVzK38xW9Sl1KiyJsLnaQoT89UG2Fsl2GPdBBF8PV879ncFh5nb+nesOvO/EpyF9U+unplGjeYFK1Nju7NxCuk3EfWui7fORoqtNKisKbXTuUPSyrLMO0ysdqtcKY4Lj2wBkPACmXs6luDYMdL+rYmNRyBakfknQrcW565tSe22Q4Ur8nKVwX2dZT6MRJ7XYz8knmlufHiT4Vn5Vql9WUrNmugmS3tb+sxCpVqUIRkK6nQgVAWVM51ZVljaMp8r/VfhkbNn/mkOe6UscTaMpZ/ekEUYxkiy0RQZqHjrsen1NHAjUWu6yc+Gd2D/S++ADo4/r++EN2+8pSHkmFhKSptsRt8cCEL78f4fh2en338c/l6g/49az/MPPq1y2fmFB9QEFlNQcADEEt1xdR6dM5Koo2sGNRZd3l7GSdDSUm2qr+wDsY/HhiLoMDyjnvPA++8EuHFP47GCyW2uL6y4/PX8+f4kXwMRAH2Ungxxd+6nwOWZGFZofJsKKv0UMdWPS1Y4h+YSWuL6689+OzdSk/ITfjgIqADcpoidUA/rchFrEnYAN2aEMWkkHJv2ojkdmB09ylA7A1brpXRr32wGo1O+3jEGXUubOl5vCJxir11odPWBEUEKdMZJHbS/OZVfbfoB7415Lvp72qa2G+WHWGO6jOW4uCmiNqfmYMWxodqIrAOfWaPpWpAfvRx9DH7FjPOESD2Wd/bOMe/wc=&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="150" y="15" width="430" height="260" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 530.14 231.46 L 530 245 L 460 245 L 390 245 L 390.09 230.39" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 530.2 226.21 L 533.62 233.25 L 530.14 231.46 L 526.62 233.18 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 390.12 225.14 L 393.58 232.17 L 390.09 230.39 L 386.58 232.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 246px; margin-left: 492px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">cs3api</div></div></div></foreignObject><text x="492" y="249" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">cs3api</text></switch></g><path d="M 349.72 387.73 L 349.7 305 L 460 305 L 460 251.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 349.72 392.98 L 346.22 385.98 L 349.72 387.73 L 353.22 385.98 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 460 246.12 L 463.5 253.12 L 460 251.37 L 456.5 253.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="190" y="75" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 105px; margin-left: 191px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>app registry</b></div></div></div></foreignObject><text x="250" y="109" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">app registry</text></switch></g><path d="M 526.37 165 L 600 165 L 600 145.1 L 638.17 145.1" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 521.12 165 L 528.12 161.5 L 526.37 165 L 528.12 168.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 643.42 145.1 L 636.42 148.6 L 638.17 145.1 L 636.42 141.6 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 196px; margin-left: 620px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><span style="font-size: 12px; background-color: rgb(248, 249, 250);">/app/list</span><br style="font-size: 12px; background-color: rgb(248, 249, 250);" /><span style="font-size: 12px; background-color: rgb(248, 249, 250);">/app/open</span></div></div></div></foreignObject><text x="620" y="199" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">/app/list...</text></switch></g><path d="M 393.63 165 L 330 165 L 330 105 L 316.37 105" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 398.88 165 L 391.88 168.5 L 393.63 165 L 391.88 161.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 311.12 105 L 318.12 101.5 L 316.37 105 L 318.12 108.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 174px; margin-left: 364px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">cs3api<br />/listapps<br />/openapp</div></div></div></foreignObject><text x="364" y="177" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">cs3api...</text></switch></g><rect x="400" y="135" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 165px; margin-left: 401px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>frontend</b></div></div></div></foreignObject><text x="460" y="169" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">frontend</text></switch></g><path d="M 250 178.42 L 250 141.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 250 183.67 L 246.5 176.67 L 250 178.42 L 253.5 176.67 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 250 136.12 L 253.5 143.12 L 250 141.37 L 246.5 143.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 160px; margin-left: 251px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">cs3api<br />/registerapp</div></div></div></foreignObject><text x="251" y="164" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">cs3api...</text></switch></g><path d="M 210.04 250.32 L 210 655 L 333.63 655" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 210.04 245.07 L 213.54 252.07 L 210.04 250.32 L 206.54 252.07 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 338.88 655 L 331.88 658.5 L 333.63 655 L 331.88 651.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 676px; margin-left: 271px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">GET /hosting/discovery </div></div></div></foreignObject><text x="271" y="679" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">GET /hosting/discovery </text></switch></g><path d="M 290.08 250.14 L 290.1 295 L 290.31 387.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 290.08 244.89 L 293.58 251.89 L 290.08 250.14 L 286.58 251.89 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 290.32 392.62 L 286.8 385.63 L 290.31 387.37 L 293.8 385.61 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 355px; margin-left: 301px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">/iop/open...</div></div></div></foreignObject><text x="301" y="359" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">/iop/open...</text></switch></g><rect x="190" y="184.79" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 215px; margin-left: 191px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>app provider</b><br />(per web office)</div></div></div></foreignObject><text x="250" y="218" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">app provider...</text></switch></g><rect x="400" y="55" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 85px; margin-left: 401px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>graph<br />webdav<br />ocs</b></div></div></div></foreignObject><text x="460" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">graph...</text></switch></g><path d="M 526.37 85 L 600 85 L 600 103.2 L 637.93 103.17" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 521.12 85 L 528.12 81.5 L 526.37 85 L 528.12 88.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 643.18 103.16 L 636.19 106.67 L 637.93 103.17 L 636.18 99.67 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 913.69 555.21 L 810 555.2 L 810 580 L 770.79 580" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 918.94 555.21 L 911.94 558.71 L 913.69 555.21 L 911.94 551.71 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 765.54 580 L 772.54 576.5 L 770.79 580 L 772.54 583.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 556px; margin-left: 863px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">/space1/foo.docx</div></div></div></foreignObject><text x="863" y="559" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">/space1/foo.docx</text></switch></g><ellipse cx="940.06" cy="540.21" rx="5" ry="5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 940.06 545.21 L 940.06 561.88 M 940.06 548.54 L 930.06 548.54 M 940.06 548.54 L 950.06 548.54 M 940.06 561.88 L 930.06 575.21 M 940.06 561.88 L 950.06 575.21" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 582px; margin-left: 940px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">User</div></div></div></foreignObject><text x="940" y="594" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">User</text></switch></g><path d="M 913.69 635.21 L 810 635.2 L 810 610 L 770.79 610" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 918.94 635.21 L 911.94 638.71 L 913.69 635.21 L 911.94 631.71 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 765.54 610 L 772.54 606.5 L 770.79 610 L 772.54 613.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 636px; margin-left: 862px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">/space2/bar.docx</div></div></div></foreignObject><text x="862" y="639" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">/space2/bar.docx</text></switch></g><path d="M 637.57 614.86 L 550 614.9 L 550 694.2 L 485.77 694.2" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 642.82 614.86 L 635.82 618.36 L 637.57 614.86 L 635.82 611.36 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 480.52 694.2 L 487.52 690.7 L 485.77 694.2 L 487.52 697.7 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 615px; margin-left: 591px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">fileid c</div></div></div></foreignObject><text x="591" y="619" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">fileid c</text></switch></g><rect x="360" y="645" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 675px; margin-left: 361px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Web Office</div></div></div></foreignObject><text x="420" y="679" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Web Office</text></switch></g><rect x="350" y="635" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 665px; margin-left: 351px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Web Office</div></div></div></foreignObject><text x="410" y="669" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Web Office</text></switch></g><rect x="340" y="625" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 655px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Web Office</div></div></div></foreignObject><text x="400" y="659" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Web Office</text></switch></g><rect x="260" y="405" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 435px; margin-left: 261px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">cs3org/wopiserver</div></div></div></foreignObject><text x="320" y="439" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">cs3org/wopiserver</text></switch></g><rect x="250" y="395" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 425px; margin-left: 251px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">cs3org/wopiserver</div></div></div></foreignObject><text x="310" y="429" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">cs3org/wopiserver</text></switch></g><path d="M 400 618.63 L 400 605 L 310 605 L 310 461.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 400 623.88 L 396.5 616.88 L 400 618.63 L 403.5 616.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 310 456.12 L 313.5 463.12 L 310 461.37 L 306.5 463.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 595px; margin-left: 337px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">wopi</div></div></div></foreignObject><text x="337" y="598" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">wopi</text></switch></g><path d="M 638.29 575.26 L 510 575.3 L 510 655 L 466.37 655" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 643.54 575.26 L 636.54 578.76 L 638.29 575.26 L 636.54 571.76 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 461.12 655 L 468.12 651.5 L 466.37 655 L 468.12 658.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 575px; margin-left: 534px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">fileid a</div></div></div></foreignObject><text x="534" y="578" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">fileid a</text></switch></g><path d="M 638.05 595 L 530 595 L 530 674.1 L 476.49 674.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 643.3 595 L 636.3 598.5 L 638.05 595 L 636.3 591.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 471.24 674.06 L 478.24 670.57 L 476.49 674.06 L 478.24 677.57 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 596px; margin-left: 566px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">fileid b</div></div></div></foreignObject><text x="566" y="599" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">fileid b</text></switch></g><ellipse cx="940.06" cy="620.21" rx="5" ry="5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 940.06 625.21 L 940.06 641.88 M 940.06 628.54 L 930.06 628.54 M 940.06 628.54 L 950.06 628.54 M 940.06 641.88 L 930.06 655.21 M 940.06 641.88 L 950.06 655.21" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 662px; margin-left: 940px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">User</div></div></div></foreignObject><text x="940" y="674" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">User</text></switch></g><rect x="555" y="640.11" width="180" height="110" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 695px; margin-left: 645px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><b>Collabora</b>:<br />for collaborative edit sessions<br />a sticky route by fileid<br />(from wopiSrc) is needed<br /><br /><b>OnlyOffice</b>:<br />automatic handling</div></div></div></foreignObject><text x="645" y="699" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Collabora:...</text></switch></g><rect x="375" y="204.89" width="170" height="19.79" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-dasharray="1 4" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 215px; margin-left: 376px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">inter services communication</div></div></div></foreignObject><text x="460" y="218" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">inter services communication</text></switch></g><rect x="160" y="45" width="410" height="220" fill="none" stroke="rgb(0, 0, 0)" stroke-dasharray="3 3" pointer-events="all"/><rect x="195" y="15" width="340" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 338px; height: 1px; padding-top: 30px; margin-left: 196px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">all outside communication via the proxy service (api gateway)</div></div></div></foreignObject><text x="365" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">all outside communication via the proxy service (api gat...</text></switch></g><ellipse cx="939.95" cy="515.32" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 515px; margin-left: 931px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">1</div></div></div></foreignObject><text x="940" y="519" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">1</text></switch></g><ellipse cx="940.16" cy="695.11" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 695px; margin-left: 931px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">2</div></div></div></foreignObject><text x="940" y="699" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">2</text></switch></g><ellipse cx="470.11" cy="531.32" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 531px; margin-left: 461px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">8</div></div></div></foreignObject><text x="470" y="535" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">8</text></switch></g><ellipse cx="359.89" cy="485.11" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 485px; margin-left: 351px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">9</div></div></div></foreignObject><text x="360" y="489" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">9</text></switch></g><ellipse cx="624.11" cy="560.11" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 560px; margin-left: 615px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">6</div></div></div></foreignObject><text x="624" y="564" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">6</text></switch></g><ellipse cx="870.16" cy="665.32" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 665px; margin-left: 861px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">4</div></div></div></foreignObject><text x="870" y="669" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">4</text></switch></g><ellipse cx="870.16" cy="525.32" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 525px; margin-left: 861px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">3</div></div></div></foreignObject><text x="870" y="529" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">3</text></switch></g><ellipse cx="459.89" cy="604.89" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 605px; margin-left: 451px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">7</div></div></div></foreignObject><text x="460" y="608" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">7</text></switch></g><ellipse cx="629.53" cy="85.32" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 85px; margin-left: 620px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">19</div></div></div></foreignObject><text x="630" y="89" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">19</text></switch></g><ellipse cx="629.53" cy="165" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 165px; margin-left: 620px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">20</div></div></div></foreignObject><text x="630" y="169" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">20</text></switch></g><ellipse cx="179.89" cy="174.68" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 175px; margin-left: 171px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">13</div></div></div></foreignObject><text x="180" y="178" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">13</text></switch></g><ellipse cx="270.11" cy="295.11" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 295px; margin-left: 261px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">11</div></div></div></foreignObject><text x="270" y="299" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">11</text></switch></g><ellipse cx="230.11" cy="624.89" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 625px; margin-left: 221px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10</div></div></div></foreignObject><text x="230" y="628" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">10</text></switch></g><ellipse cx="479.79" cy="295" rx="10" ry="10" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 295px; margin-left: 471px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">12</div></div></div></foreignObject><text x="480" y="299" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">12</text></switch></g><ellipse cx="540.11" cy="134.89" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 135px; margin-left: 531px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">17</div></div></div></foreignObject><text x="540" y="138" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">17</text></switch></g><ellipse cx="179.89" cy="65.11" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 65px; margin-left: 171px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">15</div></div></div></foreignObject><text x="180" y="69" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">15</text></switch></g><ellipse cx="540.11" cy="65.11" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 65px; margin-left: 531px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">18</div></div></div></foreignObject><text x="540" y="69" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">18</text></switch></g><ellipse cx="290.32" cy="155.11" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 155px; margin-left: 281px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">14</div></div></div></foreignObject><text x="290" y="159" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">14</text></switch></g><ellipse cx="365" cy="114.69" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 115px; margin-left: 356px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">16</div></div></div></foreignObject><text x="365" y="118" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">16</text></switch></g><path d="M 764 645 L 764 675 L 823.5 675 L 823.48 709.39" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 823.48 714.64 L 819.98 707.64 L 823.48 709.39 L 826.98 707.64 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="764.53" cy="695.11" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 695px; margin-left: 755px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">21</div></div></div></foreignObject><text x="765" y="699" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">21</text></switch></g><ellipse cx="761.53" cy="528.99" rx="10.105" ry="10.105" fill="#f5f5f5" stroke="#666666" stroke-dasharray="1 1" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 529px; margin-left: 752px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">5</div></div></div></foreignObject><text x="762" y="533" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">5</text></switch></g><path d="M 740 325 L 10 325" fill="none" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/><path d="M 740 515 L 10 515" fill="none" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/><rect x="0" y="515.42" width="190" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 535px; margin-left: 95px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;">office application</div></div></div></foreignObject><text x="95" y="541" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="20px" text-anchor="middle" font-weight="bold">office application</text></switch></g><rect x="781" y="715" width="360" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 735px; margin-left: 961px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">https://<font color="#ff3333">office-application.owncloud.test</font></div></div></div></foreignObject><text x="961" y="741" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="20px" text-anchor="middle">https://office-application.owncloud....</text></switch></g><rect x="700.32" y="24" width="250" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 44px; margin-left: 825px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">https://<font color="#ff3333">ocis.owncloud.test</font></div></div></div></foreignObject><text x="825" y="50" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="20px" text-anchor="middle">https://ocis.owncloud.test</text></switch></g><rect x="5" y="325" width="130" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 345px; margin-left: 70px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;">wopi server</div></div></div></foreignObject><text x="70" y="351" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="20px" text-anchor="middle" font-weight="bold">wopi server</text></switch></g><rect x="10" y="0" width="60" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 20px; margin-left: 40px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;">ocis</div></div></div></foreignObject><text x="40" y="26" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="20px" text-anchor="middle" font-weight="bold">ocis</text></switch></g><path d="M 742 75 L 742.29 324" fill="none" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/><path d="M 680 85 L 680 43.6 L 693.7 43.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 698.95 43.64 L 691.95 47.12 L 693.7 43.63 L 691.96 40.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="644.42" y="95" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 125px; margin-left: 645px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">reverse proxy</div></div></div></foreignObject><text x="704" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">reverse proxy</text></switch></g><path d="M 742 325 L 740 765" fill="none" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/><ellipse cx="805.42" cy="107.58" rx="5" ry="5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 805.42 112.58 L 805.42 129.25 M 805.42 115.91 L 795.42 115.91 M 805.42 115.91 L 815.42 115.91 M 805.42 129.25 L 795.42 142.58 M 805.42 129.25 L 815.42 142.58" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 150px; margin-left: 805px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">User</div></div></div></foreignObject><text x="805" y="162" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">User</text></switch></g><rect x="314.89" y="525" width="290" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 545px; margin-left: 317px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><span style="font-size: 11px;">wopi -&gt; general.</span><span style="font-size: 11px;">wopiurl<br style="font-size: 11px;" /></span><span style="font-size: 11px;">address an office application can reach the wopi server<br style="font-size: 11px;" /></span></div></div></div></foreignObject><text x="317" y="548" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px">wopi -&gt; general.wopiurl...</text></switch></g><rect x="643.79" y="405" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 435px; margin-left: 645px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">reverse proxy</div></div></div></foreignObject><text x="704" y="439" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">reverse proxy</text></switch></g><rect x="744" y="462.79" width="310" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 483px; margin-left: 899px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">https://<font color="#ff0000">wopiserver.owncloud.test</font></div></div></div></foreignObject><text x="899" y="489" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="20px" text-anchor="middle">https://wopiserver.owncloud.test</text></switch></g><rect x="1000" y="525.42" width="650" height="170" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 648px; height: 1px; padding-top: 532px; margin-left: 1002px;"><div data-drawio-colors="color: #FF0000; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 13px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 13px;" color="#3333ff">APP_PROVIDER_DRIVER</font>: wopi<br style="font-size: 13px;" />  <font style="font-size: 13px;" color="#009900"># for display purposes only</font><br style="font-size: 13px;" />  <font style="font-size: 13px;" color="#3333ff">APP_PROVIDER_WOPI_APP_NAME</font>: Office-Application<br style="font-size: 13px;" />  <font style="font-size: 13px;" color="#009900"># address of the office application server</font><br style="font-size: 13px;" />  <font style="font-size: 13px;" color="#3333ff">APP_PROVIDER_WOPI_APP_URL</font>: https://office-application.owncloud.test<br style="font-size: 13px;" />  <font style="font-size: 13px;" color="#009900"># where can the app provider reach the wopiserver</font><br style="font-size: 13px;" />  <font style="font-size: 13px;" color="#3333ff">APP_PROVIDER_WOPI_WOPI_SERVER_EXTERNAL_URL</font>: https://wopiserver.owncloud.test<br style="font-size: 13px;" />  <font style="font-size: 13px;" color="#009900">#  the base URL to access ocis (global OCIS_URL, or overwritten by the below)</font><br style="font-size: 13px;" />  <font style="font-size: 13px;" color="#3333ff">APP_PROVIDER_WOPI_FOLDER_URL_BASE_URL</font>: https://ocis.owncloud.test</div></div></div></foreignObject><text x="1002" y="545" fill="#FF0000" font-family="Helvetica" font-size="13px">APP_PROVIDER_DRIVER: wopi...</text></switch></g><rect x="210" y="785" width="340" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 338px; height: 1px; padding-top: 800px; margin-left: 212px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">wopi -&gt; ocis_wopi/config/wopiserver/wopiserver.conf.dist<div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"></div></div></div></div></foreignObject><text x="212" y="804" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">wopi -&gt; ocis_wopi/config/wopiserver/wopiserver.conf.dist&#xa;</text></switch></g><path d="M 934.74 197.5 L 943.9 197.5 L 943.9 212.23 L 949.47 212.23 L 939.32 225.12 L 929.17 212.23 L 934.74 212.23 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 378px; height: 1px; padding-top: 79px; margin-left: 851px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">a. Open oC web</span><br style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" /><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">b. List space</span><br style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" /><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">c. Select file</span><br style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" /><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">d. Open selected file via office app</span><br style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" /><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">e. oC Web opens office url with token </span><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">in an iframe</span></div></div></div></foreignObject><text x="851" y="91" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">a. Open oC web...</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 358px; height: 1px; padding-top: 243px; margin-left: 851px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">a. load:    /app/list =&gt; display available office apps</span><br style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" /><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">a+b+c                   =&gt; obtain file id</span><br style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" /><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">e. call:     /app/open</span><br style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" /><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">    </span><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; text-align: center;">return: office url to open:</span></div></div></div></foreignObject><text x="851" y="259" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px">a. load:    /app/list =&gt; display available of...</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 468px; height: 1px; padding-top: 329px; margin-left: 871px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><div style="color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; text-align: left;"><font style="font-size: 16px;">https://<font color="#ff3333" style="font-size: 16px;">office-application.owncloud.test</font>/xyz?</font></div><font style="color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; font-size: 16px;"><font style="font-size: 16px;"><font style="font-size: 16px;"><font style="font-size: 16px;">wopiSrc=https://<span style="color: rgb(255, 0, 0);">wopiserver.owncloud.test</span>/wopi/xxx/file-id-123</font><br /></font><br /></font><font style="font-size: 14px;">Token management is for security reasons not part of the URL</font></font></div></div></div></foreignObject><text x="871" y="345" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px">https://office-application.owncloud.test/xyz?wopiSrc=https:...</text></switch></g><path d="M 637.42 450 L 386.37 450" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 642.67 450 L 635.67 453.5 L 637.42 450 L 635.67 446.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 381.12 450 L 388.12 446.5 L 386.37 450 L 388.12 453.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 637.42 420 L 506.9 420 L 376.37 419.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 642.67 420 L 635.67 423.5 L 637.42 420 L 635.67 416.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 371.12 419.9 L 378.12 416.41 L 376.37 419.9 L 378.12 423.41 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 772.21 434.63 L 802.2 434.6 L 802.21 453.35" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 802.21 458.6 L 798.71 451.6 L 802.21 453.35 L 805.71 451.59 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="644.42" y="565" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 595px; margin-left: 645px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">reverse proxy</div></div></div></foreignObject><text x="704" y="599" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">reverse proxy</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 163px; height: 1px; padding-top: 341px; margin-left: 357px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 13px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font style="font-size: 11px;">wopi -&gt; cs3.revagateway<br />(cs3 api gateway)</font></div></div></div></foreignObject><text x="357" y="354" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="13px">wopi -&gt; cs3.revagateway...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file
diff --git a/docs/ocis/deployment/ocis_wopi.md b/docs/ocis/deployment/ocis_wopi.md
index 7e25e5c1e7e..d1becdca082 100644
--- a/docs/ocis/deployment/ocis_wopi.md
+++ b/docs/ocis/deployment/ocis_wopi.md
@@ -26,6 +26,10 @@ There are three oCIS app driver containers that register Collabora and OnlyOffic
 
 The last four containers are the WOPI server, Collabora and OnlyOffice.
 
+## Overview Image
+
+{{< figure src="/ocis/deployment/ocis_and_wopi_drawio.svg" >}}
+
 ## Server Deployment
 
 ### Requirements
diff --git a/go.mod b/go.mod
index 9fd29de3c4b..72afa1f60d2 100644
--- a/go.mod
+++ b/go.mod
@@ -67,7 +67,7 @@ require (
 	github.com/onsi/gomega v1.29.0
 	github.com/open-policy-agent/opa v0.51.0
 	github.com/orcaman/concurrent-map v1.0.0
-	github.com/owncloud/libre-graph-api-go v1.0.5-0.20231107135330-011e9d4c45e3
+	github.com/owncloud/libre-graph-api-go v1.0.5-0.20231113143725-09bf34dc9afb
 	github.com/pkg/errors v0.9.1
 	github.com/pkg/xattr v0.4.9
 	github.com/prometheus/client_golang v1.17.0
diff --git a/go.sum b/go.sum
index 791546b027e..9663d29f787 100644
--- a/go.sum
+++ b/go.sum
@@ -1774,8 +1774,8 @@ github.com/oracle/oci-go-sdk v24.3.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35uk
 github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY=
 github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI=
 github.com/ovh/go-ovh v1.1.0/go.mod h1:AxitLZ5HBRPyUd+Zl60Ajaag+rNTdVXWIkzfrVuTXWA=
-github.com/owncloud/libre-graph-api-go v1.0.5-0.20231107135330-011e9d4c45e3 h1:eUE3kNgr8PwcXeUKFkuEuz1+4hfCCmq+rKYQzk0OxtY=
-github.com/owncloud/libre-graph-api-go v1.0.5-0.20231107135330-011e9d4c45e3/go.mod h1:v2aAl5IwEI8t+GmcWvBd+bvJMYp9Vf1hekLuRf0UnEs=
+github.com/owncloud/libre-graph-api-go v1.0.5-0.20231113143725-09bf34dc9afb h1:KFnmkGvHY+6k6IZ9I1w5Ia24VbALYms+Y6W7LrsUbsE=
+github.com/owncloud/libre-graph-api-go v1.0.5-0.20231113143725-09bf34dc9afb/go.mod h1:v2aAl5IwEI8t+GmcWvBd+bvJMYp9Vf1hekLuRf0UnEs=
 github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw=
 github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
diff --git a/services/graph/mocks/value_service.go b/services/graph/mocks/value_service.go
new file mode 100644
index 00000000000..1872da1de14
--- /dev/null
+++ b/services/graph/mocks/value_service.go
@@ -0,0 +1,164 @@
+// Code generated by mockery v0.0.0-dev. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	client "go-micro.dev/v4/client"
+
+	mock "github.com/stretchr/testify/mock"
+
+	v0 "github.com/owncloud/ocis/v2/protogen/gen/ocis/services/settings/v0"
+)
+
+// ValueService is an autogenerated mock type for the ValueService type
+type ValueService struct {
+	mock.Mock
+}
+
+// GetValue provides a mock function with given fields: ctx, in, opts
+func (_m *ValueService) GetValue(ctx context.Context, in *v0.GetValueRequest, opts ...client.CallOption) (*v0.GetValueResponse, error) {
+	_va := make([]interface{}, len(opts))
+	for _i := range opts {
+		_va[_i] = opts[_i]
+	}
+	var _ca []interface{}
+	_ca = append(_ca, ctx, in)
+	_ca = append(_ca, _va...)
+	ret := _m.Called(_ca...)
+
+	var r0 *v0.GetValueResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *v0.GetValueRequest, ...client.CallOption) (*v0.GetValueResponse, error)); ok {
+		return rf(ctx, in, opts...)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *v0.GetValueRequest, ...client.CallOption) *v0.GetValueResponse); ok {
+		r0 = rf(ctx, in, opts...)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*v0.GetValueResponse)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *v0.GetValueRequest, ...client.CallOption) error); ok {
+		r1 = rf(ctx, in, opts...)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetValueByUniqueIdentifiers provides a mock function with given fields: ctx, in, opts
+func (_m *ValueService) GetValueByUniqueIdentifiers(ctx context.Context, in *v0.GetValueByUniqueIdentifiersRequest, opts ...client.CallOption) (*v0.GetValueResponse, error) {
+	_va := make([]interface{}, len(opts))
+	for _i := range opts {
+		_va[_i] = opts[_i]
+	}
+	var _ca []interface{}
+	_ca = append(_ca, ctx, in)
+	_ca = append(_ca, _va...)
+	ret := _m.Called(_ca...)
+
+	var r0 *v0.GetValueResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *v0.GetValueByUniqueIdentifiersRequest, ...client.CallOption) (*v0.GetValueResponse, error)); ok {
+		return rf(ctx, in, opts...)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *v0.GetValueByUniqueIdentifiersRequest, ...client.CallOption) *v0.GetValueResponse); ok {
+		r0 = rf(ctx, in, opts...)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*v0.GetValueResponse)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *v0.GetValueByUniqueIdentifiersRequest, ...client.CallOption) error); ok {
+		r1 = rf(ctx, in, opts...)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// ListValues provides a mock function with given fields: ctx, in, opts
+func (_m *ValueService) ListValues(ctx context.Context, in *v0.ListValuesRequest, opts ...client.CallOption) (*v0.ListValuesResponse, error) {
+	_va := make([]interface{}, len(opts))
+	for _i := range opts {
+		_va[_i] = opts[_i]
+	}
+	var _ca []interface{}
+	_ca = append(_ca, ctx, in)
+	_ca = append(_ca, _va...)
+	ret := _m.Called(_ca...)
+
+	var r0 *v0.ListValuesResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *v0.ListValuesRequest, ...client.CallOption) (*v0.ListValuesResponse, error)); ok {
+		return rf(ctx, in, opts...)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *v0.ListValuesRequest, ...client.CallOption) *v0.ListValuesResponse); ok {
+		r0 = rf(ctx, in, opts...)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*v0.ListValuesResponse)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *v0.ListValuesRequest, ...client.CallOption) error); ok {
+		r1 = rf(ctx, in, opts...)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// SaveValue provides a mock function with given fields: ctx, in, opts
+func (_m *ValueService) SaveValue(ctx context.Context, in *v0.SaveValueRequest, opts ...client.CallOption) (*v0.SaveValueResponse, error) {
+	_va := make([]interface{}, len(opts))
+	for _i := range opts {
+		_va[_i] = opts[_i]
+	}
+	var _ca []interface{}
+	_ca = append(_ca, ctx, in)
+	_ca = append(_ca, _va...)
+	ret := _m.Called(_ca...)
+
+	var r0 *v0.SaveValueResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *v0.SaveValueRequest, ...client.CallOption) (*v0.SaveValueResponse, error)); ok {
+		return rf(ctx, in, opts...)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *v0.SaveValueRequest, ...client.CallOption) *v0.SaveValueResponse); ok {
+		r0 = rf(ctx, in, opts...)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*v0.SaveValueResponse)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *v0.SaveValueRequest, ...client.CallOption) error); ok {
+		r1 = rf(ctx, in, opts...)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// NewValueService creates a new instance of ValueService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewValueService(t interface {
+	mock.TestingT
+	Cleanup(func())
+}) *ValueService {
+	mock := &ValueService{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/services/graph/pkg/server/http/server.go b/services/graph/pkg/server/http/server.go
index 027599665fc..113ffac6002 100644
--- a/services/graph/pkg/server/http/server.go
+++ b/services/graph/pkg/server/http/server.go
@@ -83,6 +83,7 @@ func Server(opts ...Option) (http.Service, error) {
 	// how do we secure the api?
 	var requireAdminMiddleware func(stdhttp.Handler) stdhttp.Handler
 	var roleService svc.RoleService
+	var valueService settingssvc.ValueService
 	var gatewaySelector pool.Selectable[gateway.GatewayAPIClient]
 	grpcClient, err := grpc.NewClient(append(grpc.GetClientOptions(options.Config.GRPCClientTLS), grpc.WithTraceProvider(options.TraceProvider))...)
 	if err != nil {
@@ -95,6 +96,7 @@ func Server(opts ...Option) (http.Service, error) {
 				account.JWTSecret(options.Config.TokenManager.JWTSecret),
 			))
 		roleService = settingssvc.NewRoleService("com.owncloud.api.settings", grpcClient)
+		valueService = settingssvc.NewValueService("com.owncloud.api.settings", grpcClient)
 		gatewaySelector, err = pool.GatewaySelector(
 			options.Config.Reva.Address,
 			append(
@@ -133,6 +135,7 @@ func Server(opts ...Option) (http.Service, error) {
 		svc.Middleware(middlewares...),
 		svc.EventsPublisher(publisher),
 		svc.WithRoleService(roleService),
+		svc.WithValueService(valueService),
 		svc.WithRequireAdminMiddleware(requireAdminMiddleware),
 		svc.WithGatewaySelector(gatewaySelector),
 		svc.WithSearchService(searchsvc.NewSearchProviderService("com.owncloud.api.search", grpcClient)),
diff --git a/services/graph/pkg/service/v0/graph.go b/services/graph/pkg/service/v0/graph.go
index ffb174c6613..36e3c3b7b43 100644
--- a/services/graph/pkg/service/v0/graph.go
+++ b/services/graph/pkg/service/v0/graph.go
@@ -70,6 +70,7 @@ type Graph struct {
 	gatewaySelector          pool.Selectable[gateway.GatewayAPIClient]
 	roleService              RoleService
 	permissionsService       Permissions
+	valueService             settingssvc.ValueService
 	specialDriveItemsCache   *ttlcache.Cache[string, interface{}]
 	identityCache            identity.IdentityCache
 	eventsPublisher          events.Publisher
diff --git a/services/graph/pkg/service/v0/groups.go b/services/graph/pkg/service/v0/groups.go
index 423e1c5231f..dfd1424deb7 100644
--- a/services/graph/pkg/service/v0/groups.go
+++ b/services/graph/pkg/service/v0/groups.go
@@ -97,7 +97,7 @@ func (g Graph) PostGroup(w http.ResponseWriter, r *http.Request) {
 		}
 		g.publishEvent(r.Context(), e)
 	}
-	render.Status(r, http.StatusOK) // FIXME 201 should return 201 created
+	render.Status(r, http.StatusCreated)
 	render.JSON(w, r, grp)
 }
 
diff --git a/services/graph/pkg/service/v0/option.go b/services/graph/pkg/service/v0/option.go
index 9ed23fb4a12..f68633b48be 100644
--- a/services/graph/pkg/service/v0/option.go
+++ b/services/graph/pkg/service/v0/option.go
@@ -31,6 +31,7 @@ type Options struct {
 	IdentityEducationBackend identity.EducationBackend
 	RoleService              RoleService
 	PermissionService        Permissions
+	ValueService             settingssvc.ValueService
 	RoleManager              *roles.Manager
 	EventsPublisher          events.Publisher
 	SearchService            searchsvc.SearchProviderService
@@ -106,6 +107,13 @@ func WithRoleService(val RoleService) Option {
 	}
 }
 
+// WithValueService provides a function to set the ValueService option.
+func WithValueService(val settingssvc.ValueService) Option {
+	return func(o *Options) {
+		o.ValueService = val
+	}
+}
+
 // WithSearchService provides a function to set the SearchService option.
 func WithSearchService(val searchsvc.SearchProviderService) Option {
 	return func(o *Options) {
diff --git a/services/graph/pkg/service/v0/personaldata.go b/services/graph/pkg/service/v0/personaldata.go
index ac1098a30ef..f5df48f2b64 100644
--- a/services/graph/pkg/service/v0/personaldata.go
+++ b/services/graph/pkg/service/v0/personaldata.go
@@ -87,7 +87,7 @@ func (g Graph) ExportPersonalData(w http.ResponseWriter, r *http.Request) {
 	// go start gathering
 	go g.GatherPersonalData(u, ref, r.Header.Get(revactx.TokenHeader), marsh)
 
-	w.WriteHeader(http.StatusCreated)
+	w.WriteHeader(http.StatusAccepted)
 }
 
 // GatherPersonalData will all gather all personal data of the user and save it to a file in the users personal space
diff --git a/services/graph/pkg/service/v0/service.go b/services/graph/pkg/service/v0/service.go
index a02a25d62ca..3012bbd7298 100644
--- a/services/graph/pkg/service/v0/service.go
+++ b/services/graph/pkg/service/v0/service.go
@@ -146,6 +146,7 @@ func NewService(opts ...Option) (Graph, error) {
 		keycloakClient:           options.KeycloakClient,
 		historyClient:            options.EventHistoryClient,
 		traceProvider:            options.TraceProvider,
+		valueService:             options.ValueService,
 	}
 
 	if err := setIdentityBackends(options, &svc); err != nil {
@@ -212,9 +213,12 @@ func NewService(opts ...Option) (Graph, error) {
 			r.Route("/me", func(r chi.Router) {
 				r.Get("/", svc.GetMe)
 				r.Get("/drive", svc.GetUserDrive)
-				r.Get("/drives", svc.GetDrives)
+				r.Route("/drives", func(r chi.Router) {
+					r.Get("/", svc.GetDrives)
+				})
 				r.Get("/drive/root/children", svc.GetRootDriveChildren)
 				r.Post("/changePassword", svc.ChangeOwnPassword)
+				r.Patch("/", svc.PatchMe)
 			})
 			r.Route("/users", func(r chi.Router) {
 				r.With(requireAdmin).Get("/", svc.GetUsers)
diff --git a/services/graph/pkg/service/v0/users.go b/services/graph/pkg/service/v0/users.go
index 097e4fa654a..bf6025f7a60 100644
--- a/services/graph/pkg/service/v0/users.go
+++ b/services/graph/pkg/service/v0/users.go
@@ -4,6 +4,8 @@ import (
 	"context"
 	"errors"
 	"fmt"
+	"github.com/google/uuid"
+	"github.com/owncloud/ocis/v2/services/settings/pkg/store/defaults"
 	"net/http"
 	"net/url"
 	"reflect"
@@ -22,10 +24,12 @@ import (
 	"github.com/go-chi/chi/v5"
 	"github.com/go-chi/render"
 	libregraph "github.com/owncloud/libre-graph-api-go"
+	settingsmsg "github.com/owncloud/ocis/v2/protogen/gen/ocis/messages/settings/v0"
 	settings "github.com/owncloud/ocis/v2/protogen/gen/ocis/services/settings/v0"
+	settingssvc "github.com/owncloud/ocis/v2/protogen/gen/ocis/services/settings/v0"
 	"github.com/owncloud/ocis/v2/services/graph/pkg/identity"
 	"github.com/owncloud/ocis/v2/services/graph/pkg/service/v0/errorcode"
-	settingssvc "github.com/owncloud/ocis/v2/services/settings/pkg/service/v0"
+	ocissettingssvc "github.com/owncloud/ocis/v2/services/settings/pkg/service/v0"
 	"golang.org/x/exp/slices"
 )
 
@@ -85,6 +89,15 @@ func (g Graph) GetMe(w http.ResponseWriter, r *http.Request) {
 		}
 	}
 
+	preferedLanguage, _, err := getUserLanguage(r.Context(), g.valueService, me.GetId())
+	if err != nil {
+		logger.Error().Err(err).Msg("could not get user language")
+		errorcode.GeneralException.Render(w, r, http.StatusInternalServerError, "could not get user language")
+		return
+	}
+
+	me.PreferredLanguage = &preferedLanguage
+
 	render.Status(r, http.StatusOK)
 	render.JSON(w, r, me)
 }
@@ -319,10 +332,10 @@ func (g Graph) PostUser(w http.ResponseWriter, r *http.Request) {
 		// to all new users for now, as create Account request does not have any role field
 		if _, err = g.roleService.AssignRoleToUser(r.Context(), &settings.AssignRoleToUserRequest{
 			AccountUuid: *u.Id,
-			RoleId:      settingssvc.BundleUUIDRoleUser,
+			RoleId:      ocissettingssvc.BundleUUIDRoleUser,
 		}); err != nil {
 			// log as error, admin eventually needs to do something
-			logger.Error().Err(err).Str("id", *u.Id).Str("role", settingssvc.BundleUUIDRoleUser).Msg("could not create user: role assignment failed")
+			logger.Error().Err(err).Str("id", *u.Id).Str("role", ocissettingssvc.BundleUUIDRoleUser).Msg("could not create user: role assignment failed")
 			errorcode.GeneralException.Render(w, r, http.StatusInternalServerError, "role assignment failed")
 			return
 		}
@@ -334,7 +347,7 @@ func (g Graph) PostUser(w http.ResponseWriter, r *http.Request) {
 	}
 	g.publishEvent(r.Context(), e)
 
-	render.Status(r, http.StatusOK) // FIXME 201 should return 201 created
+	render.Status(r, http.StatusCreated)
 	render.JSON(w, r, u)
 }
 
@@ -479,6 +492,23 @@ func (g Graph) GetUser(w http.ResponseWriter, r *http.Request) {
 	render.JSON(w, r, user)
 }
 
+// getUserLanguage returns the language of the user in the context.
+func getUserLanguage(ctx context.Context, valueService settingssvc.ValueService, userID string) (string, string, error) {
+	gvr, err := valueService.GetValueByUniqueIdentifiers(ctx, &settingssvc.GetValueByUniqueIdentifiersRequest{
+		AccountUuid: userID,
+		SettingId:   defaults.SettingUUIDProfileLanguage,
+	})
+	if err != nil {
+		return "", "", err
+	}
+
+	langVal := gvr.GetValue().GetValue().GetListValue().GetValues()
+	if len(langVal) > 0 && langVal[0] != nil {
+		return langVal[0].GetStringValue(), gvr.GetValue().GetValue().GetId(), nil
+	}
+	return "", "", errors.New("no language value found")
+}
+
 // DeleteUser implements the Service interface.
 func (g Graph) DeleteUser(w http.ResponseWriter, r *http.Request) {
 	logger := g.logger.SubloggerWithRequestID(r.Context())
@@ -599,11 +629,41 @@ func (g Graph) DeleteUser(w http.ResponseWriter, r *http.Request) {
 	render.NoContent(w, r)
 }
 
+// PatchMe implements the Service Interface. Updates the specified attributes of the current user
+func (g Graph) PatchMe(w http.ResponseWriter, r *http.Request) {
+	logger := g.logger.SubloggerWithRequestID(r.Context())
+	logger.Debug().Msg("calling patch me")
+	userID := revactx.ContextMustGetUser(r.Context()).GetId().GetOpaqueId()
+	if userID == "" {
+		logger.Debug().Msg("could not update user: missing user id")
+		errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest, "missing user id")
+		return
+	}
+	changes := libregraph.NewUser()
+	err := StrictJSONUnmarshal(r.Body, changes)
+	if err != nil {
+		logger.Debug().Err(err).Interface("body", r.Body).Msg("could not update user: invalid request body")
+		errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest,
+			fmt.Sprintf("invalid request body: %s", err.Error()))
+		return
+	}
+	if _, ok := changes.GetDisplayNameOk(); ok {
+		logger.Info().Interface("user", changes).Msg("could not update user: user is not allowed to change own displayname")
+		errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest, "user is not allowed to change own displayname")
+		return
+	}
+	if _, ok := changes.GetMailOk(); ok {
+		logger.Info().Interface("user", changes).Msg("could not update user: user is not allowed to change own mail")
+		errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest, "user is not allowed to change own mail")
+		return
+	}
+	g.patchUser(w, r, userID, changes)
+}
+
 // PatchUser implements the Service Interface. Updates the specified attributes of an
 // ExistingUser
 func (g Graph) PatchUser(w http.ResponseWriter, r *http.Request) {
 	logger := g.logger.SubloggerWithRequestID(r.Context())
-	logger.Debug().Msg("calling patch user")
 	nameOrID := chi.URLParam(r, "userID")
 	nameOrID, err := url.PathUnescape(nameOrID)
 	if err != nil {
@@ -611,6 +671,26 @@ func (g Graph) PatchUser(w http.ResponseWriter, r *http.Request) {
 		errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest, "unescaping user id failed")
 		return
 	}
+	changes := libregraph.NewUser()
+	err = StrictJSONUnmarshal(r.Body, changes)
+	if err != nil {
+		logger.Debug().Err(err).Interface("body", r.Body).Msg("could not update user: invalid request body")
+		errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest,
+			fmt.Sprintf("invalid request body: %s", err.Error()))
+		return
+	}
+	if _, ok := changes.GetPreferredLanguageOk(); ok {
+		logger.Info().Interface("user", changes).Msg("could not update user: user is not allowed to change other users language")
+		errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest, "user is not allowed to change other users language")
+		return
+	}
+
+	g.patchUser(w, r, nameOrID, changes)
+}
+
+func (g Graph) patchUser(w http.ResponseWriter, r *http.Request, nameOrID string, changes *libregraph.User) {
+	logger := g.logger.SubloggerWithRequestID(r.Context())
+	logger.Debug().Msg("calling patch user")
 
 	sanitizedPath := strings.TrimPrefix(r.URL.Path, "/graph/v1.0/")
 
@@ -633,14 +713,6 @@ func (g Graph) PatchUser(w http.ResponseWriter, r *http.Request) {
 		errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest, "missing user id")
 		return
 	}
-	changes := libregraph.NewUser()
-	err = StrictJSONUnmarshal(r.Body, changes)
-	if err != nil {
-		logger.Debug().Err(err).Interface("body", r.Body).Msg("could not update user: invalid request body")
-		errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest,
-			fmt.Sprintf("invalid request body: %s", err.Error()))
-		return
-	}
 
 	if reflect.ValueOf(*changes).IsZero() {
 		logger.Debug().Interface("body", r.Body).Msg("ignoring empty request body")
@@ -657,6 +729,47 @@ func (g Graph) PatchUser(w http.ResponseWriter, r *http.Request) {
 		}
 	}
 
+	preferredLanguage, ok := changes.GetPreferredLanguageOk()
+	if ok {
+		_, vID, err := getUserLanguage(r.Context(), g.valueService, oldUserValues.GetId())
+		if err != nil {
+			logger.Error().Err(err).Msg("could not get user language")
+			tvID, err := uuid.NewUUID()
+			if err != nil {
+				logger.Error().Err(err).Msg("could not create user: error generating uuid")
+				errorcode.GeneralException.Render(w, r, http.StatusInternalServerError, "error generating uuid")
+				return
+			}
+			vID = tvID.String()
+		}
+		_, err = g.valueService.SaveValue(r.Context(), &settings.SaveValueRequest{
+			Value: &settingsmsg.Value{
+				Id:          vID,
+				BundleId:    defaults.BundleUUIDProfile,
+				SettingId:   defaults.SettingUUIDProfileLanguage,
+				AccountUuid: oldUserValues.GetId(),
+				Resource: &settingsmsg.Resource{
+					Type: settingsmsg.Resource_TYPE_USER,
+				},
+				Value: &settingsmsg.Value_ListValue{
+					ListValue: &settingsmsg.ListValue{Values: []*settingsmsg.ListOptionValue{
+						{
+							Option: &settingsmsg.ListOptionValue_StringValue{
+								StringValue: *preferredLanguage,
+							},
+						},
+					}},
+				},
+			},
+		})
+		if err != nil {
+			logger.Error().Err(err).Msg("could not update user: error saving language setting")
+			errorcode.GeneralException.Render(w, r, http.StatusInternalServerError, "error saving language setting")
+			return
+		}
+
+	}
+
 	var features []events.UserFeature
 	if mail, ok := changes.GetMailOk(); ok {
 		if !isValidEmail(*mail) {
@@ -715,6 +828,7 @@ func (g Graph) PatchUser(w http.ResponseWriter, r *http.Request) {
 		errorcode.RenderError(w, r, err)
 		return
 	}
+	u.PreferredLanguage = preferredLanguage
 
 	e := events.UserFeatureChanged{
 		UserID:    nameOrID,
diff --git a/services/settings/pkg/service/v0/service.go b/services/settings/pkg/service/v0/service.go
index 48897b1a09e..9513be9d6e8 100644
--- a/services/settings/pkg/service/v0/service.go
+++ b/services/settings/pkg/service/v0/service.go
@@ -274,7 +274,6 @@ func (g Service) RemoveSettingFromBundle(ctx context.Context, req *settingssvc.R
 // SaveValue implements the ValueServiceHandler interface
 func (g Service) SaveValue(ctx context.Context, req *settingssvc.SaveValueRequest, res *settingssvc.SaveValueResponse) error {
 	req.Value.AccountUuid = getValidatedAccountUUID(ctx, req.Value.AccountUuid)
-
 	if !g.isCurrentUser(ctx, req.Value.AccountUuid) {
 		return merrors.Forbidden(g.id, "can't save value for another user")
 	}
diff --git a/vendor/github.com/owncloud/libre-graph-api-go/README.md b/vendor/github.com/owncloud/libre-graph-api-go/README.md
index 9e4810624b4..00f539bd35f 100644
--- a/vendor/github.com/owncloud/libre-graph-api-go/README.md
+++ b/vendor/github.com/owncloud/libre-graph-api-go/README.md
@@ -134,6 +134,7 @@ Class | Method | HTTP request | Description
 *MeDriveRootChildrenApi* | [**HomeGetChildren**](docs/MeDriveRootChildrenApi.md#homegetchildren) | **Get** /v1.0/me/drive/root/children | Get children from drive
 *MeDrivesApi* | [**ListMyDrives**](docs/MeDrivesApi.md#listmydrives) | **Get** /v1.0/me/drives | Get all drives where the current user is a regular member of
 *MeUserApi* | [**GetOwnUser**](docs/MeUserApi.md#getownuser) | **Get** /v1.0/me | Get current user
+*MeUserApi* | [**UpdateOwnUser**](docs/MeUserApi.md#updateownuser) | **Patch** /v1.0/me | Update the current user
 *RoleManagementApi* | [**GetPermissionRoleDefinition**](docs/RoleManagementApi.md#getpermissionroledefinition) | **Get** /v1beta1/roleManagement/permissions/roleDefinitions/{role-id} | Get unifiedRoleDefinition
 *RoleManagementApi* | [**ListPermissionRoleDefinitions**](docs/RoleManagementApi.md#listpermissionroledefinitions) | **Get** /v1beta1/roleManagement/permissions/roleDefinitions | List roleDefinitions
 *TagsApi* | [**AssignTags**](docs/TagsApi.md#assigntags) | **Put** /v1.0/extensions/org.libregraph/tags | Assign tags to a resource
diff --git a/vendor/github.com/owncloud/libre-graph-api-go/api_me_user.go b/vendor/github.com/owncloud/libre-graph-api-go/api_me_user.go
index 3d9820dfaf9..5613c7fc76b 100644
--- a/vendor/github.com/owncloud/libre-graph-api-go/api_me_user.go
+++ b/vendor/github.com/owncloud/libre-graph-api-go/api_me_user.go
@@ -135,3 +135,117 @@ func (a *MeUserApiService) GetOwnUserExecute(r ApiGetOwnUserRequest) (*User, *ht
 
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
+
+type ApiUpdateOwnUserRequest struct {
+	ctx        context.Context
+	ApiService *MeUserApiService
+	user       *User
+}
+
+// New user values
+func (r ApiUpdateOwnUserRequest) User(user User) ApiUpdateOwnUserRequest {
+	r.user = &user
+	return r
+}
+
+func (r ApiUpdateOwnUserRequest) Execute() (*User, *http.Response, error) {
+	return r.ApiService.UpdateOwnUserExecute(r)
+}
+
+/*
+UpdateOwnUser Update the current user
+
+ @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ @return ApiUpdateOwnUserRequest
+*/
+func (a *MeUserApiService) UpdateOwnUser(ctx context.Context) ApiUpdateOwnUserRequest {
+	return ApiUpdateOwnUserRequest{
+		ApiService: a,
+		ctx:        ctx,
+	}
+}
+
+// Execute executes the request
+//  @return User
+func (a *MeUserApiService) UpdateOwnUserExecute(r ApiUpdateOwnUserRequest) (*User, *http.Response, error) {
+	var (
+		localVarHTTPMethod  = http.MethodPatch
+		localVarPostBody    interface{}
+		formFiles           []formFile
+		localVarReturnValue *User
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MeUserApiService.UpdateOwnUser")
+	if err != nil {
+		return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/v1.0/me"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{"application/json"}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	// body params
+	localVarPostBody = r.user
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := io.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := &GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		var v OdataError
+		err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+		if err != nil {
+			newErr.error = err.Error()
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		newErr.error = formatErrorMessage(localVarHTTPResponse.Status, &v)
+		newErr.model = v
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := &GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
diff --git a/vendor/github.com/owncloud/libre-graph-api-go/model_user.go b/vendor/github.com/owncloud/libre-graph-api-go/model_user.go
index b3170f2ea33..4a6262a73fe 100644
--- a/vendor/github.com/owncloud/libre-graph-api-go/model_user.go
+++ b/vendor/github.com/owncloud/libre-graph-api-go/model_user.go
@@ -45,6 +45,8 @@ type User struct {
 	GivenName *string `json:"givenName,omitempty"`
 	// The user`s type. This can be either \"Member\" for regular user, or \"Guest\" for guest users.
 	UserType *string `json:"userType,omitempty"`
+	// Represents the users language setting, ISO-639-1 Code
+	PreferredLanguage *string `json:"preferredLanguage,omitempty"`
 }
 
 // NewUser instantiates a new User object
@@ -512,6 +514,38 @@ func (o *User) SetUserType(v string) {
 	o.UserType = &v
 }
 
+// GetPreferredLanguage returns the PreferredLanguage field value if set, zero value otherwise.
+func (o *User) GetPreferredLanguage() string {
+	if o == nil || IsNil(o.PreferredLanguage) {
+		var ret string
+		return ret
+	}
+	return *o.PreferredLanguage
+}
+
+// GetPreferredLanguageOk returns a tuple with the PreferredLanguage field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *User) GetPreferredLanguageOk() (*string, bool) {
+	if o == nil || IsNil(o.PreferredLanguage) {
+		return nil, false
+	}
+	return o.PreferredLanguage, true
+}
+
+// HasPreferredLanguage returns a boolean if a field has been set.
+func (o *User) HasPreferredLanguage() bool {
+	if o != nil && !IsNil(o.PreferredLanguage) {
+		return true
+	}
+
+	return false
+}
+
+// SetPreferredLanguage gets a reference to the given string and assigns it to the PreferredLanguage field.
+func (o *User) SetPreferredLanguage(v string) {
+	o.PreferredLanguage = &v
+}
+
 func (o User) MarshalJSON() ([]byte, error) {
 	toSerialize, err := o.ToMap()
 	if err != nil {
@@ -564,6 +598,9 @@ func (o User) ToMap() (map[string]interface{}, error) {
 	if !IsNil(o.UserType) {
 		toSerialize["userType"] = o.UserType
 	}
+	if !IsNil(o.PreferredLanguage) {
+		toSerialize["preferredLanguage"] = o.PreferredLanguage
+	}
 	return toSerialize, nil
 }
 
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 9775a1059cb..b7246cc7305 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1555,7 +1555,7 @@ github.com/opentracing/opentracing-go/log
 # github.com/orcaman/concurrent-map v1.0.0
 ## explicit
 github.com/orcaman/concurrent-map
-# github.com/owncloud/libre-graph-api-go v1.0.5-0.20231107135330-011e9d4c45e3
+# github.com/owncloud/libre-graph-api-go v1.0.5-0.20231113143725-09bf34dc9afb
 ## explicit; go 1.18
 github.com/owncloud/libre-graph-api-go
 # github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c


Test patch:
diff --git a/services/graph/pkg/service/v0/groups_test.go b/services/graph/pkg/service/v0/groups_test.go
index 7a492d110a6..e0f2c846340 100644
--- a/services/graph/pkg/service/v0/groups_test.go
+++ b/services/graph/pkg/service/v0/groups_test.go
@@ -259,7 +259,7 @@ var _ = Describe("Groups", func() {
 
 			svc.PostGroup(rr, r)
 
-			Expect(rr.Code).To(Equal(http.StatusOK))
+			Expect(rr.Code).To(Equal(http.StatusCreated))
 		})
 	})
 	Describe("PatchGroup", func() {
diff --git a/services/graph/pkg/service/v0/users_test.go b/services/graph/pkg/service/v0/users_test.go
index 8e67a5152d2..c5dfa0fe5ef 100644
--- a/services/graph/pkg/service/v0/users_test.go
+++ b/services/graph/pkg/service/v0/users_test.go
@@ -13,14 +13,18 @@ import (
 	userv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
 	provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1"
 	typesv1beta1 "github.com/cs3org/go-cs3apis/cs3/types/v1beta1"
-	revactx "github.com/cs3org/reva/v2/pkg/ctx"
-	"github.com/cs3org/reva/v2/pkg/rgrpc/status"
-	"github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool"
-	cs3mocks "github.com/cs3org/reva/v2/tests/cs3mocks/mocks"
 	"github.com/go-chi/chi/v5"
 	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	libregraph "github.com/owncloud/libre-graph-api-go"
+	"github.com/stretchr/testify/mock"
+	"go-micro.dev/v4/client"
+	"google.golang.org/grpc"
+
+	revactx "github.com/cs3org/reva/v2/pkg/ctx"
+	"github.com/cs3org/reva/v2/pkg/rgrpc/status"
+	"github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool"
+	cs3mocks "github.com/cs3org/reva/v2/tests/cs3mocks/mocks"
 	"github.com/owncloud/ocis/v2/ocis-pkg/shared"
 	settingsmsg "github.com/owncloud/ocis/v2/protogen/gen/ocis/messages/settings/v0"
 	settings "github.com/owncloud/ocis/v2/protogen/gen/ocis/services/settings/v0"
@@ -29,9 +33,6 @@ import (
 	"github.com/owncloud/ocis/v2/services/graph/pkg/config/defaults"
 	identitymocks "github.com/owncloud/ocis/v2/services/graph/pkg/identity/mocks"
 	service "github.com/owncloud/ocis/v2/services/graph/pkg/service/v0"
-	"github.com/stretchr/testify/mock"
-	"go-micro.dev/v4/client"
-	"google.golang.org/grpc"
 )
 
 type userList struct {
@@ -47,6 +48,7 @@ var _ = Describe("Users", func() {
 		gatewaySelector pool.Selectable[gateway.GatewayAPIClient]
 		eventsPublisher mocks.Publisher
 		roleService     *mocks.RoleService
+		valueService    *mocks.ValueService
 		identityBackend *identitymocks.Backend
 
 		rr *httptest.ResponseRecorder
@@ -73,6 +75,7 @@ var _ = Describe("Users", func() {
 
 		identityBackend = &identitymocks.Backend{}
 		roleService = &mocks.RoleService{}
+		valueService = &mocks.ValueService{}
 
 		rr = httptest.NewRecorder()
 		ctx = context.Background()
@@ -90,6 +93,7 @@ var _ = Describe("Users", func() {
 			service.EventsPublisher(&eventsPublisher),
 			service.WithIdentityBackend(identityBackend),
 			service.WithRoleService(roleService),
+			service.WithValueService(valueService),
 		)
 	})
 
@@ -102,6 +106,25 @@ var _ = Describe("Users", func() {
 		})
 
 		It("gets the information", func() {
+			valueService.On("GetValueByUniqueIdentifiers", mock.Anything, mock.Anything, mock.Anything).
+				Return(&settings.GetValueResponse{
+					Value: &settingsmsg.ValueWithIdentifier{
+						Value: &settingsmsg.Value{
+							Value: &settingsmsg.Value_ListValue{
+								ListValue: &settingsmsg.ListValue{
+									Values: []*settingsmsg.ListOptionValue{
+										{
+											Option: &settingsmsg.ListOptionValue_StringValue{
+												StringValue: "it",
+											},
+										},
+									},
+								},
+							},
+						},
+					},
+				}, nil)
+
 			r := httptest.NewRequest(http.MethodGet, "/graph/v1.0/me", nil)
 			r = r.WithContext(revactx.ContextSetUser(ctx, currentUser))
 			svc.GetMe(rr, r)
@@ -117,7 +140,24 @@ var _ = Describe("Users", func() {
 				},
 			}
 			identityBackend.On("GetUser", mock.Anything, mock.Anything, mock.Anything).Return(user, nil)
-
+			valueService.On("GetValueByUniqueIdentifiers", mock.Anything, mock.Anything, mock.Anything).
+				Return(&settings.GetValueResponse{
+					Value: &settingsmsg.ValueWithIdentifier{
+						Value: &settingsmsg.Value{
+							Value: &settingsmsg.Value_ListValue{
+								ListValue: &settingsmsg.ListValue{
+									Values: []*settingsmsg.ListOptionValue{
+										{
+											Option: &settingsmsg.ListOptionValue_StringValue{
+												StringValue: "it",
+											},
+										},
+									},
+								},
+							},
+						},
+					},
+				}, nil)
 			r := httptest.NewRequest(http.MethodGet, "/graph/v1.0/me?$expand=memberOf", nil)
 			r = r.WithContext(revactx.ContextSetUser(ctx, currentUser))
 			svc.GetMe(rr, r)
@@ -145,7 +185,24 @@ var _ = Describe("Users", func() {
 				},
 			}
 			roleService.On("ListRoleAssignments", mock.Anything, mock.Anything, mock.Anything).Return(&settings.ListRoleAssignmentsResponse{Assignments: assignments}, nil)
-
+			valueService.On("GetValueByUniqueIdentifiers", mock.Anything, mock.Anything, mock.Anything).
+				Return(&settings.GetValueResponse{
+					Value: &settingsmsg.ValueWithIdentifier{
+						Value: &settingsmsg.Value{
+							Value: &settingsmsg.Value_ListValue{
+								ListValue: &settingsmsg.ListValue{
+									Values: []*settingsmsg.ListOptionValue{
+										{
+											Option: &settingsmsg.ListOptionValue_StringValue{
+												StringValue: "it",
+											},
+										},
+									},
+								},
+							},
+						},
+					},
+				}, nil)
 			r := httptest.NewRequest(http.MethodGet, "/graph/v1.0/me?$expand=appRoleAssignments", nil)
 			r = r.WithContext(revactx.ContextSetUser(ctx, currentUser))
 			svc.GetMe(rr, r)
@@ -413,6 +470,24 @@ var _ = Describe("Users", func() {
 			user.SetId("user1")
 
 			identityBackend.On("GetUser", mock.Anything, mock.Anything, mock.Anything).Return(user, nil)
+			valueService.On("GetValueByUniqueIdentifiers", mock.Anything, mock.Anything, mock.Anything).
+				Return(&settings.GetValueResponse{
+					Value: &settingsmsg.ValueWithIdentifier{
+						Value: &settingsmsg.Value{
+							Value: &settingsmsg.Value_ListValue{
+								ListValue: &settingsmsg.ListValue{
+									Values: []*settingsmsg.ListOptionValue{
+										{
+											Option: &settingsmsg.ListOptionValue_StringValue{
+												StringValue: "it",
+											},
+										},
+									},
+								},
+							},
+						},
+					},
+				}, nil)
 			r := httptest.NewRequest(http.MethodGet, "/graph/v1.0/users", nil)
 			rctx := chi.NewRouteContext()
 			rctx.URLParams.Add("userID", *user.Id)
@@ -455,7 +530,24 @@ var _ = Describe("Users", func() {
 					},
 				},
 			}, nil)
-
+			valueService.On("GetValueByUniqueIdentifiers", mock.Anything, mock.Anything, mock.Anything).
+				Return(&settings.GetValueResponse{
+					Value: &settingsmsg.ValueWithIdentifier{
+						Value: &settingsmsg.Value{
+							Value: &settingsmsg.Value_ListValue{
+								ListValue: &settingsmsg.ListValue{
+									Values: []*settingsmsg.ListOptionValue{
+										{
+											Option: &settingsmsg.ListOptionValue_StringValue{
+												StringValue: "it",
+											},
+										},
+									},
+								},
+							},
+						},
+					},
+				}, nil)
 			r := httptest.NewRequest(http.MethodGet, "/graph/v1.0/users?$expand=drive", nil)
 			rctx := chi.NewRouteContext()
 			rctx.URLParams.Add("userID", *user.Id)
@@ -490,7 +582,24 @@ var _ = Describe("Users", func() {
 					},
 				},
 			}, nil)
-
+			valueService.On("GetValueByUniqueIdentifiers", mock.Anything, mock.Anything, mock.Anything).
+				Return(&settings.GetValueResponse{
+					Value: &settingsmsg.ValueWithIdentifier{
+						Value: &settingsmsg.Value{
+							Value: &settingsmsg.Value_ListValue{
+								ListValue: &settingsmsg.ListValue{
+									Values: []*settingsmsg.ListOptionValue{
+										{
+											Option: &settingsmsg.ListOptionValue_StringValue{
+												StringValue: "it",
+											},
+										},
+									},
+								},
+							},
+						},
+					},
+				}, nil)
 			r := httptest.NewRequest(http.MethodGet, "/graph/v1.0/users?$expand=drives", nil)
 			rctx := chi.NewRouteContext()
 			rctx.URLParams.Add("userID", *user.Id)
@@ -521,7 +630,24 @@ var _ = Describe("Users", func() {
 				},
 			}
 			roleService.On("ListRoleAssignments", mock.Anything, mock.Anything, mock.Anything).Return(&settings.ListRoleAssignmentsResponse{Assignments: assignments}, nil)
-
+			valueService.On("GetValueByUniqueIdentifiers", mock.Anything, mock.Anything, mock.Anything).
+				Return(&settings.GetValueResponse{
+					Value: &settingsmsg.ValueWithIdentifier{
+						Value: &settingsmsg.Value{
+							Value: &settingsmsg.Value_ListValue{
+								ListValue: &settingsmsg.ListValue{
+									Values: []*settingsmsg.ListOptionValue{
+										{
+											Option: &settingsmsg.ListOptionValue_StringValue{
+												StringValue: "it",
+											},
+										},
+									},
+								},
+							},
+						},
+					},
+				}, nil)
 			r := httptest.NewRequest(http.MethodGet, "/graph/v1.0/users/user1?$expand=appRoleAssignments", nil)
 			rctx := chi.NewRouteContext()
 			rctx.URLParams.Add("userID", user.GetId())
@@ -617,7 +743,7 @@ var _ = Describe("Users", func() {
 			r = r.WithContext(revactx.ContextSetUser(ctx, currentUser))
 			svc.PostUser(rr, r)
 
-			Expect(rr.Code).To(Equal(http.StatusOK))
+			Expect(rr.Code).To(Equal(http.StatusCreated))
 			data, err := io.ReadAll(rr.Body)
 			Expect(err).ToNot(HaveOccurred())
 
@@ -642,7 +768,7 @@ var _ = Describe("Users", func() {
 			r = r.WithContext(revactx.ContextSetUser(ctx, currentUser))
 			svc.PostUser(rr, r)
 
-			Expect(rr.Code).To(Equal(http.StatusOK))
+			Expect(rr.Code).To(Equal(http.StatusCreated))
 			data, err := io.ReadAll(rr.Body)
 			Expect(err).ToNot(HaveOccurred())
 
@@ -667,7 +793,7 @@ var _ = Describe("Users", func() {
 			r = r.WithContext(revactx.ContextSetUser(ctx, currentUser))
 			svc.PostUser(rr, r)
 
-			Expect(rr.Code).To(Equal(http.StatusOK))
+			Expect(rr.Code).To(Equal(http.StatusCreated))
 			data, err := io.ReadAll(rr.Body)
 			Expect(err).ToNot(HaveOccurred())
 
@@ -728,7 +854,7 @@ var _ = Describe("Users", func() {
 				r = r.WithContext(revactx.ContextSetUser(ctx, currentUser))
 				newSvc("none").PostUser(rr, r)
 
-				Expect(rr.Code).To(Equal(http.StatusOK))
+				Expect(rr.Code).To(Equal(http.StatusCreated))
 			})
 		})
 
diff --git a/tests/acceptance/features/apiGraph/createGroup.feature b/tests/acceptance/features/apiGraph/createGroup.feature
index 40195f037fa..9720482a788 100644
--- a/tests/acceptance/features/apiGraph/createGroup.feature
+++ b/tests/acceptance/features/apiGraph/createGroup.feature
@@ -10,7 +10,7 @@ Feature: create group
 
   Scenario Outline: admin user creates a group
     When user "Alice" creates a group "<groupname>" using the Graph API
-    Then the HTTP status code should be "200"
+    Then the HTTP status code should be "201"
     And group "<groupname>" should exist
     Examples:
     | groupname       |
diff --git a/tests/acceptance/features/apiGraph/createUser.feature b/tests/acceptance/features/apiGraph/createUser.feature
index 23b9529c4f4..b567492673d 100644
--- a/tests/acceptance/features/apiGraph/createUser.feature
+++ b/tests/acceptance/features/apiGraph/createUser.feature
@@ -22,18 +22,18 @@ Feature: create user
     And user "<userName>" <shouldOrNot> exist
     Examples:
       | userName                     | displayName                             | email                   | password                     | code | enable | shouldOrNot |
-      | SameDisplayName              | Alice Hansen                            | new@example.org         | containsCharacters(*:!;_+-&) | 200  | true   | should      |
-      | withoutPassSameEmail         | without pass                            | alice@example.org       |                              | 200  | true   | should      |
-      | name                         | pass with space                         | example@example.org     | my pass                      | 200  | true   | should      |
-      | user1                        | user names must not start with a number | example@example.org     | my pass                      | 200  | true   | should      |
+      | SameDisplayName              | Alice Hansen                            | new@example.org         | containsCharacters(*:!;_+-&) | 201  | true   | should      |
+      | withoutPassSameEmail         | without pass                            | alice@example.org       |                              | 201  | true   | should      |
+      | name                         | pass with space                         | example@example.org     | my pass                      | 201  | true   | should      |
+      | user1                        | user names must not start with a number | example@example.org     | my pass                      | 201  | true   | should      |
       | nameWithCharacters(*:!;_+-&) | user                                    | new@example.org         | 123                          | 400  | true   | should not  |
       | name with space              | name with space                         | example@example.org     | 123                          | 400  | true   | should not  |
-      | createDisabledUser           | disabled user                           | example@example.org     | 123                          | 200  | false  | should      |
-      | nameWithNumbers0123456       | user                                    | name0123456@example.org | 123                          | 200  | true   | should      |
-      | name.with.dots               | user                                    | name.w.dots@example.org | 123                          | 200  | true   | should      |
+      | createDisabledUser           | disabled user                           | example@example.org     | 123                          | 201  | false  | should      |
+      | nameWithNumbers0123456       | user                                    | name0123456@example.org | 123                          | 201  | true   | should      |
+      | name.with.dots               | user                                    | name.w.dots@example.org | 123                          | 201  | true   | should      |
       | 123456789                    | user                                    | 123456789@example.org   | 123                          | 400  | true   | should not  |
       | 0.0                          | user                                    | float@example.org       | 123                          | 400  | true   | should not  |
-      | withoutEmail                 | without email                           |                         | 123                          | 200  | true   | should      |
+      | withoutEmail                 | without email                           |                         | 123                          | 201  | true   | should      |
       | Alice                        | same userName                           | new@example.org         | 123                          | 409  | true   | should      |
 
 
@@ -88,7 +88,7 @@ Feature: create user
       | email          | brian@example.com     |
       | password       | 123                   |
       | accountEnabled | true                  |
-    Then the HTTP status code should be "200"
+    Then the HTTP status code should be "201"
     And user "Brian" should exist
 
 
@@ -102,7 +102,7 @@ Feature: create user
       | email          | new@example.org |
       | password       | 123             |
       | accountEnabled | true            |
-    Then the HTTP status code should be "200"
+    Then the HTTP status code should be "201"
     And user "<userName>" should exist
     Examples:
       | userName          | description                                 |
@@ -119,7 +119,7 @@ Feature: create user
       | email          | new@example.org |
       | password       | 123             |
       | accountEnabled | true            |
-    Then the HTTP status code should be "200"
+    Then the HTTP status code should be "201"
     And user "sam" should exist
     When the administrator retrieves the assigned role of user "sam" using the Graph API
     Then the HTTP status code should be "200"
@@ -135,7 +135,7 @@ Feature: create user
       | email          | new@example.org |
       | password       | 123             |
       | accountEnabled | true            |
-    Then the HTTP status code should be "200"
+    Then the HTTP status code should be "201"
     And user "sam" should exist
     And user "sam" should have the role "User" assigned
 
@@ -147,6 +147,6 @@ Feature: create user
       | email          | new@example.org |
       | password       | 123             |
       | accountEnabled | true            |
-    Then the HTTP status code should be "200"
+    Then the HTTP status code should be "201"
     And user "sam" should exist
     And user "sam" should have the role "User" assigned
diff --git a/tests/acceptance/features/apiGraph/userGDPRExport.feature b/tests/acceptance/features/apiGraph/userGDPRExport.feature
index 6bf23760ad4..a2a09040cff 100644
--- a/tests/acceptance/features/apiGraph/userGDPRExport.feature
+++ b/tests/acceptance/features/apiGraph/userGDPRExport.feature
@@ -11,7 +11,7 @@ Feature: user GDPR (General Data Protection Regulation) report
   Scenario: generate a GDPR report and check user data in the downloaded report
     When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
     And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
-    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    Then the HTTP status code of responses on each endpoint should be "202, 200" respectively
     And the downloaded JSON content should contain key 'user' and match
     """
     {
@@ -74,7 +74,7 @@ Feature: user GDPR (General Data Protection Regulation) report
   Scenario: generate a GDPR report and check events when a user is created
     When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
     And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
-    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    Then the HTTP status code of responses on each endpoint should be "202, 200" respectively
     And the downloaded JSON content should contain event type "events.UserCreated" in item 'events' and should match
     """
     {
@@ -183,7 +183,7 @@ Feature: user GDPR (General Data Protection Regulation) report
     Given user "Alice" has uploaded file with content "sample text" to "lorem.txt"
     When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
     And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
-    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    Then the HTTP status code of responses on each endpoint should be "202, 200" respectively
     And the downloaded JSON content should contain event type "events.BytesReceived" in item 'events' and should match
     """
     {
@@ -309,7 +309,7 @@ Feature: user GDPR (General Data Protection Regulation) report
     And user "Alice" has been added to group "tea-lover"
     When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
     And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
-    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    Then the HTTP status code of responses on each endpoint should be "202, 200" respectively
     And the downloaded JSON content should contain event type "events.GroupMemberAdded" in item 'events' and should match
     """
     {
@@ -413,7 +413,7 @@ Feature: user GDPR (General Data Protection Regulation) report
     Given user "Admin" has changed the quota of the personal space of "Alice Hansen" space to "10000"
     When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
     And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
-    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    Then the HTTP status code of responses on each endpoint should be "202, 200" respectively
     And the downloaded JSON content should contain event type "events.SpaceUpdated" in item 'events' and should match
     """
     {
@@ -523,7 +523,7 @@ Feature: user GDPR (General Data Protection Regulation) report
     Given user "Alice" has created folder "/folderMain"
     When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
     And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
-    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    Then the HTTP status code of responses on each endpoint should be "202, 200" respectively
     And the downloaded JSON content should contain event type "events.ContainerCreated" in item 'events' and should match
     """
     {
@@ -589,7 +589,7 @@ Feature: user GDPR (General Data Protection Regulation) report
     And user "Alice" has shared entry "/folderMain" with user "Brian"
     When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
     And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
-    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    Then the HTTP status code of responses on each endpoint should be "202, 200" respectively
     And the downloaded JSON content should contain event type "events.ShareCreated" in item 'events' and should match
     """
     {
@@ -718,7 +718,7 @@ Feature: user GDPR (General Data Protection Regulation) report
       | password | %public%    |
     When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
     And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
-    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    Then the HTTP status code of responses on each endpoint should be "202, 200" respectively
     And the downloaded JSON content should contain event type "events.LinkCreated" in item 'events' and should match
     """
     {
@@ -815,7 +815,7 @@ Feature: user GDPR (General Data Protection Regulation) report
     And user "Alice" has deleted folder "/folderMain"
     When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
     And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
-    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    Then the HTTP status code of responses on each endpoint should be "202, 200" respectively
     And the downloaded JSON content should contain event type "events.ItemTrashed" in item 'events' and should match
     """
     {
@@ -862,7 +862,7 @@ Feature: user GDPR (General Data Protection Regulation) report
       | role      | viewer |
     When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
     And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
-    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    Then the HTTP status code of responses on each endpoint should be "202, 200" respectively
     And the downloaded JSON content should contain event type "events.SpaceShared" in item 'events' and should match
     """
     {
@@ -962,7 +962,7 @@ Feature: user GDPR (General Data Protection Regulation) report
     And user "Alice" has created a space "GDPR Space" with the default quota using the Graph API
     When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
     And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
-    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    Then the HTTP status code of responses on each endpoint should be "202, 200" respectively
     And the downloaded JSON content should contain event type "events.SpaceCreated" for "project" space and should match
     """
     {
diff --git a/tests/acceptance/features/apiNotification/notification.feature b/tests/acceptance/features/apiNotification/notification.feature
index 36a026bc86e..5c0719faa7f 100644
--- a/tests/acceptance/features/apiNotification/notification.feature
+++ b/tests/acceptance/features/apiNotification/notification.feature
@@ -199,7 +199,7 @@ Feature: Notification
                 },
                 "id": {
                   "type": "string",
-                  "enim": ["%user_id%"]
+                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$"
                 },
                 "name": {
                   "type": "string",
diff --git a/tests/acceptance/features/bootstrap/GraphContext.php b/tests/acceptance/features/bootstrap/GraphContext.php
index 26ce1ff6afd..bc8a1a5e515 100644
--- a/tests/acceptance/features/bootstrap/GraphContext.php
+++ b/tests/acceptance/features/bootstrap/GraphContext.php
@@ -916,7 +916,7 @@ class GraphContext implements Context {
 		$this->featureContext->setResponse($response);
 		$this->featureContext->pushToLastHttpStatusCodesArray((string) $response->getStatusCode());
 
-		if ($response->getStatusCode() === 200) {
+		if ($response->getStatusCode() === 201) {
 			$groupId = $this->featureContext->getJsonDecodedResponse($response)["id"];
 			$this->featureContext->addGroupToCreatedGroupsList($group, true, true, $groupId);
 		}
@@ -936,7 +936,7 @@ class GraphContext implements Context {
 	public function userHasCreatedGroupUsingTheGraphApi(string $group, ?string $user = null): void {
 		$response = $this->createGroup($group, $user);
 
-		if ($response->getStatusCode() === 200) {
+		if ($response->getStatusCode() === 201) {
 			$groupId = $this->featureContext->getJsonDecodedResponse($response)["id"];
 			$this->featureContext->addGroupToCreatedGroupsList($group, true, true, $groupId);
 		} else {
@@ -955,7 +955,7 @@ class GraphContext implements Context {
 	 */
 	public function adminHasCreatedGroupUsingTheGraphApi(string $group): array {
 		$result = $this->createGroup($group);
-		if ($result->getStatusCode() === 200) {
+		if ($result->getStatusCode() === 201) {
 			return $this->featureContext->getJsonDecodedResponse($result);
 		} else {
 			$this->throwHttpException($result, "Could not create group '$group'.");
diff --git a/tests/acceptance/features/bootstrap/Provisioning.php b/tests/acceptance/features/bootstrap/Provisioning.php
index cfd6f83626b..f986eb37e3a 100644
--- a/tests/acceptance/features/bootstrap/Provisioning.php
+++ b/tests/acceptance/features/bootstrap/Provisioning.php
@@ -2647,7 +2647,7 @@ trait Provisioning {
 				$displayName,
 			);
 			Assert::assertEquals(
-				200,
+				201,
 				$response->getStatusCode(),
 				__METHOD__ . " cannot create user '$user' using Graph API.\nResponse:" .
 				json_encode($this->getJsonDecodedResponse($response))