Repository: owncloud/ocis
Pull request #7720 (2023-11-13 12:21:46)

Ocis 5455 language setting
Enhancement: Add preferred language to user settings

We have added the preferred language to the libre-graph api & added endpoints for that to ocis.

refs https://github.com/owncloud/ocis/issues/5455
refs https://github.com/owncloud/libre-graph-api/pull/130

update-docs[bot]: Thanks for opening this pull request! The maintainers of this repository would appreciate it if you would create a [changelog](https://github.com/owncloud/ocis/blob/master/changelog/README.md) item based on your changes.

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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_coverage&view=list) [0.0% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_coverage&view=list) [0.0% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_coverage&view=list) [0.0% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_duplicated_lines_density&view=list)


kobergj: Please rebase to master as there were changes to `settings` service that might impact this PR
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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&resolved=false&types=CODE_SMELL)

[![35.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/25-16px.png '35.1%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_coverage&view=list) [35.1% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&resolved=false&types=CODE_SMELL)

[![35.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/25-16px.png '35.1%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_coverage&view=list) [35.1% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_coverage&view=list) [0.0% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&resolved=false&types=CODE_SMELL)

[![34.3%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/25-16px.png '34.3%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_coverage&view=list) [34.3% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_duplicated_lines_density&view=list)


dragonchaser: We have found a massive bug, the language is not correctly stored and retrieved, working on it
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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&resolved=false&types=CODE_SMELL)

[![27.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/25-16px.png '27.1%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_coverage&view=list) [27.1% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&resolved=false&types=CODE_SMELL)

[![27.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/25-16px.png '27.1%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_coverage&view=list) [27.1% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_duplicated_lines_density&view=list)


ScharfViktor: e2e test error. whether your changes could have affected the GET user `https://ocis-server:9200/graph/v1.0/users/793967d8-ed19-4c77-95fa-f335189f1fd4?%24select=&%24expand=drive%2CmemberOf%2CappRoleAssignments` in any way?

https://drone.owncloud.com/owncloud/ocis/28760/40/12
trace: `npx playwright show-trace https://cache.owncloud.com/public/owncloud/ocis/28760/tracing/user-should-be-able-to-read-and-dismiss-notifications-alice-2023-11-15-07-37-20.zip`

<img width="1199" alt="Screenshot 2023-11-15 at 09 19 12" src="https://github.com/owncloud/ocis/assets/84779829/6269862e-8b6a-4d5c-9761-afe0f70f34f0">

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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&resolved=false&types=CODE_SMELL)

[![28.3%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/25-16px.png '28.3%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_coverage&view=list) [28.3% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&resolved=false&types=CODE_SMELL)

[![28.3%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/25-16px.png '28.3%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_coverage&view=list) [28.3% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&resolved=false&types=CODE_SMELL)

[![28.3%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/25-16px.png '28.3%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_coverage&view=list) [28.3% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=7720&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=7720&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=7720&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=7720&resolved=false&types=CODE_SMELL)

[![26.9%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/25-16px.png '26.9%')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_coverage&view=list) [26.9% Coverage](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&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=7720&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=7720&metric=new_duplicated_lines_density&view=list)



Patch:
diff --git a/.gitignore b/.gitignore
index 69b344d068c..c4c08a62aa2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,7 +24,6 @@ ocis/cmd/ocis/config/
 
 # docs
 /hugo
-/docs/services/*/_index.md
 
 # IDEs
 .idea
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
deleted file mode 100644
index b947d3e9394..00000000000
--- a/docs/apis/http/webdav/_index.md
+++ /dev/null
@@ -1,532 +0,0 @@
----
-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
deleted file mode 100644
index 2ceaeddfd96..00000000000
--- a/docs/ocis/deployment/ocis_and_wopi_drawio.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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 d1becdca082..7e25e5c1e7e 100644
--- a/docs/ocis/deployment/ocis_wopi.md
+++ b/docs/ocis/deployment/ocis_wopi.md
@@ -26,10 +26,6 @@ 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/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/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..0a2ee154629 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
 		}
@@ -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/users_test.go b/services/graph/pkg/service/v0/users_test.go
index 8e67a5152d2..44f271e3ffc 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())
diff --git a/tests/acceptance/features/apiNotification/notification.feature b/tests/acceptance/features/apiNotification/notification.feature
index 5c0719faa7f..36a026bc86e 100644
--- a/tests/acceptance/features/apiNotification/notification.feature
+++ b/tests/acceptance/features/apiNotification/notification.feature
@@ -199,7 +199,7 @@ Feature: Notification
                 },
                 "id": {
                   "type": "string",
-                  "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}$"
+                  "enim": ["%user_id%"]
                 },
                 "name": {
                   "type": "string",