Repository: owncloud/ocis
Pull request #6145 (2023-04-26 09:08:04)

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


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information


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

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

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=6145&metric=duplicated_lines_density&view=list) No Duplication information



Patch:
diff --git a/.drone.star b/.drone.star
index db572eae442..4e524cd7e8b 100644
--- a/.drone.star
+++ b/.drone.star
@@ -5,6 +5,7 @@
 ALPINE_GIT = "alpine/git:latest"
 CHKO_DOCKER_PUSHRM = "chko/docker-pushrm:1"
 DRONE_CLI = "drone/cli:alpine"
+INBUCKET_INBUCKET = "inbucket/inbucket"
 MINIO_MC = "minio/mc:RELEASE.2021-10-07T04-19-58Z"
 OC_CI_ALPINE = "owncloudci/alpine:latest"
 OC_CI_BAZEL_BUILDIFIER = "owncloudci/bazel-buildifier:latest"
@@ -133,6 +134,23 @@ config = {
                 "POSTPROCESSING_DELAY": "30s",
             },
         },
+        "apiEmailNotification": {
+            "suites": [
+                "apiEmailNotification",
+            ],
+            "skip": False,
+            "earlyFail": True,
+            "emailNeeded": True,
+            "extraEnvironment": {
+                "EMAIL_HOST": "email",
+                "EMAIL_PORT": "9000",
+            },
+            "extraServerEnvironment": {
+                "NOTIFICATIONS_SMTP_HOST": "email",
+                "NOTIFICATIONS_SMTP_PORT": "2500",
+                "NOTIFICATIONS_SMTP_INSECURE": "true",
+            },
+        },
     },
     "apiTests": {
         "numberOfParts": 10,
@@ -759,6 +777,7 @@ def localApiTestPipeline(ctx):
         "extraServerEnvironment": {},
         "storages": ["ocis"],
         "accounts_hash_difficulty": 4,
+        "emailNeeded": False,
     }
 
     if "localApiTests" in config:
@@ -781,9 +800,10 @@ def localApiTestPipeline(ctx):
                             "steps": skipIfUnchanged(ctx, "acceptance-tests") +
                                      restoreBuildArtifactCache(ctx, "ocis-binary-amd64", "ocis/bin") +
                                      ocisServer(storage, params["accounts_hash_difficulty"], extra_server_environment = params["extraServerEnvironment"]) +
+                                     (waitForEmailService() if params["emailNeeded"] else []) +
                                      localApiTests(suite, storage, params["extraEnvironment"]) +
                                      failEarly(ctx, early_fail),
-                            "services": redisForOCStorage(storage),
+                            "services": emailService() if params["emailNeeded"] else [],
                             "depends_on": getPipelineNames([buildOcisBinaryForTesting(ctx)]),
                             "trigger": {
                                 "ref": [
@@ -2892,3 +2912,18 @@ def restoreWebPnpmCache():
             "retry -t 3 'pnpm install'",
         ],
     }]
+
+def emailService():
+    return [{
+        "name": "email",
+        "image": INBUCKET_INBUCKET,
+    }]
+
+def waitForEmailService():
+    return [{
+        "name": "wait-for-email",
+        "image": OC_CI_WAIT_FOR,
+        "commands": [
+            "wait-for -it email:9000 -t 600",
+        ],
+    }]
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8d2e3ee8df8..565912ef905 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,29 @@
+# Changelog for [unreleased] (UNRELEASED)
+
+The following sections list the changes for unreleased.
+
+[unreleased]: https://github.com/owncloud/ocis/compare/v3.0.0...master
+
+## Summary
+
+* Bugfix - Fix the empty string givenName attribute when creating user: [#5431](https://github.com/owncloud/ocis/issues/5431)
+* Enhancement - Add specific result to antivirus for debugging: [#6265](https://github.com/owncloud/ocis/pull/6265)
+
+## Details
+
+* Bugfix - Fix the empty string givenName attribute when creating user: [#5431](https://github.com/owncloud/ocis/issues/5431)
+
+   Omitempty givenName attribute when creating user
+
+   https://github.com/owncloud/ocis/issues/5431
+   https://github.com/owncloud/ocis/pull/6259
+
+* Enhancement - Add specific result to antivirus for debugging: [#6265](https://github.com/owncloud/ocis/pull/6265)
+
+   We added the ability to define a specific result for the virus scanner via env-var
+   (ANTIVIRUS_DEBUG_SCAN_OUTCOME)
+
+   https://github.com/owncloud/ocis/pull/6265
 # Changelog for [3.0.0] (2023-05-08)
 
 The following sections list the changes for 3.0.0.
diff --git a/changelog/unreleased/add-debug-result-for-av.md b/changelog/unreleased/add-debug-result-for-av.md
new file mode 100644
index 00000000000..43bc72021dd
--- /dev/null
+++ b/changelog/unreleased/add-debug-result-for-av.md
@@ -0,0 +1,5 @@
+Enhancement: Add specific result to antivirus for debugging
+
+We added the ability to define a specific result for the virus scanner via env-var (ANTIVIRUS_DEBUG_SCAN_OUTCOME)
+
+https://github.com/owncloud/ocis/pull/6265
\ No newline at end of file
diff --git a/changelog/unreleased/fix-omitempty-givenName.md b/changelog/unreleased/fix-omitempty-givenName.md
new file mode 100644
index 00000000000..08ae5157a9a
--- /dev/null
+++ b/changelog/unreleased/fix-omitempty-givenName.md
@@ -0,0 +1,6 @@
+Bugfix: Fix the empty string givenName attribute when creating user
+
+Omitempty givenName attribute when creating user
+
+https://github.com/owncloud/ocis/issues/5431
+https://github.com/owncloud/ocis/pull/6259
diff --git a/services/antivirus/pkg/config/config.go b/services/antivirus/pkg/config/config.go
index f92680bfe14..b313760bfee 100644
--- a/services/antivirus/pkg/config/config.go
+++ b/services/antivirus/pkg/config/config.go
@@ -19,6 +19,8 @@ type Config struct {
 	MaxScanSize          string `yaml:"max-scan-size" env:"ANTIVIRUS_MAX_SCAN_SIZE" desc:"The maximum scan size the virusscanner can handle. Only this many bytes of a file will be scanned. 0 means unlimited and is the default. Usable common abbreviations: [KB, KiB, GB, GiB, TB, TiB, PB, PiB, EB, EiB], example: 2GB."`
 
 	Context context.Context `yaml:"-" json:"-"`
+
+	DebugScanOutcome string `yaml:"-" env:"ANTIVIRUS_DEBUG_SCAN_OUTCOME" desc:"A predefined outcome for virus scanning, FOR DEBUG PURPOSES ONLY! (example values: \"found,infected\")"`
 }
 
 // Service defines the available service configuration.
diff --git a/services/antivirus/pkg/scanners/scanners.go b/services/antivirus/pkg/scanners/scanners.go
index ef2fe464818..b3257c2f947 100644
--- a/services/antivirus/pkg/scanners/scanners.go
+++ b/services/antivirus/pkg/scanners/scanners.go
@@ -21,14 +21,14 @@ type Scanner interface {
 }
 
 // New returns a new scanner from config
-func New(c config.Scanner) (Scanner, error) {
-	switch c.Type {
+func New(c *config.Config) (Scanner, error) {
+	switch c.Scanner.Type {
 	default:
-		return nil, fmt.Errorf("unknown av scanner: '%s'", c.Type)
+		return nil, fmt.Errorf("unknown av scanner: '%s'", c.Scanner.Type)
 	case "clamav":
-		return NewClamAV(c.ClamAV.Socket), nil
+		return NewClamAV(c.Scanner.ClamAV.Socket), nil
 	case "icap":
-		return NewICAP(c.ICAP.URL, c.ICAP.Service, time.Duration(c.ICAP.Timeout)*time.Second)
+		return NewICAP(c.Scanner.ICAP.URL, c.Scanner.ICAP.Service, time.Duration(c.Scanner.ICAP.Timeout)*time.Second)
 	}
 
 }
diff --git a/services/antivirus/pkg/service/service.go b/services/antivirus/pkg/service/service.go
index cc29e6c517e..09952d9033a 100644
--- a/services/antivirus/pkg/service/service.go
+++ b/services/antivirus/pkg/service/service.go
@@ -30,7 +30,7 @@ func NewAntivirus(c *config.Config, l log.Logger) (Antivirus, error) {
 	av := Antivirus{c: c, l: l, client: rhttp.GetHTTPClient(rhttp.Insecure(true))}
 
 	var err error
-	av.s, err = scanners.New(c.Scanner)
+	av.s, err = scanners.New(c)
 	if err != nil {
 		return av, err
 	}
@@ -102,6 +102,27 @@ func (av Antivirus) Run() error {
 			continue
 		}
 
+		if av.c.DebugScanOutcome != "" {
+			av.l.Warn().Str("antivir, clamav", ">>>>>>> ANTIVIRUS_DEBUG_SCAN_OUTCOME IS SET NO ACTUAL VIRUS SCAN IS PERFORMED!")
+			if err := events.Publish(stream, events.PostprocessingStepFinished{
+				FinishedStep:  events.PPStepAntivirus,
+				Outcome:       events.PostprocessingOutcome(av.c.DebugScanOutcome),
+				UploadID:      ev.UploadID,
+				ExecutingUser: ev.ExecutingUser,
+				Filename:      ev.Filename,
+				Result: events.VirusscanResult{
+					Infected:    true,
+					Description: "DEBUG: forced outcome",
+					Scandate:    time.Now(),
+					ResourceID:  ev.ResourceID,
+					ErrorMsg:    "DEBUG: forced outcome",
+				},
+			}); err != nil {
+				av.l.Fatal().Err(err).Str("uploadid", ev.UploadID).Interface("resourceID", ev.ResourceID).Msg("cannot publish events - exiting")
+				return err
+			}
+		}
+
 		av.l.Debug().Str("uploadid", ev.UploadID).Str("filename", ev.Filename).Msg("Starting virus scan.")
 		var errmsg string
 		res, err := av.process(ev)
diff --git a/services/graph/pkg/identity/ldap.go b/services/graph/pkg/identity/ldap.go
index 6920a43f4cf..c64eaab9a4a 100644
--- a/services/graph/pkg/identity/ldap.go
+++ b/services/graph/pkg/identity/ldap.go
@@ -784,7 +784,6 @@ func (i *LDAP) createUserModelFromLDAP(e *ldap.Entry) *libregraph.User {
 	if err != nil {
 		i.logger.Warn().Str("dn", e.DN).Str(i.userAttributeMap.id, e.GetAttributeValue(i.userAttributeMap.id)).Msg("Invalid User. Cannot convert UUID")
 	}
-	givenName := e.GetEqualFoldAttributeValue(i.userAttributeMap.givenName)
 	surname := e.GetEqualFoldAttributeValue(i.userAttributeMap.surname)
 
 	if id != "" && opsan != "" {
@@ -793,7 +792,7 @@ func (i *LDAP) createUserModelFromLDAP(e *ldap.Entry) *libregraph.User {
 			Mail:                     pointerOrNil(e.GetEqualFoldAttributeValue(i.userAttributeMap.mail)),
 			OnPremisesSamAccountName: &opsan,
 			Id:                       &id,
-			GivenName:                &givenName,
+			GivenName:                pointerOrNil(e.GetEqualFoldAttributeValue(i.userAttributeMap.givenName)),
 			Surname:                  &surname,
 			UserType:                 pointerOrNil(e.GetEqualFoldAttributeValue(i.userAttributeMap.userType)),
 			AccountEnabled:           booleanOrNil(e.GetEqualFoldAttributeValue(i.userAttributeMap.accountEnabled)),
diff --git a/services/notifications/Makefile b/services/notifications/Makefile
index 20063cecab8..dff7c0f58e9 100644
--- a/services/notifications/Makefile
+++ b/services/notifications/Makefile
@@ -36,7 +36,7 @@ ci-node-generate:
 ############ translations ########
 .PHONY: l10n-pull
 l10n-pull:
-	cd $(OUTPUT_DIR) && tx pull -a --skip --minimum-perc=75
+	cd $(OUTPUT_DIR) && tx pull --all --force --skip --minimum-perc=75
 
 .PHONY: l10n-push
 l10n-push:
diff --git a/services/notifications/pkg/email/l10n/locale/ca/LC_MESSAGES/notifications.po b/services/notifications/pkg/email/l10n/locale/ca/LC_MESSAGES/notifications.po
index f2dbcd5a5db..4f4f218d789 100644
--- a/services/notifications/pkg/email/l10n/locale/ca/LC_MESSAGES/notifications.po
+++ b/services/notifications/pkg/email/l10n/locale/ca/LC_MESSAGES/notifications.po
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-04-21 00:34+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-04-19 11:11+0000\n"
 "Last-Translator: Arnau Morancho, 2023\n"
 "Language-Team: Catalan (https://app.transifex.com/owncloud-org/teams/6149/ca/)\n"
@@ -22,46 +22,46 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. UnsharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:57
+#: pkg/email/templates.go:61
 msgid "Click here to check it: {ShareLink}"
 msgstr "Clica aquí per verificar: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .CallToAction }}
 #. SharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:18 pkg/email/templates.go:43
+#: pkg/email/templates.go:19 pkg/email/templates.go:46
 msgid "Click here to view it: {ShareLink}"
 msgstr "Clica aquí per visualitzar: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:14
+#: pkg/email/templates.go:15
 msgid "Hello {ShareGrantee}"
 msgstr "Bones {ShareGrantee}"
 
 #. ShareExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:26
+#: pkg/email/templates.go:28
 msgid "Hello {ShareGrantee},"
 msgstr "Bones {ShareGrantee},"
 
 #. SharedSpace email template, resolves via {{ .Greeting }}
 #. UnsharedSpace email template, resolves via {{ .Greeting }}
 #. MembershipExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:39 pkg/email/templates.go:51
-#: pkg/email/templates.go:65
+#: pkg/email/templates.go:42 pkg/email/templates.go:55
+#: pkg/email/templates.go:70
 msgid "Hello {SpaceGrantee},"
 msgstr "Bones {SpaceGrantee},"
 
 #. MembershipExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:63
+#: pkg/email/templates.go:68
 msgid "Membership of '{SpaceName}' expired at {ExpiredAt}"
 msgstr "Incripció a '{SpaceName}' ha caducat el {ExpiredAt}"
 
 #. ShareExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:24
+#: pkg/email/templates.go:26
 msgid "Share to '{ShareFolder}' expired at {ExpiredAt}"
 msgstr "Compartir a '{ShareFolder}' caducat el {ExpiredAt}"
 
 #. MembershipExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:67
+#: pkg/email/templates.go:72
 msgid ""
 "Your membership of space {SpaceName} has expired at {ExpiredAt}\n"
 "\n"
@@ -72,7 +72,7 @@ msgstr ""
 "Encara que aquesta inscripció hagi caducat, podria seguir tenint accés a través d'altres comparticions i/o espais inscrit."
 
 #. ShareExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:28
+#: pkg/email/templates.go:30
 msgid ""
 "Your share to {ShareFolder} has expired at {ExpiredAt}\n"
 "\n"
@@ -83,22 +83,22 @@ msgstr ""
 "Encara que aquesta compartició ha estat cancel·lada, podria seguir tenint accés a través d'altres comparticions i/o espais inscrits."
 
 #. ShareCreated email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:16
+#: pkg/email/templates.go:17
 msgid "{ShareSharer} has shared \"{ShareFolder}\" with you."
 msgstr "{ShareSharer} ha compartit \"{ShareFolder}\" amb tu."
 
 #. ShareCreated email template, Subject field (resolves directly)
-#: pkg/email/templates.go:12
+#: pkg/email/templates.go:13
 msgid "{ShareSharer} shared '{ShareFolder}' with you"
 msgstr "{ShareSharer} comparteix \"{ShareFolder}\" amb tu"
 
 #. SharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:41
+#: pkg/email/templates.go:44
 msgid "{SpaceSharer} has invited you to join \"{SpaceName}\"."
 msgstr "{SpaceSharer} l'ha invitat a unir-se a \"{SpaceName}\"."
 
 #. UnsharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:53
+#: pkg/email/templates.go:57
 msgid ""
 "{SpaceSharer} has removed you from \"{SpaceName}\".\n"
 "\n"
@@ -109,11 +109,11 @@ msgstr ""
 "Podria seguir tenint accés a través d'altres grups o d'incripció directa."
 
 #. SharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:37
+#: pkg/email/templates.go:40
 msgid "{SpaceSharer} invited you to join {SpaceName}"
 msgstr "{SpaceSharer} l'invita a unir-se {SpaceName}"
 
 #. UnsharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:49
+#: pkg/email/templates.go:53
 msgid "{SpaceSharer} removed you from {SpaceName}"
 msgstr "{SpaceSharer} l'ha eliminat de {SpaceName}"
diff --git a/services/notifications/pkg/email/l10n/locale/de/LC_MESSAGES/notifications.po b/services/notifications/pkg/email/l10n/locale/de/LC_MESSAGES/notifications.po
index 8197a606925..cb4a3ea2d8e 100644
--- a/services/notifications/pkg/email/l10n/locale/de/LC_MESSAGES/notifications.po
+++ b/services/notifications/pkg/email/l10n/locale/de/LC_MESSAGES/notifications.po
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-04-21 00:34+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-04-19 11:11+0000\n"
 "Last-Translator: hurradieweltgehtunter <florian@owncloud.com>, 2023\n"
 "Language-Team: German (https://app.transifex.com/owncloud-org/teams/6149/de/)\n"
@@ -23,46 +23,46 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. UnsharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:57
+#: pkg/email/templates.go:61
 msgid "Click here to check it: {ShareLink}"
 msgstr "Zum Überprüfen hier klicken: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .CallToAction }}
 #. SharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:18 pkg/email/templates.go:43
+#: pkg/email/templates.go:19 pkg/email/templates.go:46
 msgid "Click here to view it: {ShareLink}"
 msgstr "Zum Ansehen hier klicken: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:14
+#: pkg/email/templates.go:15
 msgid "Hello {ShareGrantee}"
 msgstr "Hallo {ShareGrantee}"
 
 #. ShareExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:26
+#: pkg/email/templates.go:28
 msgid "Hello {ShareGrantee},"
 msgstr "Hallo {ShareGrantee},"
 
 #. SharedSpace email template, resolves via {{ .Greeting }}
 #. UnsharedSpace email template, resolves via {{ .Greeting }}
 #. MembershipExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:39 pkg/email/templates.go:51
-#: pkg/email/templates.go:65
+#: pkg/email/templates.go:42 pkg/email/templates.go:55
+#: pkg/email/templates.go:70
 msgid "Hello {SpaceGrantee},"
 msgstr "Hallo {ShareGrantee},"
 
 #. MembershipExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:63
+#: pkg/email/templates.go:68
 msgid "Membership of '{SpaceName}' expired at {ExpiredAt}"
 msgstr "Die Mitgliedschaft für '{SpaceName}' ist am {ExpiredAt} abgelaufen."
 
 #. ShareExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:24
+#: pkg/email/templates.go:26
 msgid "Share to '{ShareFolder}' expired at {ExpiredAt}"
 msgstr "Die Freigabe für '{ShareFolder}' ist am {ExpiredAt} abgelaufen."
 
 #. MembershipExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:67
+#: pkg/email/templates.go:72
 msgid ""
 "Your membership of space {SpaceName} has expired at {ExpiredAt}\n"
 "\n"
@@ -72,7 +72,7 @@ msgstr ""
 "Über eventuelle weitere Freigaben oder Space-Mitgliedschaften kann der Zugriff trotzdem weiterhin möglich sein."
 
 #. ShareExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:28
+#: pkg/email/templates.go:30
 msgid ""
 "Your share to {ShareFolder} has expired at {ExpiredAt}\n"
 "\n"
@@ -83,22 +83,22 @@ msgstr ""
 "Über eventuelle weitere Freigaben oder Space-Mitgliedschaften kann der Zugriff trotzdem weiterhin möglich sein."
 
 #. ShareCreated email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:16
+#: pkg/email/templates.go:17
 msgid "{ShareSharer} has shared \"{ShareFolder}\" with you."
 msgstr "{ShareSharer} hat \"{ShareFolder}\" mit Ihnen geteilt."
 
 #. ShareCreated email template, Subject field (resolves directly)
-#: pkg/email/templates.go:12
+#: pkg/email/templates.go:13
 msgid "{ShareSharer} shared '{ShareFolder}' with you"
 msgstr "{ShareSharer} hat \"{ShareFolder}\" mit Ihnen geteilt"
 
 #. SharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:41
+#: pkg/email/templates.go:44
 msgid "{SpaceSharer} has invited you to join \"{SpaceName}\"."
 msgstr "{SpaceSharer} hat Sie eingeladen, dem Space \"{SpaceName}\" beizutreten."
 
 #. UnsharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:53
+#: pkg/email/templates.go:57
 msgid ""
 "{SpaceSharer} has removed you from \"{SpaceName}\".\n"
 "\n"
@@ -109,11 +109,11 @@ msgstr ""
 "Über eventuelle weitere Freigaben oder Space-Mitgliedschaften kann der Zugriff trotzdem weiterhin möglich sein."
 
 #. SharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:37
+#: pkg/email/templates.go:40
 msgid "{SpaceSharer} invited you to join {SpaceName}"
 msgstr "{SpaceSharer} hat Sie eingeladen, dem Space {SpaceName} beizutreten."
 
 #. UnsharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:49
+#: pkg/email/templates.go:53
 msgid "{SpaceSharer} removed you from {SpaceName}"
 msgstr "{SpaceSharer} hat Sie aus dem Space {SpaceName} entfernt."
diff --git a/services/notifications/pkg/email/l10n/locale/de_DE/LC_MESSAGES/notifications.po b/services/notifications/pkg/email/l10n/locale/de_DE/LC_MESSAGES/notifications.po
index a434807bea9..9a115f834f9 100644
--- a/services/notifications/pkg/email/l10n/locale/de_DE/LC_MESSAGES/notifications.po
+++ b/services/notifications/pkg/email/l10n/locale/de_DE/LC_MESSAGES/notifications.po
@@ -2,101 +2,118 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
+# 
+# Translators:
+# Edith Parzefall, 2023
+# 
 #, fuzzy
-msgid   ""
-msgstr  "Project-Id-Version: \n"
-        "Report-Msgid-Bugs-To: EMAIL\n"
-        "POT-Creation-Date: 2023-04-14 16:58+0200\n"
-        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-        "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-        "Language-Team: LANGUAGE <LL@li.org>\n"
-        "Language: \n"
-        "MIME-Version: 1.0\n"
-        "Content-Type: text/plain; charset=CHARSET\n"
-        "Content-Transfer-Encoding: 8bit\n"
-
-#. UnsharedSpace email template, CallToAction field
-#: pkg/email/templates.go:57
-msgid   "Click here to check it: {ShareLink}"
-msgstr  ""
-
-#. ShareCreated email template, CallToAction field
-#. SharedSpace email template, CallToAction field
-#: pkg/email/templates.go:18 pkg/email/templates.go:43
-msgid   "Click here to view it: {ShareLink}"
-msgstr  ""
-
-#. ShareCreated email template, Greeting field
-#: pkg/email/templates.go:14
-msgid   "Hello {ShareGrantee}"
-msgstr  ""
-
-#. ShareExpired email template, Greeting field
-#: pkg/email/templates.go:26
-msgid   "Hello {ShareGrantee},"
-msgstr  ""
-
-#. SharedSpace email template, Greeting field
-#. UnsharedSpace email template, Greeting field
-#. MembershipExpired email template, Greeting field
-#: pkg/email/templates.go:39 pkg/email/templates.go:51 pkg/email/templates.go:65
-msgid   "Hello {SpaceGrantee},"
-msgstr  ""
-
-#. MembershipExpired email template, Subject field
-#: pkg/email/templates.go:63
-msgid   "Membership of '{SpaceName}' expired at {ExpiredAt}"
-msgstr  ""
-
-#. ShareExpired email template, Subject field
-#: pkg/email/templates.go:24
-msgid   "Share to '{ShareFolder}' expired at {ExpiredAt}"
-msgstr  ""
-
-#. MembershipExpired email template, Message field
-#: pkg/email/templates.go:67
-msgid   "Your membership of space {SpaceName} has expired at {ExpiredAt}\n"
-        "\n"
-        "Even though this membership has expired you still might have access through other shares and/or space memberships"
-msgstr  ""
-
-#. ShareExpired email template, Message field
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: EMAIL\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
+"PO-Revision-Date: 2023-04-19 11:11+0000\n"
+"Last-Translator: Edith Parzefall, 2023\n"
+"Language-Team: German (Germany) (https://app.transifex.com/owncloud-org/teams/6149/de_DE/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de_DE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. UnsharedSpace email template, resolves via {{ .CallToAction }}
+#: pkg/email/templates.go:61
+msgid "Click here to check it: {ShareLink}"
+msgstr "Hier klicken, um zu prüfen: {ShareLink}"
+
+#. ShareCreated email template, resolves via {{ .CallToAction }}
+#. SharedSpace email template, resolves via {{ .CallToAction }}
+#: pkg/email/templates.go:19 pkg/email/templates.go:46
+msgid "Click here to view it: {ShareLink}"
+msgstr "Zum Ansehen hier klicken: {ShareLink}"
+
+#. ShareCreated email template, resolves via {{ .Greeting }}
+#: pkg/email/templates.go:15
+msgid "Hello {ShareGrantee}"
+msgstr "Hallo {ShareGrantee}"
+
+#. ShareExpired email template, resolves via {{ .Greeting }}
 #: pkg/email/templates.go:28
-msgid   "Your share to {ShareFolder} has expired at {ExpiredAt}\n"
-        "\n"
-        "Even though this share has been revoked you still might have access through other shares and/or space memberships."
-msgstr  ""
-
-#. ShareCreated email template, Message field
-#: pkg/email/templates.go:16
-msgid   "{ShareSharer} has shared \"{ShareFolder}\" with you."
-msgstr  ""
-
-#. ShareCreated email template, Subject field
-#: pkg/email/templates.go:12
-msgid   "{ShareSharer} shared '{ShareFolder}' with you"
-msgstr  ""
-
-#. SharedSpace email template, Message field
-#: pkg/email/templates.go:41
-msgid   "{SpaceSharer} has invited you to join \"{SpaceName}\"."
-msgstr  ""
-
-#. UnsharedSpace email template, Message field
+msgid "Hello {ShareGrantee},"
+msgstr "Hallo {ShareGrantee},"
+
+#. SharedSpace email template, resolves via {{ .Greeting }}
+#. UnsharedSpace email template, resolves via {{ .Greeting }}
+#. MembershipExpired email template, resolves via {{ .Greeting }}
+#: pkg/email/templates.go:42 pkg/email/templates.go:55
+#: pkg/email/templates.go:70
+msgid "Hello {SpaceGrantee},"
+msgstr "Hallo {ShareGrantee},"
+
+#. MembershipExpired email template, Subject field (resolves directly)
+#: pkg/email/templates.go:68
+msgid "Membership of '{SpaceName}' expired at {ExpiredAt}"
+msgstr "Mitgliedschaft in '{SpaceName}' abgelaufen am {ExpiredAt}"
+
+#. ShareExpired email template, Subject field (resolves directly)
+#: pkg/email/templates.go:26
+msgid "Share to '{ShareFolder}' expired at {ExpiredAt}"
+msgstr "Freigabe für '{ShareFolder}' abgelaufen am {ExpiredAt}"
+
+#. MembershipExpired email template, resolves via {{ .MessageBody }}
+#: pkg/email/templates.go:72
+msgid ""
+"Your membership of space {SpaceName} has expired at {ExpiredAt}\n"
+"\n"
+"Even though this membership has expired you still might have access through other shares and/or space memberships"
+msgstr ""
+"Die Mitgliedschaft im Space {SpaceName} ist am {ExpiredAt} abgelaufen.\n"
+"\n"
+"Trotzdem haben Sie möglicherweise noch Zugriff durch andere Freigaben oder Space-Mitgliedschaften."
+
+#. ShareExpired email template, resolves via {{ .MessageBody }}
+#: pkg/email/templates.go:30
+msgid ""
+"Your share to {ShareFolder} has expired at {ExpiredAt}\n"
+"\n"
+"Even though this share has been revoked you still might have access through other shares and/or space memberships."
+msgstr ""
+"Ihre Freigabe für {ShareFolder} ist am {ExpiredAt} abgelaufen.\n"
+"\n"
+"Obwohl die Freigabe zurückgezogen wurde, haben Sie vielleicht noch Zugriff durch andere Freigaben oder Space-Mitgliedschaften.."
+
+#. ShareCreated email template, resolves via {{ .MessageBody }}
+#: pkg/email/templates.go:17
+msgid "{ShareSharer} has shared \"{ShareFolder}\" with you."
+msgstr "{ShareSharer} hat \"{ShareFolder}\" mit Ihnen geteilt."
+
+#. ShareCreated email template, Subject field (resolves directly)
+#: pkg/email/templates.go:13
+msgid "{ShareSharer} shared '{ShareFolder}' with you"
+msgstr "{ShareSharer} hat \"{ShareFolder}\" mit Ihnen geteilt."
+
+#. SharedSpace email template, resolves via {{ .MessageBody }}
+#: pkg/email/templates.go:44
+msgid "{SpaceSharer} has invited you to join \"{SpaceName}\"."
+msgstr "{SpaceSharer} hat Sie in den Space \"{SpaceName}\" eingeladen."
+
+#. UnsharedSpace email template, resolves via {{ .MessageBody }}
+#: pkg/email/templates.go:57
+msgid ""
+"{SpaceSharer} has removed you from \"{SpaceName}\".\n"
+"\n"
+"You might still have access through your other groups or direct membership."
+msgstr ""
+"{SpaceSharer} hat Sie aus dem Space \"{SpaceName}\" entfernt.\n"
+"\n"
+"Sie haben möglicherweise noch Zugriff durch andere Gruppen oder direkte Mitgliedschaft."
+
+#. SharedSpace email template, Subject field (resolves directly)
+#: pkg/email/templates.go:40
+msgid "{SpaceSharer} invited you to join {SpaceName}"
+msgstr "{SpaceSharer} hat Sie in den Space {SpaceName} eingeladen."
+
+#. UnsharedSpace email template, Subject field (resolves directly)
 #: pkg/email/templates.go:53
-msgid   "{SpaceSharer} has removed you from \"{SpaceName}\".\n"
-        "\n"
-        "You might still have access through your other groups or direct membership."
-msgstr  ""
-
-#. SharedSpace email template, Subject field
-#: pkg/email/templates.go:37
-msgid   "{SpaceSharer} invited you to join {SpaceName}"
-msgstr  ""
-
-#. UnsharedSpace email template, Subject field
-#: pkg/email/templates.go:49
-msgid   "{SpaceSharer} removed you from {SpaceName}"
-msgstr  ""
-
+msgid "{SpaceSharer} removed you from {SpaceName}"
+msgstr "{SpaceSharer} hat Sie aus dem Space {SpaceName} entfernt."
diff --git a/services/notifications/pkg/email/l10n/locale/en_GB/LC_MESSAGES/notifications.po b/services/notifications/pkg/email/l10n/locale/en_GB/LC_MESSAGES/notifications.po
index 8b46559ada4..54eb1a2826c 100644
--- a/services/notifications/pkg/email/l10n/locale/en_GB/LC_MESSAGES/notifications.po
+++ b/services/notifications/pkg/email/l10n/locale/en_GB/LC_MESSAGES/notifications.po
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-05-01 00:16+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-04-19 11:11+0000\n"
 "Last-Translator: Andi Chandler <andi@gowling.com>, 2023\n"
 "Language-Team: English (United Kingdom) (https://app.transifex.com/owncloud-org/teams/6149/en_GB/)\n"
@@ -22,46 +22,46 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. UnsharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:57
+#: pkg/email/templates.go:61
 msgid "Click here to check it: {ShareLink}"
 msgstr "Click here to check it: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .CallToAction }}
 #. SharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:18 pkg/email/templates.go:43
+#: pkg/email/templates.go:19 pkg/email/templates.go:46
 msgid "Click here to view it: {ShareLink}"
 msgstr "Click here to view it: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:14
+#: pkg/email/templates.go:15
 msgid "Hello {ShareGrantee}"
 msgstr "Hello {ShareGrantee}"
 
 #. ShareExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:26
+#: pkg/email/templates.go:28
 msgid "Hello {ShareGrantee},"
 msgstr "Hello {ShareGrantee},"
 
 #. SharedSpace email template, resolves via {{ .Greeting }}
 #. UnsharedSpace email template, resolves via {{ .Greeting }}
 #. MembershipExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:39 pkg/email/templates.go:51
-#: pkg/email/templates.go:65
+#: pkg/email/templates.go:42 pkg/email/templates.go:55
+#: pkg/email/templates.go:70
 msgid "Hello {SpaceGrantee},"
 msgstr "Hello {SpaceGrantee},"
 
 #. MembershipExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:63
+#: pkg/email/templates.go:68
 msgid "Membership of '{SpaceName}' expired at {ExpiredAt}"
 msgstr "Membership of '{SpaceName}' expired at {ExpiredAt}"
 
 #. ShareExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:24
+#: pkg/email/templates.go:26
 msgid "Share to '{ShareFolder}' expired at {ExpiredAt}"
 msgstr "Share to '{ShareFolder}' expired at {ExpiredAt}"
 
 #. MembershipExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:67
+#: pkg/email/templates.go:72
 msgid ""
 "Your membership of space {SpaceName} has expired at {ExpiredAt}\n"
 "\n"
@@ -72,7 +72,7 @@ msgstr ""
 "Even though this membership has expired you still might have access through other shares and/or space memberships"
 
 #. ShareExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:28
+#: pkg/email/templates.go:30
 msgid ""
 "Your share to {ShareFolder} has expired at {ExpiredAt}\n"
 "\n"
@@ -83,22 +83,22 @@ msgstr ""
 "Even though this share has been revoked you still might have access through other shares and/or space memberships."
 
 #. ShareCreated email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:16
+#: pkg/email/templates.go:17
 msgid "{ShareSharer} has shared \"{ShareFolder}\" with you."
 msgstr "{ShareSharer} has shared \"{ShareFolder}\" with you."
 
 #. ShareCreated email template, Subject field (resolves directly)
-#: pkg/email/templates.go:12
+#: pkg/email/templates.go:13
 msgid "{ShareSharer} shared '{ShareFolder}' with you"
 msgstr "{ShareSharer} shared '{ShareFolder}' with you"
 
 #. SharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:41
+#: pkg/email/templates.go:44
 msgid "{SpaceSharer} has invited you to join \"{SpaceName}\"."
 msgstr "{SpaceSharer} has invited you to join \"{SpaceName}\"."
 
 #. UnsharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:53
+#: pkg/email/templates.go:57
 msgid ""
 "{SpaceSharer} has removed you from \"{SpaceName}\".\n"
 "\n"
@@ -109,11 +109,11 @@ msgstr ""
 "You might still have access through your other groups or direct membership."
 
 #. SharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:37
+#: pkg/email/templates.go:40
 msgid "{SpaceSharer} invited you to join {SpaceName}"
 msgstr "{SpaceSharer} invited you to join {SpaceName}"
 
 #. UnsharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:49
+#: pkg/email/templates.go:53
 msgid "{SpaceSharer} removed you from {SpaceName}"
 msgstr "{SpaceSharer} removed you from {SpaceName}"
diff --git a/services/notifications/pkg/email/l10n/locale/es/LC_MESSAGES/notifications.po b/services/notifications/pkg/email/l10n/locale/es/LC_MESSAGES/notifications.po
index dbad9551808..415a3ba9090 100644
--- a/services/notifications/pkg/email/l10n/locale/es/LC_MESSAGES/notifications.po
+++ b/services/notifications/pkg/email/l10n/locale/es/LC_MESSAGES/notifications.po
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-04-20 04:03+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-04-19 11:11+0000\n"
 "Last-Translator: Juan Carlos Garrote, 2023\n"
 "Language-Team: Spanish (https://app.transifex.com/owncloud-org/teams/6149/es/)\n"
@@ -22,46 +22,46 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
 
 #. UnsharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:57
+#: pkg/email/templates.go:61
 msgid "Click here to check it: {ShareLink}"
 msgstr "Click aquí para comprobarlo: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .CallToAction }}
 #. SharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:18 pkg/email/templates.go:43
+#: pkg/email/templates.go:19 pkg/email/templates.go:46
 msgid "Click here to view it: {ShareLink}"
 msgstr "Click aquí para verlo: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:14
+#: pkg/email/templates.go:15
 msgid "Hello {ShareGrantee}"
 msgstr "Hola {ShareGrantee}"
 
 #. ShareExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:26
+#: pkg/email/templates.go:28
 msgid "Hello {ShareGrantee},"
 msgstr "Hola {ShareGrantee},"
 
 #. SharedSpace email template, resolves via {{ .Greeting }}
 #. UnsharedSpace email template, resolves via {{ .Greeting }}
 #. MembershipExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:39 pkg/email/templates.go:51
-#: pkg/email/templates.go:65
+#: pkg/email/templates.go:42 pkg/email/templates.go:55
+#: pkg/email/templates.go:70
 msgid "Hello {SpaceGrantee},"
 msgstr "Hola {SpaceGrantee},"
 
 #. MembershipExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:63
+#: pkg/email/templates.go:68
 msgid "Membership of '{SpaceName}' expired at {ExpiredAt}"
 msgstr "La membresía de '{SpaceName}' caducó en {ExpiredAt}"
 
 #. ShareExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:24
+#: pkg/email/templates.go:26
 msgid "Share to '{ShareFolder}' expired at {ExpiredAt}"
 msgstr "La compartición a '{ShareFolder}' caducó en {ExpiredAt}"
 
 #. MembershipExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:67
+#: pkg/email/templates.go:72
 msgid ""
 "Your membership of space {SpaceName} has expired at {ExpiredAt}\n"
 "\n"
@@ -72,7 +72,7 @@ msgstr ""
 "Aunque esta membresía ha caducado, aún puedes tener acceso a través de otras comparticiones y/o membresías al space"
 
 #. ShareExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:28
+#: pkg/email/templates.go:30
 msgid ""
 "Your share to {ShareFolder} has expired at {ExpiredAt}\n"
 "\n"
@@ -83,22 +83,22 @@ msgstr ""
 "Aunque esta compartición ha sido anulada, aún puedes tener acceso a través de otras comparticiones y/o membresías al space."
 
 #. ShareCreated email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:16
+#: pkg/email/templates.go:17
 msgid "{ShareSharer} has shared \"{ShareFolder}\" with you."
 msgstr "{ShareSharer} ha compartido \"{ShareFolder}\" contigo."
 
 #. ShareCreated email template, Subject field (resolves directly)
-#: pkg/email/templates.go:12
+#: pkg/email/templates.go:13
 msgid "{ShareSharer} shared '{ShareFolder}' with you"
 msgstr "{ShareSharer} compartió '{ShareFolder}' contigo"
 
 #. SharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:41
+#: pkg/email/templates.go:44
 msgid "{SpaceSharer} has invited you to join \"{SpaceName}\"."
 msgstr "{SpaceSharer} te ha invitado a unirte a \"{SpaceName}\"."
 
 #. UnsharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:53
+#: pkg/email/templates.go:57
 msgid ""
 "{SpaceSharer} has removed you from \"{SpaceName}\".\n"
 "\n"
@@ -109,11 +109,11 @@ msgstr ""
 "Aún puedes tener acceso a través de tus otros grupos o membresía directa."
 
 #. SharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:37
+#: pkg/email/templates.go:40
 msgid "{SpaceSharer} invited you to join {SpaceName}"
 msgstr "{SpaceSharer} te invitó a unirte a {SpaceName}"
 
 #. UnsharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:49
+#: pkg/email/templates.go:53
 msgid "{SpaceSharer} removed you from {SpaceName}"
 msgstr "{SpaceSharer} te eliminó de {SpaceName}"
diff --git a/services/notifications/pkg/email/l10n/locale/ko/LC_MESSAGES/notifications.po b/services/notifications/pkg/email/l10n/locale/ko/LC_MESSAGES/notifications.po
index 5721f9ae650..7c8fbeb1c20 100644
--- a/services/notifications/pkg/email/l10n/locale/ko/LC_MESSAGES/notifications.po
+++ b/services/notifications/pkg/email/l10n/locale/ko/LC_MESSAGES/notifications.po
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-04-23 00:34+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-04-19 11:11+0000\n"
 "Last-Translator: Hugo Blackwood, 2023\n"
 "Language-Team: Korean (https://app.transifex.com/owncloud-org/teams/6149/ko/)\n"
@@ -22,46 +22,46 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #. UnsharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:57
+#: pkg/email/templates.go:61
 msgid "Click here to check it: {ShareLink}"
 msgstr "여기를 클릭하여 확인: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .CallToAction }}
 #. SharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:18 pkg/email/templates.go:43
+#: pkg/email/templates.go:19 pkg/email/templates.go:46
 msgid "Click here to view it: {ShareLink}"
 msgstr "여기를 클릭하여 보기: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:14
+#: pkg/email/templates.go:15
 msgid "Hello {ShareGrantee}"
 msgstr "안녕하세요, {ShareGrantee} 님"
 
 #. ShareExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:26
+#: pkg/email/templates.go:28
 msgid "Hello {ShareGrantee},"
 msgstr "안녕하세요, {ShareGrantee} 님,"
 
 #. SharedSpace email template, resolves via {{ .Greeting }}
 #. UnsharedSpace email template, resolves via {{ .Greeting }}
 #. MembershipExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:39 pkg/email/templates.go:51
-#: pkg/email/templates.go:65
+#: pkg/email/templates.go:42 pkg/email/templates.go:55
+#: pkg/email/templates.go:70
 msgid "Hello {SpaceGrantee},"
 msgstr "안녕하세요, {SpaceGrantee} 님,"
 
 #. MembershipExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:63
+#: pkg/email/templates.go:68
 msgid "Membership of '{SpaceName}' expired at {ExpiredAt}"
 msgstr "'{SpaceName}' 멤버십이 {ExpiredAt} 일자에 만료됨"
 
 #. ShareExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:24
+#: pkg/email/templates.go:26
 msgid "Share to '{ShareFolder}' expired at {ExpiredAt}"
 msgstr "'{ShareFolder}' 공유가 {ExpiredAt} 일자에 만료됨"
 
 #. MembershipExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:67
+#: pkg/email/templates.go:72
 msgid ""
 "Your membership of space {SpaceName} has expired at {ExpiredAt}\n"
 "\n"
@@ -72,7 +72,7 @@ msgstr ""
 "멤버십이 만료되더라도 다른 공유 및/또는 스페이스 멤버십에 접근이 가능할 수도 있습니다."
 
 #. ShareExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:28
+#: pkg/email/templates.go:30
 msgid ""
 "Your share to {ShareFolder} has expired at {ExpiredAt}\n"
 "\n"
@@ -83,22 +83,22 @@ msgstr ""
 "멤버십이 만료되더라도 다른 공유 및/또는 스페이스 멤버십에 접근이 가능할 수도 있습니다."
 
 #. ShareCreated email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:16
+#: pkg/email/templates.go:17
 msgid "{ShareSharer} has shared \"{ShareFolder}\" with you."
 msgstr "{ShareSharer} 님이 \"{ShareFolder}\" 폴더를 나와 공유했습니다."
 
 #. ShareCreated email template, Subject field (resolves directly)
-#: pkg/email/templates.go:12
+#: pkg/email/templates.go:13
 msgid "{ShareSharer} shared '{ShareFolder}' with you"
 msgstr "{ShareSharer} 님이 \"{ShareFolder}\" 폴더를 나와 공유함"
 
 #. SharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:41
+#: pkg/email/templates.go:44
 msgid "{SpaceSharer} has invited you to join \"{SpaceName}\"."
 msgstr "{SpaceSharer} 님이 \"{SpaceName}\" 스페이스에 나를 초대했습니다."
 
 #. UnsharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:53
+#: pkg/email/templates.go:57
 msgid ""
 "{SpaceSharer} has removed you from \"{SpaceName}\".\n"
 "\n"
@@ -109,11 +109,11 @@ msgstr ""
 "다른 그룹 또는 직접 멤버십을 통해 접근이 가능할 수도 있습니다."
 
 #. SharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:37
+#: pkg/email/templates.go:40
 msgid "{SpaceSharer} invited you to join {SpaceName}"
 msgstr "{SpaceSharer} 님이 {SpaceName} 스페이스에 나를 초대함"
 
 #. UnsharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:49
+#: pkg/email/templates.go:53
 msgid "{SpaceSharer} removed you from {SpaceName}"
 msgstr "{SpaceSharer} 님이 {SpaceName} 스페이스에서 나를 제거함"
diff --git a/services/notifications/pkg/email/l10n/locale/pt_BR/LC_MESSAGES/notifications.po b/services/notifications/pkg/email/l10n/locale/pt_BR/LC_MESSAGES/notifications.po
index a395e8b5865..8ddfe42afb8 100644
--- a/services/notifications/pkg/email/l10n/locale/pt_BR/LC_MESSAGES/notifications.po
+++ b/services/notifications/pkg/email/l10n/locale/pt_BR/LC_MESSAGES/notifications.po
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-04-27 00:19+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-04-19 11:11+0000\n"
 "Last-Translator: Flávio Veras <flaviove@gmail.com>, 2023\n"
 "Language-Team: Portuguese (Brazil) (https://app.transifex.com/owncloud-org/teams/6149/pt_BR/)\n"
@@ -22,46 +22,46 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
 
 #. UnsharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:57
+#: pkg/email/templates.go:61
 msgid "Click here to check it: {ShareLink}"
 msgstr "Clique aqui para conferir: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .CallToAction }}
 #. SharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:18 pkg/email/templates.go:43
+#: pkg/email/templates.go:19 pkg/email/templates.go:46
 msgid "Click here to view it: {ShareLink}"
 msgstr "Clique aqui para visualizá-lo: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:14
+#: pkg/email/templates.go:15
 msgid "Hello {ShareGrantee}"
 msgstr "Olá {ShareGrantee}"
 
 #. ShareExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:26
+#: pkg/email/templates.go:28
 msgid "Hello {ShareGrantee},"
 msgstr "Olá {ShareGrantee},"
 
 #. SharedSpace email template, resolves via {{ .Greeting }}
 #. UnsharedSpace email template, resolves via {{ .Greeting }}
 #. MembershipExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:39 pkg/email/templates.go:51
-#: pkg/email/templates.go:65
+#: pkg/email/templates.go:42 pkg/email/templates.go:55
+#: pkg/email/templates.go:70
 msgid "Hello {SpaceGrantee},"
 msgstr "Olá {SpaceGrantee},"
 
 #. MembershipExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:63
+#: pkg/email/templates.go:68
 msgid "Membership of '{SpaceName}' expired at {ExpiredAt}"
 msgstr "A assinatura de '{SpaceName}' expirou em {ExpiredAt}"
 
 #. ShareExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:24
+#: pkg/email/templates.go:26
 msgid "Share to '{ShareFolder}' expired at {ExpiredAt}"
 msgstr "Compartilhar em '{ShareFolder}' expirou em {ExpiredAt}"
 
 #. MembershipExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:67
+#: pkg/email/templates.go:72
 msgid ""
 "Your membership of space {SpaceName} has expired at {ExpiredAt}\n"
 "\n"
@@ -72,7 +72,7 @@ msgstr ""
 "Mesmo que esta assinatura tenha expirado, você ainda pode ter acesso por meio de outros compartilhamentos e/ou assinaturas de espaço"
 
 #. ShareExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:28
+#: pkg/email/templates.go:30
 msgid ""
 "Your share to {ShareFolder} has expired at {ExpiredAt}\n"
 "\n"
@@ -83,22 +83,22 @@ msgstr ""
 "Mesmo que este compartilhamento tenha sido revogado, você ainda pode ter acesso por meio de outros compartilhamentos e/ou associações de espaço."
 
 #. ShareCreated email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:16
+#: pkg/email/templates.go:17
 msgid "{ShareSharer} has shared \"{ShareFolder}\" with you."
 msgstr "{ShareSharer} compartilhou \"{ShareFolder}\" com você."
 
 #. ShareCreated email template, Subject field (resolves directly)
-#: pkg/email/templates.go:12
+#: pkg/email/templates.go:13
 msgid "{ShareSharer} shared '{ShareFolder}' with you"
 msgstr "{ShareSharer} compartilhou '{ShareFolder}' com você"
 
 #. SharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:41
+#: pkg/email/templates.go:44
 msgid "{SpaceSharer} has invited you to join \"{SpaceName}\"."
 msgstr "{SpaceSharer} convidou você para participar de \"{SpaceName}\"."
 
 #. UnsharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:53
+#: pkg/email/templates.go:57
 msgid ""
 "{SpaceSharer} has removed you from \"{SpaceName}\".\n"
 "\n"
@@ -109,11 +109,11 @@ msgstr ""
 "Você ainda pode ter acesso por meio de outros grupos ou associação direta."
 
 #. SharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:37
+#: pkg/email/templates.go:40
 msgid "{SpaceSharer} invited you to join {SpaceName}"
 msgstr "{SpaceSharer} convidou você para participar de {SpaceName}"
 
 #. UnsharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:49
+#: pkg/email/templates.go:53
 msgid "{SpaceSharer} removed you from {SpaceName}"
 msgstr "{SpaceSharer} removeu você de {SpaceName}"
diff --git a/services/notifications/pkg/email/l10n/locale/ru/LC_MESSAGES/notifications.po b/services/notifications/pkg/email/l10n/locale/ru/LC_MESSAGES/notifications.po
index ee12d025599..ea3a6c26adc 100644
--- a/services/notifications/pkg/email/l10n/locale/ru/LC_MESSAGES/notifications.po
+++ b/services/notifications/pkg/email/l10n/locale/ru/LC_MESSAGES/notifications.po
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-05-04 00:25+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-04-19 11:11+0000\n"
 "Last-Translator: Roman Perekhod, 2023\n"
 "Language-Team: Russian (https://app.transifex.com/owncloud-org/teams/6149/ru/)\n"
@@ -69,7 +69,7 @@ msgid ""
 msgstr ""
 "Срок действия вашего членства в пространстве {SpaceName} истёк {ExpiredAt}\n"
 "\n"
-"Несмотря на то, что срок действия этого членства истёк, у вас все еще может быть доступ через другие общие ресурсы и/или членство в пространстве."
+"Несмотря на то, что срок действия членства истёк, у вас все еще может быть доступ через другие общие ресурсы и/или членство в пространстве."
 
 #. ShareExpired email template, resolves via {{ .MessageBody }}
 #: pkg/email/templates.go:30
diff --git a/services/notifications/pkg/email/l10n/locale/sq/LC_MESSAGES/notifications.po b/services/notifications/pkg/email/l10n/locale/sq/LC_MESSAGES/notifications.po
index bb8c2163987..6490d645f39 100644
--- a/services/notifications/pkg/email/l10n/locale/sq/LC_MESSAGES/notifications.po
+++ b/services/notifications/pkg/email/l10n/locale/sq/LC_MESSAGES/notifications.po
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-04-23 00:34+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-04-19 11:11+0000\n"
 "Last-Translator: Besnik Bleta <besnik@programeshqip.org>, 2023\n"
 "Language-Team: Albanian (https://app.transifex.com/owncloud-org/teams/6149/sq/)\n"
@@ -22,46 +22,46 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. UnsharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:57
+#: pkg/email/templates.go:61
 msgid "Click here to check it: {ShareLink}"
 msgstr ""
 
 #. ShareCreated email template, resolves via {{ .CallToAction }}
 #. SharedSpace email template, resolves via {{ .CallToAction }}
-#: pkg/email/templates.go:18 pkg/email/templates.go:43
+#: pkg/email/templates.go:19 pkg/email/templates.go:46
 msgid "Click here to view it: {ShareLink}"
 msgstr "Klikoni këtu që ta shihni: {ShareLink}"
 
 #. ShareCreated email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:14
+#: pkg/email/templates.go:15
 msgid "Hello {ShareGrantee}"
 msgstr "Tungjatjeta {ShareGrantee}"
 
 #. ShareExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:26
+#: pkg/email/templates.go:28
 msgid "Hello {ShareGrantee},"
 msgstr "Tungjatjeta {ShareGrantee},"
 
 #. SharedSpace email template, resolves via {{ .Greeting }}
 #. UnsharedSpace email template, resolves via {{ .Greeting }}
 #. MembershipExpired email template, resolves via {{ .Greeting }}
-#: pkg/email/templates.go:39 pkg/email/templates.go:51
-#: pkg/email/templates.go:65
+#: pkg/email/templates.go:42 pkg/email/templates.go:55
+#: pkg/email/templates.go:70
 msgid "Hello {SpaceGrantee},"
 msgstr "Tungjatjeta {SpaceGrantee},"
 
 #. MembershipExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:63
+#: pkg/email/templates.go:68
 msgid "Membership of '{SpaceName}' expired at {ExpiredAt}"
 msgstr "Anëtarësia në '{SpaceName}' skadoi më {ExpiredAt}"
 
 #. ShareExpired email template, Subject field (resolves directly)
-#: pkg/email/templates.go:24
+#: pkg/email/templates.go:26
 msgid "Share to '{ShareFolder}' expired at {ExpiredAt}"
 msgstr "Pjesa te “{ShareFolder}” skadoi më {ExpiredAt}"
 
 #. MembershipExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:67
+#: pkg/email/templates.go:72
 msgid ""
 "Your membership of space {SpaceName} has expired at {ExpiredAt}\n"
 "\n"
@@ -72,7 +72,7 @@ msgstr ""
 "Edhe pse kjo anëtarësi ka skaduar, mundet që ende të keni hyrje në të përmes ndarjesh dhe/ose anëtarësish hapësirash të tjera"
 
 #. ShareExpired email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:28
+#: pkg/email/templates.go:30
 msgid ""
 "Your share to {ShareFolder} has expired at {ExpiredAt}\n"
 "\n"
@@ -83,22 +83,22 @@ msgstr ""
 "Edhe pse kjo pjesë është shfuqizuar, mundet që ende të keni hyrje në të përmes ndarjesh dhe/ose anëtarësish hapësirash të tjera."
 
 #. ShareCreated email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:16
+#: pkg/email/templates.go:17
 msgid "{ShareSharer} has shared \"{ShareFolder}\" with you."
 msgstr "{ShareSharer} ka ndarë “{ShareFolder}” me ju."
 
 #. ShareCreated email template, Subject field (resolves directly)
-#: pkg/email/templates.go:12
+#: pkg/email/templates.go:13
 msgid "{ShareSharer} shared '{ShareFolder}' with you"
 msgstr "{ShareSharer} ndau “{ShareFolder}” me ju"
 
 #. SharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:41
+#: pkg/email/templates.go:44
 msgid "{SpaceSharer} has invited you to join \"{SpaceName}\"."
 msgstr "{SpaceSharer} ju ka ftuar të merrni pjesë në “{SpaceName}”."
 
 #. UnsharedSpace email template, resolves via {{ .MessageBody }}
-#: pkg/email/templates.go:53
+#: pkg/email/templates.go:57
 msgid ""
 "{SpaceSharer} has removed you from \"{SpaceName}\".\n"
 "\n"
@@ -109,11 +109,11 @@ msgstr ""
 "Mundet që ende të keni hyrje në të përmes grupeve tuaja të tjera, ose anëtarësimi të drejtpërdrejtë."
 
 #. SharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:37
+#: pkg/email/templates.go:40
 msgid "{SpaceSharer} invited you to join {SpaceName}"
 msgstr "{SpaceSharer} ju ftoi të merrni pjesë në {SpaceName}"
 
 #. UnsharedSpace email template, Subject field (resolves directly)
-#: pkg/email/templates.go:49
+#: pkg/email/templates.go:53
 msgid "{SpaceSharer} removed you from {SpaceName}"
 msgstr "{SpaceSharer} ju hoqi nga {SpaceName}"
diff --git a/services/userlog/Makefile b/services/userlog/Makefile
index 60a1ed7f308..094b1187e71 100644
--- a/services/userlog/Makefile
+++ b/services/userlog/Makefile
@@ -37,7 +37,7 @@ ci-node-generate:
 ############ translations ########
 .PHONY: l10n-pull
 l10n-pull:
-	cd $(OUTPUT_DIR) && tx pull -a --skip --minimum-perc=75
+	cd $(OUTPUT_DIR) && tx pull --all --force --skip --minimum-perc=75
 
 .PHONY: l10n-push
 l10n-push:
diff --git a/services/userlog/pkg/service/l10n/locale/bg_BG/LC_MESSAGES/userlog.po b/services/userlog/pkg/service/l10n/locale/bg_BG/LC_MESSAGES/userlog.po
index 9c14bdcd7b4..7b3c456f2ce 100644
--- a/services/userlog/pkg/service/l10n/locale/bg_BG/LC_MESSAGES/userlog.po
+++ b/services/userlog/pkg/service/l10n/locale/bg_BG/LC_MESSAGES/userlog.po
@@ -11,53 +11,61 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-03-24 00:59+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-03-15 08:28+0000\n"
 "Last-Translator: Martin Zhekov <martin03staff@gmail.com>, 2023\n"
-"Language-Team: Bulgarian (Bulgaria) (https://www.transifex.com/owncloud-org/teams/6149/bg_BG/)\n"
+"Language-Team: Bulgarian (Bulgaria) (https://app.transifex.com/owncloud-org/teams/6149/bg_BG/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: bg_BG\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: pkg/service/templates.go:34
+#: pkg/service/templates.go:40
 msgid "Access to Space {space} lost"
 msgstr "Достъпът до пространството {space} е изгубен"
 
-#: pkg/service/templates.go:49
+#: pkg/service/templates.go:55
 msgid "Access to {resource} expired"
 msgstr "Достъпът до {resource} е изтекъл"
 
-#: pkg/service/templates.go:33
+#: pkg/service/templates.go:15
+msgid "File {resource} was deleted because it violates the policies"
+msgstr ""
+
+#: pkg/service/templates.go:39
 msgid "Membership expired"
 msgstr "Срокът на членство е изтекъл"
 
-#: pkg/service/templates.go:18
+#: pkg/service/templates.go:14
+msgid "Policies enforced"
+msgstr ""
+
+#: pkg/service/templates.go:24
 msgid "Removed from Space"
 msgstr "Премахнато от пространството"
 
-#: pkg/service/templates.go:38
+#: pkg/service/templates.go:44
 msgid "Resource shared"
 msgstr "Ресурсът е споделен"
 
-#: pkg/service/templates.go:43
+#: pkg/service/templates.go:49
 msgid "Resource unshared"
 msgstr "Ресурсът не е споделен"
 
-#: pkg/service/templates.go:48
+#: pkg/service/templates.go:54
 msgid "Share expired"
 msgstr "Срокът на споделяне е изтекъл"
 
-#: pkg/service/templates.go:28
+#: pkg/service/templates.go:34
 msgid "Space deleted"
 msgstr "Пространството е изтрито"
 
-#: pkg/service/templates.go:23
+#: pkg/service/templates.go:29
 msgid "Space disabled"
 msgstr "Пространството е деактивирано"
 
-#: pkg/service/templates.go:13
+#: pkg/service/templates.go:19
 msgid "Space shared"
 msgstr "Пространството е споделено"
 
@@ -69,26 +77,26 @@ msgstr ""
 msgid "Virus found in {resource}. Upload not possible. Virus: {virus}"
 msgstr ""
 
-#: pkg/service/templates.go:14
+#: pkg/service/templates.go:20
 msgid "{user} added you to Space {space}"
 msgstr "{user} ви добави в пространството {space}"
 
-#: pkg/service/templates.go:29
+#: pkg/service/templates.go:35
 msgid "{user} deleted Space {space}"
 msgstr "{user} изтри пространство {space}"
 
-#: pkg/service/templates.go:24
+#: pkg/service/templates.go:30
 msgid "{user} disabled Space {space}"
 msgstr "{user} деактивира пространството {space}"
 
-#: pkg/service/templates.go:19
+#: pkg/service/templates.go:25
 msgid "{user} removed you from Space {space}"
 msgstr "{user} ви премахна от пространството {space}"
 
-#: pkg/service/templates.go:39
+#: pkg/service/templates.go:45
 msgid "{user} shared {resource} with you"
 msgstr "{user} сподели {resource} с вас"
 
-#: pkg/service/templates.go:44
+#: pkg/service/templates.go:50
 msgid "{user} unshared {resource} with you"
 msgstr "{user} прекрати споделянето на {resource} с вас"
diff --git a/services/userlog/pkg/service/l10n/locale/de/LC_MESSAGES/userlog.po b/services/userlog/pkg/service/l10n/locale/de/LC_MESSAGES/userlog.po
index f84b1d47860..e3f54762d7a 100644
--- a/services/userlog/pkg/service/l10n/locale/de/LC_MESSAGES/userlog.po
+++ b/services/userlog/pkg/service/l10n/locale/de/LC_MESSAGES/userlog.po
@@ -5,82 +5,102 @@
 # 
 # Translators:
 # Michael Barz <mbarz@owncloud.com>, 2023
+# hurradieweltgehtunter <florian@owncloud.com>, 2023
 # 
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-03-15 09:23+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-03-15 08:28+0000\n"
-"Last-Translator: Michael Barz <mbarz@owncloud.com>, 2023\n"
-"Language-Team: German (https://www.transifex.com/owncloud-org/teams/6149/de/)\n"
+"Last-Translator: hurradieweltgehtunter <florian@owncloud.com>, 2023\n"
+"Language-Team: German (https://app.transifex.com/owncloud-org/teams/6149/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: pkg/service/templates.go:30
+#: pkg/service/templates.go:40
 msgid "Access to Space {space} lost"
-msgstr "Der Zugriff zu dem Space {space} wurde entfernt"
+msgstr "Ihr Zugriff auf Space {space} ist abgelaufen."
 
-#: pkg/service/templates.go:45
+#: pkg/service/templates.go:55
 msgid "Access to {resource} expired"
-msgstr "Der Zugriff auf {resource} ist abgelaufen"
+msgstr "Ihr Zugriff auf {resource} ist abgelaufen."
 
-#: pkg/service/templates.go:29
+#: pkg/service/templates.go:15
+msgid "File {resource} was deleted because it violates the policies"
+msgstr ""
+"Datei {resource} wurde gelöscht, weil sie gegen die Richtlinien verstößt."
+
+#: pkg/service/templates.go:39
 msgid "Membership expired"
 msgstr "Mitgliedschaft abgelaufen"
 
 #: pkg/service/templates.go:14
+msgid "Policies enforced"
+msgstr "Verstoß gegen Richtlinien"
+
+#: pkg/service/templates.go:24
 msgid "Removed from Space"
-msgstr "Aus dem Space entfernt"
+msgstr "Sie wurden aus einem Space entfernt"
 
-#: pkg/service/templates.go:34
+#: pkg/service/templates.go:44
 msgid "Resource shared"
-msgstr "Ressource geteilt"
+msgstr "Neue Freigabe"
 
-#: pkg/service/templates.go:39
+#: pkg/service/templates.go:49
 msgid "Resource unshared"
-msgstr "Resource nicht mehr geteilt"
+msgstr "Freigabe entfernt"
 
-#: pkg/service/templates.go:44
+#: pkg/service/templates.go:54
 msgid "Share expired"
 msgstr "Freigabe abgelaufen"
 
-#: pkg/service/templates.go:24
+#: pkg/service/templates.go:34
 msgid "Space deleted"
 msgstr "Space gelöscht"
 
-#: pkg/service/templates.go:19
+#: pkg/service/templates.go:29
 msgid "Space disabled"
 msgstr "Space deaktiviert"
 
-#: pkg/service/templates.go:9
+#: pkg/service/templates.go:19
 msgid "Space shared"
 msgstr "Space freigegeben"
 
+#: pkg/service/templates.go:9
+msgid "Virus found"
+msgstr "Virus gefunden"
+
 #: pkg/service/templates.go:10
+msgid "Virus found in {resource}. Upload not possible. Virus: {virus}"
+msgstr ""
+"In {resource} wurde potenziell schädlicher Code gefunden. Das Hochladen wurde abgebrochen.\n"
+"Grund: {virus}"
+
+#: pkg/service/templates.go:20
 msgid "{user} added you to Space {space}"
-msgstr "{user} hat Sie zum Space {space} hinzugefügt"
+msgstr "{user} hat Sie zu Space {space} hinzugefügt"
 
-#: pkg/service/templates.go:25
+#: pkg/service/templates.go:35
 msgid "{user} deleted Space {space}"
-msgstr "{user} hat den Space {space} gelöscht"
+msgstr "{user} hat Space {space} gelöscht"
 
-#: pkg/service/templates.go:20
+#: pkg/service/templates.go:30
 msgid "{user} disabled Space {space}"
-msgstr "{user} hat den Space {space} deaktiviert"
+msgstr "{user} hat Space {space} deaktiviert"
 
-#: pkg/service/templates.go:15
+#: pkg/service/templates.go:25
 msgid "{user} removed you from Space {space}"
-msgstr "{user} hat Sie aus dem Space {space} entfernt"
+msgstr "{user} hat Sie aus Space {space} entfernt."
 
-#: pkg/service/templates.go:35
+#: pkg/service/templates.go:45
 msgid "{user} shared {resource} with you"
 msgstr "{user} hat {resource} mit Ihnen geteilt"
 
-#: pkg/service/templates.go:40
+#: pkg/service/templates.go:50
 msgid "{user} unshared {resource} with you"
-msgstr "{user} hat die Freigabe {resource} für Sie zurückgenommen"
+msgstr "{user} hat die Freigabe auf {resource} für Sie aufgehoben"
diff --git a/services/userlog/pkg/service/l10n/locale/de_DE/LC_MESSAGES/userlog.po b/services/userlog/pkg/service/l10n/locale/de_DE/LC_MESSAGES/userlog.po
index 7ec52fef64c..e840623897c 100644
--- a/services/userlog/pkg/service/l10n/locale/de_DE/LC_MESSAGES/userlog.po
+++ b/services/userlog/pkg/service/l10n/locale/de_DE/LC_MESSAGES/userlog.po
@@ -4,6 +4,7 @@
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 # 
 # Translators:
+# Michael Barz <mbarz@owncloud.com>, 2023
 # Edith Parzefall, 2023
 # 
 #, fuzzy
@@ -11,76 +12,93 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-03-15 23:03+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-03-15 08:28+0000\n"
 "Last-Translator: Edith Parzefall, 2023\n"
-"Language-Team: German (Germany) (https://www.transifex.com/owncloud-org/teams/6149/de_DE/)\n"
+"Language-Team: German (Germany) (https://app.transifex.com/owncloud-org/teams/6149/de_DE/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: de_DE\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: pkg/service/templates.go:30
+#: pkg/service/templates.go:40
 msgid "Access to Space {space} lost"
 msgstr "Der Zugriff zu dem Space {space} wurde entfernt"
 
-#: pkg/service/templates.go:45
+#: pkg/service/templates.go:55
 msgid "Access to {resource} expired"
 msgstr "Der Zugriff auf {resource} ist abgelaufen"
 
-#: pkg/service/templates.go:29
+#: pkg/service/templates.go:15
+msgid "File {resource} was deleted because it violates the policies"
+msgstr ""
+"Datei {resource} wurde gelöscht, weil sie gegen Bestimmungen verstößt."
+
+#: pkg/service/templates.go:39
 msgid "Membership expired"
 msgstr "Mitgliedschaft abgelaufen"
 
 #: pkg/service/templates.go:14
+msgid "Policies enforced"
+msgstr "Bestimmungen erzwungen"
+
+#: pkg/service/templates.go:24
 msgid "Removed from Space"
 msgstr "Aus dem Space entfernt"
 
-#: pkg/service/templates.go:34
+#: pkg/service/templates.go:44
 msgid "Resource shared"
 msgstr "Ressource geteilt"
 
-#: pkg/service/templates.go:39
+#: pkg/service/templates.go:49
 msgid "Resource unshared"
 msgstr "Resource nicht mehr geteilt"
 
-#: pkg/service/templates.go:44
+#: pkg/service/templates.go:54
 msgid "Share expired"
 msgstr "Freigabe abgelaufen"
 
-#: pkg/service/templates.go:24
+#: pkg/service/templates.go:34
 msgid "Space deleted"
 msgstr "Space gelöscht"
 
-#: pkg/service/templates.go:19
+#: pkg/service/templates.go:29
 msgid "Space disabled"
 msgstr "Space deaktiviert"
 
-#: pkg/service/templates.go:9
+#: pkg/service/templates.go:19
 msgid "Space shared"
 msgstr "Space freigegeben"
 
+#: pkg/service/templates.go:9
+msgid "Virus found"
+msgstr "Virus gefunden"
+
 #: pkg/service/templates.go:10
+msgid "Virus found in {resource}. Upload not possible. Virus: {virus}"
+msgstr "Virus in {resource} gefunden. Upload nicht möglich. Virus: {virus}"
+
+#: pkg/service/templates.go:20
 msgid "{user} added you to Space {space}"
 msgstr "{user} hat Sie zum Space {space} hinzugefügt"
 
-#: pkg/service/templates.go:25
+#: pkg/service/templates.go:35
 msgid "{user} deleted Space {space}"
 msgstr "{user} hat den Space {space} gelöscht"
 
-#: pkg/service/templates.go:20
+#: pkg/service/templates.go:30
 msgid "{user} disabled Space {space}"
 msgstr "{user} hat den Space {space} deaktiviert"
 
-#: pkg/service/templates.go:15
+#: pkg/service/templates.go:25
 msgid "{user} removed you from Space {space}"
 msgstr "{user} hat Sie aus dem Space {space} entfernt"
 
-#: pkg/service/templates.go:35
+#: pkg/service/templates.go:45
 msgid "{user} shared {resource} with you"
 msgstr "{user} hat {resource} mit Ihnen geteilt"
 
-#: pkg/service/templates.go:40
+#: pkg/service/templates.go:50
 msgid "{user} unshared {resource} with you"
 msgstr "{user} hat die Freigabe {resource} für Sie zurückgenommen"
diff --git a/services/userlog/pkg/service/l10n/locale/en_GB/LC_MESSAGES/userlog.po b/services/userlog/pkg/service/l10n/locale/en_GB/LC_MESSAGES/userlog.po
index 4b686745e2a..a1430600fa9 100644
--- a/services/userlog/pkg/service/l10n/locale/en_GB/LC_MESSAGES/userlog.po
+++ b/services/userlog/pkg/service/l10n/locale/en_GB/LC_MESSAGES/userlog.po
@@ -11,76 +11,92 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-03-19 00:04+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-03-15 08:28+0000\n"
 "Last-Translator: Andi Chandler <andi@gowling.com>, 2023\n"
-"Language-Team: English (United Kingdom) (https://www.transifex.com/owncloud-org/teams/6149/en_GB/)\n"
+"Language-Team: English (United Kingdom) (https://app.transifex.com/owncloud-org/teams/6149/en_GB/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: en_GB\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: pkg/service/templates.go:30
+#: pkg/service/templates.go:40
 msgid "Access to Space {space} lost"
 msgstr "Access to Space {space} lost"
 
-#: pkg/service/templates.go:45
+#: pkg/service/templates.go:55
 msgid "Access to {resource} expired"
 msgstr "Access to {resource} expired"
 
-#: pkg/service/templates.go:29
+#: pkg/service/templates.go:15
+msgid "File {resource} was deleted because it violates the policies"
+msgstr ""
+
+#: pkg/service/templates.go:39
 msgid "Membership expired"
 msgstr "Membership expired"
 
 #: pkg/service/templates.go:14
+msgid "Policies enforced"
+msgstr ""
+
+#: pkg/service/templates.go:24
 msgid "Removed from Space"
 msgstr "Removed from Space"
 
-#: pkg/service/templates.go:34
+#: pkg/service/templates.go:44
 msgid "Resource shared"
 msgstr "Resource shared"
 
-#: pkg/service/templates.go:39
+#: pkg/service/templates.go:49
 msgid "Resource unshared"
 msgstr "Resource unshared"
 
-#: pkg/service/templates.go:44
+#: pkg/service/templates.go:54
 msgid "Share expired"
 msgstr "Share expired"
 
-#: pkg/service/templates.go:24
+#: pkg/service/templates.go:34
 msgid "Space deleted"
 msgstr "Space deleted"
 
-#: pkg/service/templates.go:19
+#: pkg/service/templates.go:29
 msgid "Space disabled"
 msgstr "Space disabled"
 
-#: pkg/service/templates.go:9
+#: pkg/service/templates.go:19
 msgid "Space shared"
 msgstr "Space shared"
 
+#: pkg/service/templates.go:9
+msgid "Virus found"
+msgstr ""
+
 #: pkg/service/templates.go:10
+msgid "Virus found in {resource}. Upload not possible. Virus: {virus}"
+msgstr ""
+
+#: pkg/service/templates.go:20
 msgid "{user} added you to Space {space}"
 msgstr "{user} added you to Space {space}"
 
-#: pkg/service/templates.go:25
+#: pkg/service/templates.go:35
 msgid "{user} deleted Space {space}"
 msgstr "{user} deleted Space {space}"
 
-#: pkg/service/templates.go:20
+#: pkg/service/templates.go:30
 msgid "{user} disabled Space {space}"
 msgstr "{user} disabled Space {space}"
 
-#: pkg/service/templates.go:15
+#: pkg/service/templates.go:25
 msgid "{user} removed you from Space {space}"
 msgstr "{user} removed you from Space {space}"
 
-#: pkg/service/templates.go:35
+#: pkg/service/templates.go:45
 msgid "{user} shared {resource} with you"
 msgstr "{user} shared {resource} with you"
 
-#: pkg/service/templates.go:40
+#: pkg/service/templates.go:50
 msgid "{user} unshared {resource} with you"
 msgstr "{user} unshared {resource} with you"
diff --git a/services/userlog/pkg/service/l10n/locale/es/LC_MESSAGES/userlog.po b/services/userlog/pkg/service/l10n/locale/es/LC_MESSAGES/userlog.po
index 4dc3219d2bb..7ea2c43d185 100644
--- a/services/userlog/pkg/service/l10n/locale/es/LC_MESSAGES/userlog.po
+++ b/services/userlog/pkg/service/l10n/locale/es/LC_MESSAGES/userlog.po
@@ -11,76 +11,93 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-03-18 00:05+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-03-15 08:28+0000\n"
 "Last-Translator: Juan Carlos Garrote, 2023\n"
-"Language-Team: Spanish (https://www.transifex.com/owncloud-org/teams/6149/es/)\n"
+"Language-Team: Spanish (https://app.transifex.com/owncloud-org/teams/6149/es/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: es\n"
 "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
 
-#: pkg/service/templates.go:30
+#: pkg/service/templates.go:40
 msgid "Access to Space {space} lost"
 msgstr "Acceso al Space {space} perdido"
 
-#: pkg/service/templates.go:45
+#: pkg/service/templates.go:55
 msgid "Access to {resource} expired"
 msgstr "Acceso a {resource} expirado"
 
-#: pkg/service/templates.go:29
+#: pkg/service/templates.go:15
+msgid "File {resource} was deleted because it violates the policies"
+msgstr "El archivo {resource} ha sido eliminado porque viola las políticas"
+
+#: pkg/service/templates.go:39
 msgid "Membership expired"
 msgstr "Membresía expirada"
 
 #: pkg/service/templates.go:14
+msgid "Policies enforced"
+msgstr "Políticas forzadas"
+
+#: pkg/service/templates.go:24
 msgid "Removed from Space"
 msgstr "Eliminado del Space"
 
-#: pkg/service/templates.go:34
+#: pkg/service/templates.go:44
 msgid "Resource shared"
 msgstr "Recurso compartido"
 
-#: pkg/service/templates.go:39
+#: pkg/service/templates.go:49
 msgid "Resource unshared"
 msgstr "Recurso no compartido"
 
-#: pkg/service/templates.go:44
+#: pkg/service/templates.go:54
 msgid "Share expired"
 msgstr "La compartición del recurso expiró"
 
-#: pkg/service/templates.go:24
+#: pkg/service/templates.go:34
 msgid "Space deleted"
 msgstr "Space eliminado"
 
-#: pkg/service/templates.go:19
+#: pkg/service/templates.go:29
 msgid "Space disabled"
 msgstr "Space deshabilitado"
 
-#: pkg/service/templates.go:9
+#: pkg/service/templates.go:19
 msgid "Space shared"
 msgstr "Space compartido"
 
+#: pkg/service/templates.go:9
+msgid "Virus found"
+msgstr "Virus encontrado"
+
 #: pkg/service/templates.go:10
+msgid "Virus found in {resource}. Upload not possible. Virus: {virus}"
+msgstr ""
+"Virus encontrado en {resource}. La subida no ha sido posible. Virus: {virus}"
+
+#: pkg/service/templates.go:20
 msgid "{user} added you to Space {space}"
 msgstr "{user} te añadió al Space {space}"
 
-#: pkg/service/templates.go:25
+#: pkg/service/templates.go:35
 msgid "{user} deleted Space {space}"
 msgstr "{user} eliminó el Space {space}"
 
-#: pkg/service/templates.go:20
+#: pkg/service/templates.go:30
 msgid "{user} disabled Space {space}"
 msgstr "{user} deshabilitó el Space {space}"
 
-#: pkg/service/templates.go:15
+#: pkg/service/templates.go:25
 msgid "{user} removed you from Space {space}"
 msgstr "{user} te eliminó del Space {space}"
 
-#: pkg/service/templates.go:35
+#: pkg/service/templates.go:45
 msgid "{user} shared {resource} with you"
 msgstr "{user} compartió {resource} contigo"
 
-#: pkg/service/templates.go:40
+#: pkg/service/templates.go:50
 msgid "{user} unshared {resource} with you"
 msgstr "{user} dejó de compartir {resource} contigo"
diff --git a/services/userlog/pkg/service/l10n/locale/es_AR/LC_MESSAGES/userlog.po b/services/userlog/pkg/service/l10n/locale/es_AR/LC_MESSAGES/userlog.po
index 11cf70e15cf..023b9192f51 100644
--- a/services/userlog/pkg/service/l10n/locale/es_AR/LC_MESSAGES/userlog.po
+++ b/services/userlog/pkg/service/l10n/locale/es_AR/LC_MESSAGES/userlog.po
@@ -11,76 +11,92 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-03-17 00:42+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-03-15 08:28+0000\n"
 "Last-Translator: Toli Bal <tolicapo@gmail.com>, 2023\n"
-"Language-Team: Spanish (Argentina) (https://www.transifex.com/owncloud-org/teams/6149/es_AR/)\n"
+"Language-Team: Spanish (Argentina) (https://app.transifex.com/owncloud-org/teams/6149/es_AR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: es_AR\n"
 "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
 
-#: pkg/service/templates.go:30
+#: pkg/service/templates.go:40
 msgid "Access to Space {space} lost"
 msgstr "Acceso al espacio {space} perdido"
 
-#: pkg/service/templates.go:45
+#: pkg/service/templates.go:55
 msgid "Access to {resource} expired"
 msgstr "Acceso a {resource} expirado"
 
-#: pkg/service/templates.go:29
+#: pkg/service/templates.go:15
+msgid "File {resource} was deleted because it violates the policies"
+msgstr ""
+
+#: pkg/service/templates.go:39
 msgid "Membership expired"
 msgstr "Membresía expirada"
 
 #: pkg/service/templates.go:14
+msgid "Policies enforced"
+msgstr ""
+
+#: pkg/service/templates.go:24
 msgid "Removed from Space"
 msgstr "Quitado del Espacio"
 
-#: pkg/service/templates.go:34
+#: pkg/service/templates.go:44
 msgid "Resource shared"
 msgstr "Recurso compartido"
 
-#: pkg/service/templates.go:39
+#: pkg/service/templates.go:49
 msgid "Resource unshared"
 msgstr "Recurso privado"
 
-#: pkg/service/templates.go:44
+#: pkg/service/templates.go:54
 msgid "Share expired"
 msgstr "Compartido expirado"
 
-#: pkg/service/templates.go:24
+#: pkg/service/templates.go:34
 msgid "Space deleted"
 msgstr "Espacio eliminado"
 
-#: pkg/service/templates.go:19
+#: pkg/service/templates.go:29
 msgid "Space disabled"
 msgstr "Espacio deshabilitado"
 
-#: pkg/service/templates.go:9
+#: pkg/service/templates.go:19
 msgid "Space shared"
 msgstr "Espacio compartido"
 
+#: pkg/service/templates.go:9
+msgid "Virus found"
+msgstr ""
+
 #: pkg/service/templates.go:10
+msgid "Virus found in {resource}. Upload not possible. Virus: {virus}"
+msgstr ""
+
+#: pkg/service/templates.go:20
 msgid "{user} added you to Space {space}"
 msgstr "{user} Te ha añadido al Espacio {space}"
 
-#: pkg/service/templates.go:25
+#: pkg/service/templates.go:35
 msgid "{user} deleted Space {space}"
 msgstr "{user} eliminado del Espacio {space}"
 
-#: pkg/service/templates.go:20
+#: pkg/service/templates.go:30
 msgid "{user} disabled Space {space}"
 msgstr "{user} desactivado del Espacio {space}"
 
-#: pkg/service/templates.go:15
+#: pkg/service/templates.go:25
 msgid "{user} removed you from Space {space}"
 msgstr "{user} te ha quitado del Espacio {space}"
 
-#: pkg/service/templates.go:35
+#: pkg/service/templates.go:45
 msgid "{user} shared {resource} with you"
 msgstr "{user} ha compartido {resource} contigo"
 
-#: pkg/service/templates.go:40
+#: pkg/service/templates.go:50
 msgid "{user} unshared {resource} with you"
 msgstr "{user} ha bloqueado tu acceso a {resource}"
diff --git a/services/userlog/pkg/service/l10n/locale/ko/LC_MESSAGES/userlog.po b/services/userlog/pkg/service/l10n/locale/ko/LC_MESSAGES/userlog.po
index c0af8c4a5b8..6b2fa9ef042 100644
--- a/services/userlog/pkg/service/l10n/locale/ko/LC_MESSAGES/userlog.po
+++ b/services/userlog/pkg/service/l10n/locale/ko/LC_MESSAGES/userlog.po
@@ -11,10 +11,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-03-25 01:02+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-03-15 08:28+0000\n"
 "Last-Translator: Hugo Blackwood, 2023\n"
-"Language-Team: Korean (https://www.transifex.com/owncloud-org/teams/6149/ko/)\n"
+"Language-Team: Korean (https://app.transifex.com/owncloud-org/teams/6149/ko/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -31,7 +31,7 @@ msgstr "{resource} 접근 권한 만료됨"
 
 #: pkg/service/templates.go:15
 msgid "File {resource} was deleted because it violates the policies"
-msgstr ""
+msgstr "정책을 위반하여 {resource} 파일이 삭제됨"
 
 #: pkg/service/templates.go:39
 msgid "Membership expired"
@@ -39,7 +39,7 @@ msgstr "멤버십 만료됨"
 
 #: pkg/service/templates.go:14
 msgid "Policies enforced"
-msgstr ""
+msgstr "정책 강제 중"
 
 #: pkg/service/templates.go:24
 msgid "Removed from Space"
diff --git a/services/userlog/pkg/service/l10n/locale/pt_BR/LC_MESSAGES/userlog.po b/services/userlog/pkg/service/l10n/locale/pt_BR/LC_MESSAGES/userlog.po
index 31a706c0e9b..86829e3c5c9 100644
--- a/services/userlog/pkg/service/l10n/locale/pt_BR/LC_MESSAGES/userlog.po
+++ b/services/userlog/pkg/service/l10n/locale/pt_BR/LC_MESSAGES/userlog.po
@@ -11,10 +11,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-03-25 01:02+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-03-15 08:28+0000\n"
 "Last-Translator: Flávio Veras <flaviove@gmail.com>, 2023\n"
-"Language-Team: Portuguese (Brazil) (https://www.transifex.com/owncloud-org/teams/6149/pt_BR/)\n"
+"Language-Team: Portuguese (Brazil) (https://app.transifex.com/owncloud-org/teams/6149/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -31,7 +31,7 @@ msgstr "Access to {resource} expired"
 
 #: pkg/service/templates.go:15
 msgid "File {resource} was deleted because it violates the policies"
-msgstr ""
+msgstr "O arquivo {resource} foi excluído porque violar as políticas"
 
 #: pkg/service/templates.go:39
 msgid "Membership expired"
@@ -39,7 +39,7 @@ msgstr "Membership expired"
 
 #: pkg/service/templates.go:14
 msgid "Policies enforced"
-msgstr ""
+msgstr "Políticas aplicadas"
 
 #: pkg/service/templates.go:24
 msgid "Removed from Space"
diff --git a/services/userlog/pkg/service/l10n/locale/ru/LC_MESSAGES/userlog.po b/services/userlog/pkg/service/l10n/locale/ru/LC_MESSAGES/userlog.po
index 2504ed06761..24a2639abb6 100644
--- a/services/userlog/pkg/service/l10n/locale/ru/LC_MESSAGES/userlog.po
+++ b/services/userlog/pkg/service/l10n/locale/ru/LC_MESSAGES/userlog.po
@@ -5,82 +5,99 @@
 # 
 # Translators:
 # Aidos Kakimzhanov <aidos.kakimzhan@gmail.com>, 2023
+# Viktor Scharf, 2023
 # 
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-03-15 23:03+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-03-15 08:28+0000\n"
-"Last-Translator: Aidos Kakimzhanov <aidos.kakimzhan@gmail.com>, 2023\n"
-"Language-Team: Russian (https://www.transifex.com/owncloud-org/teams/6149/ru/)\n"
+"Last-Translator: Viktor Scharf, 2023\n"
+"Language-Team: Russian (https://app.transifex.com/owncloud-org/teams/6149/ru/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: ru\n"
 "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
 
-#: pkg/service/templates.go:30
+#: pkg/service/templates.go:40
 msgid "Access to Space {space} lost"
 msgstr "Доступ к пространству {scope} потерян"
 
-#: pkg/service/templates.go:45
+#: pkg/service/templates.go:55
 msgid "Access to {resource} expired"
 msgstr "Срок действия доступа к {resource} истек"
 
-#: pkg/service/templates.go:29
+#: pkg/service/templates.go:15
+msgid "File {resource} was deleted because it violates the policies"
+msgstr "Файл {resource} был удален, в связи с нарушением правил использования"
+
+#: pkg/service/templates.go:39
 msgid "Membership expired"
 msgstr "Срок действия членства истек"
 
 #: pkg/service/templates.go:14
+msgid "Policies enforced"
+msgstr "Соблюдение правил"
+
+#: pkg/service/templates.go:24
 msgid "Removed from Space"
 msgstr "Удалено из Пространство"
 
-#: pkg/service/templates.go:34
+#: pkg/service/templates.go:44
 msgid "Resource shared"
 msgstr "Общий ресурс"
 
-#: pkg/service/templates.go:39
+#: pkg/service/templates.go:49
 msgid "Resource unshared"
 msgstr "Ресурс не используется"
 
-#: pkg/service/templates.go:44
+#: pkg/service/templates.go:54
 msgid "Share expired"
 msgstr "Срок действия совместного доступа истек"
 
-#: pkg/service/templates.go:24
+#: pkg/service/templates.go:34
 msgid "Space deleted"
 msgstr "Пространство удалено"
 
-#: pkg/service/templates.go:19
+#: pkg/service/templates.go:29
 msgid "Space disabled"
 msgstr "Пространство отключено"
 
-#: pkg/service/templates.go:9
+#: pkg/service/templates.go:19
 msgid "Space shared"
-msgstr "Общий пространство"
+msgstr "Общее пространство"
+
+#: pkg/service/templates.go:9
+msgid "Virus found"
+msgstr "Найден вирус"
 
 #: pkg/service/templates.go:10
+msgid "Virus found in {resource}. Upload not possible. Virus: {virus}"
+msgstr "Найден вирус в {resource}. Загрузка не возможна"
+
+#: pkg/service/templates.go:20
 msgid "{user} added you to Space {space}"
 msgstr "{user} добавил вас в Пространство {space}"
 
-#: pkg/service/templates.go:25
+#: pkg/service/templates.go:35
 msgid "{user} deleted Space {space}"
 msgstr "{user} удалил пространство {space}"
 
-#: pkg/service/templates.go:20
+#: pkg/service/templates.go:30
 msgid "{user} disabled Space {space}"
-msgstr "{user} отключено пространство {space}"
+msgstr "{user} отключил пространство {space}"
 
-#: pkg/service/templates.go:15
+#: pkg/service/templates.go:25
 msgid "{user} removed you from Space {space}"
 msgstr "{user} удалил вас из Пространства {space}"
 
-#: pkg/service/templates.go:35
+#: pkg/service/templates.go:45
 msgid "{user} shared {resource} with you"
 msgstr "{user} предоставил вам доступ к {resource}"
 
-#: pkg/service/templates.go:40
+#: pkg/service/templates.go:50
 msgid "{user} unshared {resource} with you"
-msgstr "{user} не поделился с вами {resource}"
+msgstr "{user} удалил доступ к {resource}"
diff --git a/services/userlog/pkg/service/l10n/locale/sq/LC_MESSAGES/userlog.po b/services/userlog/pkg/service/l10n/locale/sq/LC_MESSAGES/userlog.po
index e194161aab9..477207a3581 100644
--- a/services/userlog/pkg/service/l10n/locale/sq/LC_MESSAGES/userlog.po
+++ b/services/userlog/pkg/service/l10n/locale/sq/LC_MESSAGES/userlog.po
@@ -11,76 +11,93 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: EMAIL\n"
-"POT-Creation-Date: 2023-03-15 23:03+0000\n"
+"POT-Creation-Date: 2023-05-09 10:02+0000\n"
 "PO-Revision-Date: 2023-03-15 08:28+0000\n"
 "Last-Translator: Besnik Bleta <besnik@programeshqip.org>, 2023\n"
-"Language-Team: Albanian (https://www.transifex.com/owncloud-org/teams/6149/sq/)\n"
+"Language-Team: Albanian (https://app.transifex.com/owncloud-org/teams/6149/sq/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: sq\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: pkg/service/templates.go:30
+#: pkg/service/templates.go:40
 msgid "Access to Space {space} lost"
 msgstr "U humb hyrje te Hapësira {space}"
 
-#: pkg/service/templates.go:45
+#: pkg/service/templates.go:55
 msgid "Access to {resource} expired"
 msgstr "Hyrja te {resource} skadoi"
 
-#: pkg/service/templates.go:29
+#: pkg/service/templates.go:15
+msgid "File {resource} was deleted because it violates the policies"
+msgstr "Kartela {resource} u fshi, ngaqë cenonte rregullat"
+
+#: pkg/service/templates.go:39
 msgid "Membership expired"
 msgstr "Anëtarësimi skadoi"
 
 #: pkg/service/templates.go:14
+msgid "Policies enforced"
+msgstr "Rregullat u zbatuan"
+
+#: pkg/service/templates.go:24
 msgid "Removed from Space"
 msgstr "U hoq nga Hapësirë"
 
-#: pkg/service/templates.go:34
+#: pkg/service/templates.go:44
 msgid "Resource shared"
 msgstr "Burimi u nda me të tjerë"
 
-#: pkg/service/templates.go:39
+#: pkg/service/templates.go:49
 msgid "Resource unshared"
 msgstr "U hoq ndarje burimi me të tjerë"
 
-#: pkg/service/templates.go:44
+#: pkg/service/templates.go:54
 msgid "Share expired"
 msgstr "Ndarja skadoi"
 
-#: pkg/service/templates.go:24
+#: pkg/service/templates.go:34
 msgid "Space deleted"
 msgstr "Hapësira u fshi"
 
-#: pkg/service/templates.go:19
+#: pkg/service/templates.go:29
 msgid "Space disabled"
 msgstr "Hapësira u çaktivizua"
 
-#: pkg/service/templates.go:9
+#: pkg/service/templates.go:19
 msgid "Space shared"
 msgstr "Hapësira u nda me të tjerë"
 
+#: pkg/service/templates.go:9
+msgid "Virus found"
+msgstr "U gjet virus"
+
 #: pkg/service/templates.go:10
+msgid "Virus found in {resource}. Upload not possible. Virus: {virus}"
+msgstr ""
+"U gjet virus te {resource}. Ngarkimi s’është i mundshëm. Virus: {virus}"
+
+#: pkg/service/templates.go:20
 msgid "{user} added you to Space {space}"
 msgstr "{user} ju shtoi te Hapësira {space}"
 
-#: pkg/service/templates.go:25
+#: pkg/service/templates.go:35
 msgid "{user} deleted Space {space}"
 msgstr "{user} fshiu Hapësirën {space}"
 
-#: pkg/service/templates.go:20
+#: pkg/service/templates.go:30
 msgid "{user} disabled Space {space}"
 msgstr "{user} çaktivizoi Hapësirën {space}"
 
-#: pkg/service/templates.go:15
+#: pkg/service/templates.go:25
 msgid "{user} removed you from Space {space}"
 msgstr "{user} ju hoqi nga Hapësira {space}"
 
-#: pkg/service/templates.go:35
+#: pkg/service/templates.go:45
 msgid "{user} shared {resource} with you"
 msgstr "{user} ndau {resource} me ju"
 
-#: pkg/service/templates.go:40
+#: pkg/service/templates.go:50
 msgid "{user} unshared {resource} with you"
 msgstr "{user} hoqi ndarjen e {resource} me ju"
diff --git a/vendor-bin/behat/composer.json b/vendor-bin/behat/composer.json
index cdc3ca3dd95..2da5e9ae2d4 100644
--- a/vendor-bin/behat/composer.json
+++ b/vendor-bin/behat/composer.json
@@ -8,19 +8,19 @@
         }
     },
     "require": {
-      "behat/behat": "^3.9",
+      "behat/behat": "^3.13",
       "behat/gherkin": "^4.9",
       "behat/mink": "1.7.1",
-      "friends-of-behat/mink-extension": "^2.5",
+      "friends-of-behat/mink-extension": "^2.7",
       "ciaranmcnulty/behat-stepthroughextension" : "dev-master",
       "rdx/behat-variables": "^1.2",
       "sensiolabs/behat-page-object-extension": "^2.3",
       "symfony/translation": "^4.4",
       "sabre/xml": "^2.2",
-      "guzzlehttp/guzzle": "^7.4",
-      "phpunit/phpunit": "^9.5",
-      "laminas/laminas-ldap": "^2.10",
-      "ankitpokhrel/tus-php": "^2.1",
+      "guzzlehttp/guzzle": "^7.5",
+      "phpunit/phpunit": "^9.6",
+      "laminas/laminas-ldap": "^2.15",
+      "ankitpokhrel/tus-php": "^2.3",
       "wapmorgan/unified-archive": "^1.1.3",
       "helmich/phpunit-json-assert": "^3.4"
     }
diff --git a/vendor-bin/owncloud-codestyle/composer.json b/vendor-bin/owncloud-codestyle/composer.json
index 209f1ccb0b2..9785958c6ab 100644
--- a/vendor-bin/owncloud-codestyle/composer.json
+++ b/vendor-bin/owncloud-codestyle/composer.json
@@ -1,5 +1,5 @@
 {
     "require": {
-      "owncloud/coding-standard": "^3.0"
+      "owncloud/coding-standard": "^4.1"
     }
   }
diff --git a/vendor-bin/php_codesniffer/composer.json b/vendor-bin/php_codesniffer/composer.json
index 8c95351b4d8..baff80a6cdc 100644
--- a/vendor-bin/php_codesniffer/composer.json
+++ b/vendor-bin/php_codesniffer/composer.json
@@ -1,8 +1,5 @@
 {
     "require": {
-        "squizlabs/php_codesniffer": "^3.5"
-    },
-    "conflict": {
-        "squizlabs/php_codesniffer": "3.5.1"
+        "squizlabs/php_codesniffer": "^3.7"
     }
 }


Test patch:
diff --git a/docs/ocis/development/testing.md b/docs/ocis/development/testing.md
index df76f02e6a7..5502e2342db 100644
--- a/docs/ocis/development/testing.md
+++ b/docs/ocis/development/testing.md
@@ -260,3 +260,40 @@ make test-paralleldeployment-api \
 ... \
 BEHAT_FEATURE="tests/parallelDeployAcceptance/features/apiShareManagement/acceptShares.feature"
 ```
+
+## Running test suite with email service (inbucket)
+
+### Setup inbucket
+
+Run the following command to setup inbucket
+
+```bash
+docker run -d --name inbucket -p 9000:9000 -p 2500:2500 -p 1100:1100 inbucket/inbucket
+```
+
+### Run oCIS with following environment variables
+
+Documentation for environment variables is available [here](https://owncloud.dev/services/notifications/#environment-variables)
+
+```bash
+OCIS_INSECURE=true \
+PROXY_ENABLE_BASIC_AUTH=true \
+NOTIFICATIONS_SMTP_HOST=localhost \
+NOTIFICATIONS_SMTP_INSECURE=true \
+NOTIFICATIONS_SMTP_PORT=2500 \
+OCIS_URL=https://localhost:9200 \
+<path_to_ocis>/ocis/bin/ocis server
+```
+
+### Run the acceptance test
+
+Run the acceptance test with the following command:
+```bash
+make test-acceptance-api \
+TEST_SERVER_URL="https://localhost:9200" \
+TEST_OCIS=true \
+TEST_WITH_GRAPH_API=true \
+EMAIL_HOST="localhost" \
+EMAIL_PORT=9000 \
+BEHAT_FEATURE="tests/acceptance/features/apiEmailNotification/emailNotification.feature"
+```
diff --git a/services/graph/pkg/identity/ldap_test.go b/services/graph/pkg/identity/ldap_test.go
index d3bcf919215..3db4efc8400 100644
--- a/services/graph/pkg/identity/ldap_test.go
+++ b/services/graph/pkg/identity/ldap_test.go
@@ -308,6 +308,7 @@ func TestUpdateUser(t *testing.T) {
 		displayName              string
 		onPremisesSamAccountName string
 		accountEnabled           *bool
+		givenName                *string
 		userType                 *string
 	}
 	type args struct {
@@ -1441,7 +1442,7 @@ func TestUpdateUser(t *testing.T) {
 					DisplayName:              &tt.want.displayName,
 					OnPremisesSamAccountName: &tt.want.onPremisesSamAccountName,
 					Surname:                  &emptyString,
-					GivenName:                &emptyString,
+					GivenName:                tt.want.givenName,
 					UserType:                 tt.want.userType,
 				}
 
diff --git a/tests/TestHelpers/Asserts/WebDav.php b/tests/TestHelpers/Asserts/WebDav.php
index 2ca6e14d8d9..8b72da2a2d3 100644
--- a/tests/TestHelpers/Asserts/WebDav.php
+++ b/tests/TestHelpers/Asserts/WebDav.php
@@ -21,15 +21,13 @@
  */
 namespace TestHelpers\Asserts;
 
-use Exception;
+use PHPUnit\Framework\Assert;
 use SimpleXMLElement;
-use TestHelpers\DownloadHelper;
-use TestHelpers\SetupHelper;
 
 /**
  * WebDAV related asserts
  */
-class WebDav extends \PHPUnit\Framework\Assert {
+class WebDav extends Assert {
 	/**
 	 *
 	 * @param string|null $element exception|message|reason
@@ -59,6 +57,8 @@ class WebDav extends \PHPUnit\Framework\Assert {
 			$result = $responseXml['value'][1]['value'];
 		} elseif ($element === "reason") {
 			$result = $responseXml['value'][3]['value'];
+		} else {
+			self::fail(__METHOD__ . " element must be one of exception, response or reason. But '$element' was passed in.");
 		}
 
 		self::assertEquals(
@@ -89,112 +89,4 @@ class WebDav extends \PHPUnit\Framework\Assert {
 			);
 		}
 	}
-
-	/**
-	 * Asserts that the content of a remote and a local file is the same
-	 * or is different
-	 *
-	 * @param string|null $baseUrl
-	 * @param string|null $username
-	 * @param string|null $password
-	 * @param string|null $remoteFile
-	 * @param string|null $localFile
-	 * @param string|null $xRequestId
-	 * @param bool $shouldBeSame (default true) if true then check that the file contents are the same
-	 *                           otherwise check that the file contents are different
-	 *
-	 * @return void
-	 */
-	public static function assertContentOfRemoteAndLocalFileIsSame(
-		?string $baseUrl,
-		?string $username,
-		?string $password,
-		?string $remoteFile,
-		?string $localFile,
-		?string $xRequestId = '',
-		?bool $shouldBeSame = true
-	):void {
-		$result = DownloadHelper::download(
-			$baseUrl,
-			$username,
-			$password,
-			$remoteFile,
-			$xRequestId
-		);
-
-		$localContent = \file_get_contents($localFile);
-		$downloadedContent = $result->getBody()->getContents();
-
-		if ($shouldBeSame) {
-			self::assertSame(
-				$localContent,
-				$downloadedContent
-			);
-		} else {
-			self::assertNotSame(
-				$localContent,
-				$downloadedContent
-			);
-		}
-	}
-
-	/**
-	 * Asserts that the content of a remote file (downloaded by DAV)
-	 * and a file in the skeleton folder of the system under test is the same
-	 * or is different
-	 *
-	 * @param string|null $baseUrl
-	 * @param string|null $username
-	 * @param string|null $password
-	 * @param string|null $adminUsername
-	 * @param string|null $adminPassword
-	 * @param string|null $remoteFile
-	 * @param string|null $fileInSkeletonFolder
-	 * @param string|null $xRequestId
-	 * @param bool $shouldBeSame (default true) if true then check that the file contents are the same
-	 *                           otherwise check that the file contents are different
-	 *
-	 * @return void
-	 * @throws Exception
-	 */
-	public static function assertContentOfDAVFileAndSkeletonFileOnSUT(
-		?string $baseUrl,
-		?string $username,
-		?string $password,
-		?string $adminUsername,
-		?string $adminPassword,
-		?string $remoteFile,
-		?string $fileInSkeletonFolder,
-		?string $xRequestId = '',
-		?bool $shouldBeSame = true
-	):void {
-		$result = DownloadHelper::download(
-			$baseUrl,
-			$username,
-			$password,
-			$remoteFile,
-			$xRequestId
-		);
-		$downloadedContent = $result->getBody()->getContents();
-
-		$localContent = SetupHelper::readSkeletonFile(
-			$fileInSkeletonFolder,
-			$xRequestId,
-			$baseUrl,
-			$adminUsername,
-			$adminPassword
-		);
-
-		if ($shouldBeSame) {
-			self::assertSame(
-				$localContent,
-				$downloadedContent
-			);
-		} else {
-			self::assertNotSame(
-				$localContent,
-				$downloadedContent
-			);
-		}
-	}
 }
diff --git a/tests/TestHelpers/EmailHelper.php b/tests/TestHelpers/EmailHelper.php
new file mode 100644
index 00000000000..6f3e8a871f3
--- /dev/null
+++ b/tests/TestHelpers/EmailHelper.php
@@ -0,0 +1,173 @@
+<?php declare(strict_types=1);
+/**
+ * ownCloud
+ *
+ * @author Prajwol Amatya <prajwol@jankaritech.com>
+ * @copyright Copyright (c) 2023 Prajwol Amatya prajwol@jankaritech.com
+ */
+
+namespace TestHelpers;
+
+use Exception;
+use GuzzleHttp\Exception\GuzzleException;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * A helper class for managing emails
+ */
+class EmailHelper {
+	/**
+	 * @param string $emailAddress
+	 *
+	 * @return string
+	 */
+	public static function getMailBoxFromEmail(string $emailAddress):string {
+		return explode("@", $emailAddress)[0];
+	}
+
+	/**
+	 * Returns the host and port where Email messages can be read and deleted
+	 * by the test runner.
+	 *
+	 * @return string
+	 */
+	public static function getLocalEmailUrl():string {
+		$localEmailHost = self::getLocalEmailHost();
+		$emailPort = \getenv('EMAIL_PORT');
+		if ($emailPort === false) {
+			$emailPort = "9000";
+		}
+		return "http://$localEmailHost:$emailPort";
+	}
+
+	/**
+	 * Returns the host name or address of the Email server as seen from the
+	 * point of view of the system-under-test.
+	 *
+	 * @return string
+	 */
+	public static function getEmailHost():string {
+		$emailHost = \getenv('EMAIL_HOST');
+		if ($emailHost === false) {
+			$emailHost = "127.0.0.1";
+		}
+		return $emailHost;
+	}
+
+	/**
+	 * Returns the host name or address of the Email server as seen from the
+	 * point of view of the test runner.
+	 *
+	 * @return string
+	 */
+	public static function getLocalEmailHost():string {
+		$localEmailHost = \getenv('LOCAL_EMAIL_HOST');
+		if ($localEmailHost === false) {
+			$localEmailHost = self::getEmailHost();
+		}
+		return $localEmailHost;
+	}
+
+	/**
+	 * Returns general response information about the provided mailbox
+	 * A mailbox is created automatically in InBucket for every unique email sender|receiver
+	 *
+	 * @param string $mailBox
+	 * @param string|null $xRequestId
+	 *
+	 * @return array
+	 * @throws GuzzleException
+	 */
+	public static function getMailBoxInformation(string $mailBox, ?string $xRequestId = null):array {
+		$response = HttpRequestHelper::get(
+			self::getLocalEmailUrl() . "/api/v1/mailbox/" . $mailBox,
+			$xRequestId,
+			null,
+			null,
+			['Content-Type' => 'application/json']
+		);
+		return \json_decode($response->getBody()->getContents());
+	}
+
+	/**
+	 * returns body content of a specific email (mailBox) with email ID (mailbox Id)
+	 *
+	 * @param string $mailBox
+	 * @param string $mailboxId
+	 * @param string|null $xRequestId
+	 *
+	 * @return object
+	 * @throws GuzzleException
+	 */
+	public static function getBodyOfAnEmailById(string $mailBox, string $mailboxId, ?string $xRequestId = null):object {
+		$response = HttpRequestHelper::get(
+			self::getLocalEmailUrl() . "/api/v1/mailbox/" . $mailBox . "/" . $mailboxId,
+			$xRequestId,
+			null,
+			null,
+			['Content-Type' => 'application/json']
+		);
+		return \json_decode($response->getBody()->getContents());
+	}
+
+	/**
+	 * Returns the body of the last received email for the provided receiver according to the provided email address and the serial number
+	 * For email number, 1 means the latest one
+	 *
+	 * @param string $emailAddress
+	 * @param string|null $xRequestId
+	 * @param int|null $emailNumber For email number, 1 means the latest one
+	 * @param int|null $waitTimeSec Time to wait for the email if the email has been delivered
+	 *
+	 * @return string
+	 * @throws GuzzleException
+	 * @throws Exception
+	 */
+	public static function getBodyOfLastEmail(
+		string $emailAddress,
+		string $xRequestId,
+		?int $emailNumber = 1,
+		?int $waitTimeSec = EMAIL_WAIT_TIMEOUT_SEC
+	):string {
+		$currentTime = \time();
+		$endTime = $currentTime + $waitTimeSec;
+		$mailBox = self::getMailBoxFromEmail($emailAddress);
+		while ($currentTime <= $endTime) {
+			$mailboxResponse = self::getMailboxInformation($mailBox);
+			if (!empty($mailboxResponse) && \sizeof($mailboxResponse) >= $emailNumber) {
+				$mailboxId = $mailboxResponse[\sizeof($mailboxResponse) - $emailNumber]->id;
+				$response = self::getBodyOfAnEmailById($mailBox, $mailboxId, $xRequestId);
+				$body = \str_replace(
+					"\r\n",
+					"\n",
+					\quoted_printable_decode($response->body->text . "\n" . $response->body->html)
+				);
+				return $body;
+			}
+			\usleep(STANDARD_SLEEP_TIME_MICROSEC * 50);
+			$currentTime = \time();
+		}
+		throw new Exception("Could not find the email to the address: " . $emailAddress);
+	}
+
+	/**
+	 * Deletes all the emails for the provided mailbox
+	 *
+	 * @param string $localInbucketUrl
+	 * @param string|null $xRequestId
+	 * @param string $mailBox
+	 *
+	 * @return ResponseInterface
+	 * @throws GuzzleException
+	 */
+	public static function deleteAllEmailsForAMailbox(
+		string $localInbucketUrl,
+		?string $xRequestId,
+		string $mailBox
+	):ResponseInterface {
+		return HttpRequestHelper::delete(
+			$localInbucketUrl . "/api/v1/mailbox/" . $mailBox,
+			$xRequestId
+		);
+	}
+}
diff --git a/tests/TestHelpers/GraphHelper.php b/tests/TestHelpers/GraphHelper.php
index 4c14b059c9e..b03445d9d3b 100644
--- a/tests/TestHelpers/GraphHelper.php
+++ b/tests/TestHelpers/GraphHelper.php
@@ -8,7 +8,6 @@
 
 namespace TestHelpers;
 
-use TestHelpers\HttpRequestHelper;
 use GuzzleHttp\Exception\GuzzleException;
 use Psr\Http\Message\RequestInterface;
 use Psr\Http\Message\ResponseInterface;
@@ -71,7 +70,7 @@ class GraphHelper {
 	 * @return string
 	 */
 	public static function separateAndGetValueForKey(string $keyName, array $actualDriveInformation): string {
-		// break the segment with @@@  to find the actual value from the actual drive information
+		// break the segment with @@@ to find the actual value from the actual drive information
 		$separatedKey = explode("@@@", $keyName);
 		// this stores the actual value of each key from drive information response used for assertion
 		$actualKeyValue = $actualDriveInformation;
@@ -107,7 +106,6 @@ class GraphHelper {
 	 * @param array|null $headers
 	 *
 	 * @return RequestInterface
-	 * @throws GuzzleException
 	 */
 	public static function createRequest(
 		string $baseUrl,
@@ -736,8 +734,10 @@ class GraphHelper {
 		$payload['onPremisesSamAccountName'] = $userName;
 		$payload['passwordProfile'] = ['password' => $password];
 		$payload['displayName'] = $displayName ?? $userName;
-		if (!empty($email)) {
-			$payload['mail'] = $email ?? $userName . '@example.com';
+		if (empty($email)) {
+			$payload['mail'] = $userName . '@example.com';
+		} else {
+			$payload['mail'] = $email;
 		}
 		$payload['accountEnabled'] = true;
 		return \json_encode($payload);
@@ -908,6 +908,7 @@ class GraphHelper {
 	 *
 	 * @return ResponseInterface
 	 *
+	 * @throws GuzzleException
 	 */
 	public static function getSingleSpace(
 		string $baseUrl,
diff --git a/tests/TestHelpers/HttpRequestHelper.php b/tests/TestHelpers/HttpRequestHelper.php
index 4911c510e7e..9d327e12cf4 100644
--- a/tests/TestHelpers/HttpRequestHelper.php
+++ b/tests/TestHelpers/HttpRequestHelper.php
@@ -42,10 +42,7 @@ use GuzzleHttp\Pool;
 class HttpRequestHelper {
 	public const HTTP_TOO_EARLY = 425;
 
-	/**
-	 * @var string
-	 */
-	private static $oCSelectorCookie = null;
+	private static ?string $oCSelectorCookie = null;
 
 	/**
 	 * @return string
@@ -65,7 +62,7 @@ class HttpRequestHelper {
 
 	/**
 	 * Some systems-under-test do async post-processing of operations like upload,
-	 * move etc. If a client does a request on the resource before the post-processing
+	 * move, etc. If a client does a request on the resource before the post-processing
 	 * is finished, then the server should return HTTP_TOO_EARLY "425". Clients are
 	 * expected to retry the request "some time later" (tm).
 	 *
@@ -124,9 +121,6 @@ class HttpRequestHelper {
 				$timeout
 			);
 		}
-		/**
-		 * @var RequestInterface $request
-		 */
 		$request = self::createRequest(
 			$url,
 			$xRequestId,
@@ -148,7 +142,7 @@ class HttpRequestHelper {
 		// The exceptions that might happen here include:
 		// ConnectException - in that case there is no response. Don't catch the exception.
 		// RequestException - if there is something in the response then pass it back.
-		//                    otherwise re-throw the exception.
+		//                    Otherwise, re-throw the exception.
 		// GuzzleException - something else unexpected happened. Don't catch the exception.
 		try {
 			$response = $client->send($request);
@@ -325,8 +319,7 @@ class HttpRequestHelper {
 		?array $requests,
 		?Client $client
 	):array {
-		$results = Pool::batch($client, $requests);
-		return $results;
+		return Pool::batch($client, $requests);
 	}
 
 	/**
@@ -364,8 +357,7 @@ class HttpRequestHelper {
 		$options['stream'] = $stream;
 		$options['verify'] = false;
 		$options['timeout'] = $timeout;
-		$client = new Client($options);
-		return $client;
+		return new Client($options);
 	}
 
 	/**
@@ -397,7 +389,7 @@ class HttpRequestHelper {
 			$headers['X-Request-ID'] = $xRequestId;
 		}
 		if (\is_array($body)) {
-			// when creating the client, it is possible to set 'form_params' and
+			// When creating the client, it is possible to set 'form_params' and
 			// the Client constructor sorts out doing this http_build_query stuff.
 			// But 'new Request' does not have the flexibility to do that.
 			// So we need to do it here.
diff --git a/tests/TestHelpers/OcisHelper.php b/tests/TestHelpers/OcisHelper.php
index 85be2d7eecf..3232429b4e4 100644
--- a/tests/TestHelpers/OcisHelper.php
+++ b/tests/TestHelpers/OcisHelper.php
@@ -145,7 +145,7 @@ class OcisHelper {
 	 * @param string|null $destination
 	 *
 	 * @return void
-	 * @throws Exception
+	 * @throws Exception|GuzzleException
 	 */
 	public static function recurseUpload(
 		?string $baseUrl,
@@ -231,7 +231,7 @@ class OcisHelper {
 	 */
 	public static function getBaseDN():string {
 		$dn = \getenv("REVA_LDAP_BASE_DN");
-		return $dn ? $dn : "dc=owncloud,dc=com";
+		return $dn ?: "dc=owncloud,dc=com";
 	}
 
 	/**
@@ -239,7 +239,7 @@ class OcisHelper {
 	 */
 	public static function getGroupsOU():string {
 		$ou = \getenv("REVA_LDAP_GROUPS_OU");
-		return $ou ? $ou : "TestGroups";
+		return $ou ?: "TestGroups";
 	}
 
 	/**
@@ -247,7 +247,7 @@ class OcisHelper {
 	 */
 	public static function getUsersOU():string {
 		$ou = \getenv("REVA_LDAP_USERS_OU");
-		return $ou ? $ou : "TestUsers";
+		return $ou ?: "TestUsers";
 	}
 
 	/**
@@ -255,14 +255,14 @@ class OcisHelper {
 	 */
 	public static function getGroupSchema():string {
 		$schema = \getenv("REVA_LDAP_GROUP_SCHEMA");
-		return $schema ? $schema : "rfc2307";
+		return $schema ?: "rfc2307";
 	}
 	/**
 	 * @return string
 	 */
 	public static function getHostname():string {
 		$hostname = \getenv("REVA_LDAP_HOSTNAME");
-		return $hostname ? $hostname : "localhost";
+		return $hostname ?: "localhost";
 	}
 
 	/**
@@ -270,7 +270,7 @@ class OcisHelper {
 	 */
 	public static function getBindDN():string {
 		$dn = \getenv("REVA_LDAP_BIND_DN");
-		return $dn ? $dn : "cn=admin,dc=owncloud,dc=com";
+		return $dn ?: "cn=admin,dc=owncloud,dc=com";
 	}
 
 	/**
@@ -278,7 +278,7 @@ class OcisHelper {
 	 */
 	public static function getBindPassword():string {
 		$pw = \getenv("REVA_LDAP_BIND_PASSWORD");
-		return $pw ? $pw : "";
+		return $pw ?: "";
 	}
 
 	/**
diff --git a/tests/TestHelpers/OcsApiHelper.php b/tests/TestHelpers/OcsApiHelper.php
index 6e0623f42a2..27ba2d1d1eb 100644
--- a/tests/TestHelpers/OcsApiHelper.php
+++ b/tests/TestHelpers/OcsApiHelper.php
@@ -61,7 +61,7 @@ class OcsApiHelper {
 		if (\substr($fullUrl, -1) !== '/') {
 			$fullUrl .= '/';
 		}
-		$fullUrl .= "ocs/v{$ocsApiVersion}.php" . $path;
+		$fullUrl .= "ocs/v$ocsApiVersion.php" . $path;
 		$headers['OCS-APIREQUEST'] = true;
 		return HttpRequestHelper::sendRequest($fullUrl, $xRequestId, $method, $user, $password, $headers, $body);
 	}
@@ -91,7 +91,7 @@ class OcsApiHelper {
 		if (\substr($fullUrl, -1) !== '/') {
 			$fullUrl .= '/';
 		}
-		$fullUrl .= "ocs/v{$ocsApiVersion}.php" . $path;
+		$fullUrl .= "ocs/v$ocsApiVersion.php" . $path;
 		return HttpRequestHelper::createRequest(
 			$fullUrl,
 			$xRequestId,
diff --git a/tests/TestHelpers/SetupHelper.php b/tests/TestHelpers/SetupHelper.php
index 0a899ab8b08..15c54866ef6 100644
--- a/tests/TestHelpers/SetupHelper.php
+++ b/tests/TestHelpers/SetupHelper.php
@@ -23,9 +23,7 @@ namespace TestHelpers;
 
 use Behat\Testwork\Hook\Scope\HookScope;
 use GuzzleHttp\Exception\GuzzleException;
-use GuzzleHttp\Exception\ServerException;
 use Exception;
-use Psr\Http\Message\ResponseInterface;
 use SimpleXMLElement;
 
 /**
@@ -35,22 +33,9 @@ use SimpleXMLElement;
  *
  */
 class SetupHelper extends \PHPUnit\Framework\Assert {
-	/**
-	 * @var string
-	 */
-	private static $ocPath = null;
-	/**
-	 * @var string
-	 */
-	private static $baseUrl = null;
-	/**
-	 * @var string
-	 */
-	private static $adminUsername = null;
-	/**
-	 * @var string
-	 */
-	private static $adminPassword = null;
+	private static ?string $baseUrl = null;
+	private static ?string $adminUsername = null;
+	private static ?string $adminPassword = null;
 
 	/**
 	 *
@@ -63,18 +48,6 @@ class SetupHelper extends \PHPUnit\Framework\Assert {
 			->getSettings() ['context'] ['parameters'];
 	}
 
-	/**
-	 * Fixup OC path so that it always starts with a "/" and does not end with
-	 * a "/".
-	 *
-	 * @param string|null $ocPath
-	 *
-	 * @return string
-	 */
-	private static function normaliseOcPath(?string $ocPath):string {
-		return '/' . \trim($ocPath, '/');
-	}
-
 	/**
 	 *
 	 * @param string|null $adminUsername
@@ -101,7 +74,6 @@ class SetupHelper extends \PHPUnit\Framework\Assert {
 		self::$adminUsername = $adminUsername;
 		self::$adminPassword = $adminPassword;
 		self::$baseUrl = \rtrim($baseUrl, '/');
-		self::$ocPath = self::normaliseOcPath($ocPath);
 	}
 
 	/**
@@ -113,6 +85,7 @@ class SetupHelper extends \PHPUnit\Framework\Assert {
 	 *
 	 * @return SimpleXMLElement
 	 * @throws GuzzleException
+	 * @throws Exception
 	 */
 	public static function getSysInfo(
 		?string $baseUrl,
@@ -315,6 +288,7 @@ class SetupHelper extends \PHPUnit\Framework\Assert {
 	 *
 	 * @return void
 	 * @throws GuzzleException
+	 * @throws Exception
 	 */
 	public static function createFileOnServer(
 		?string $filePathFromServerRoot,
@@ -421,13 +395,13 @@ class SetupHelper extends \PHPUnit\Framework\Assert {
 			$adminUsername,
 			$adminPassword,
 			'GET',
-			"/apps/testing/api/v1/file?file={$fileInCore}",
+			"/apps/testing/api/v1/file?file=$fileInCore",
 			$xRequestId
 		);
 		self::assertSame(
 			200,
 			$response->getStatusCode(),
-			"Failed to read the file {$fileInCore}"
+			"Failed to read the file $fileInCore"
 		);
 		$localContent = HttpRequestHelper::getResponseXml($response, __METHOD__);
 		$localContent = (string)$localContent->data->element->contentUrlEncoded;
@@ -470,17 +444,16 @@ class SetupHelper extends \PHPUnit\Framework\Assert {
 			$adminUsername,
 			$adminPassword,
 			'GET',
-			"/apps/testing/api/v1/file?file={$fileInSkeletonFolder}&absolute=true",
+			"/apps/testing/api/v1/file?file=$fileInSkeletonFolder&absolute=true",
 			$xRequestId
 		);
 		self::assertSame(
 			200,
 			$response->getStatusCode(),
-			"Failed to read the file {$fileInSkeletonFolder}"
+			"Failed to read the file $fileInSkeletonFolder"
 		);
 		$localContent = HttpRequestHelper::getResponseXml($response, __METHOD__);
 		$localContent = (string)$localContent->data->element->contentUrlEncoded;
-		$localContent = \urldecode($localContent);
-		return $localContent;
+		return \urldecode($localContent);
 	}
 }
diff --git a/tests/TestHelpers/SharingHelper.php b/tests/TestHelpers/SharingHelper.php
index 0367726628c..da3458a68fd 100644
--- a/tests/TestHelpers/SharingHelper.php
+++ b/tests/TestHelpers/SharingHelper.php
@@ -22,6 +22,7 @@
 namespace TestHelpers;
 
 use Exception;
+use GuzzleHttp\Exception\GuzzleException;
 use InvalidArgumentException;
 use Psr\Http\Message\ResponseInterface;
 use SimpleXMLElement;
@@ -52,7 +53,7 @@ class SharingHelper {
 		'accepted' => 0,
 		'pending' => 1,
 		'rejected' => 2,
-		'declined' => 2, // declined is a synonym for rejected
+		'declined' => 2, // declined is a synonym for rejected.
 	];
 
 	/**
@@ -88,7 +89,7 @@ class SharingHelper {
 	 * @param string $sharingApp
 	 *
 	 * @return ResponseInterface
-	 * @throws InvalidArgumentException
+	 * @throws InvalidArgumentException|GuzzleException
 	 */
 	public static function createShare(
 		string $baseUrl,
@@ -136,7 +137,7 @@ class SharingHelper {
 		if (\substr($fullUrl, -1) !== '/') {
 			$fullUrl .= '/';
 		}
-		$fullUrl .= "ocs/v{$ocsApiVersion}.php/apps/{$sharingApp}/api/v{$sharingApiVersion}/shares";
+		$fullUrl .= "ocs/v$ocsApiVersion.php/apps/$sharingApp/api/v$sharingApiVersion/shares";
 
 		$fd['path'] = $path;
 		$fd['shareType'] = self::getShareType($shareType);
@@ -145,7 +146,7 @@ class SharingHelper {
 			$fd['shareWith'] = $shareWith;
 		}
 		if ($publicUpload !== null) {
-			$fd['publicUpload'] = (bool) $publicUpload;
+			$fd['publicUpload'] = $publicUpload;
 		}
 		if ($sharePassword !== null) {
 			$fd['password'] = $sharePassword;
@@ -169,7 +170,7 @@ class SharingHelper {
 	}
 
 	/**
-	 * Calculates the permission sum (int) from given permissions.
+	 * Calculates the permission sum (int) from the given permissions.
 	 * Permissions can be passed in as int, string or array of int or string
 	 * 'read' => 1
 	 * 'update' => 2
@@ -197,7 +198,7 @@ class SharingHelper {
 			if (\array_key_exists($permission, self::PERMISSION_TYPES)) {
 				$permissionSum += self::PERMISSION_TYPES[$permission];
 			} elseif (\in_array($permission, self::PERMISSION_TYPES, true)) {
-				$permissionSum += (int) $permission;
+				$permissionSum += $permission;
 			} else {
 				throw new InvalidArgumentException(
 					"invalid permission type ($permission)"
diff --git a/tests/TestHelpers/TranslationHelper.php b/tests/TestHelpers/TranslationHelper.php
index bc262b47398..388b4200a58 100644
--- a/tests/TestHelpers/TranslationHelper.php
+++ b/tests/TestHelpers/TranslationHelper.php
@@ -25,7 +25,7 @@ namespace TestHelpers;
 /**
  * Class TranslationHelper
  *
- * Helper functions that are needed to run tests on different languages
+ * Helper functions that are needed to run tests in different languages
  *
  * @package TestHelpers
  */
diff --git a/tests/TestHelpers/UploadHelper.php b/tests/TestHelpers/UploadHelper.php
index f216db4b1a5..d5be3e19ffe 100644
--- a/tests/TestHelpers/UploadHelper.php
+++ b/tests/TestHelpers/UploadHelper.php
@@ -21,6 +21,8 @@
  */
 namespace TestHelpers;
 
+use GuzzleHttp\Exception\GuzzleException;
+use PHPUnit\Framework\Assert;
 use Psr\Http\Message\ResponseInterface;
 
 /**
@@ -29,7 +31,7 @@ use Psr\Http\Message\ResponseInterface;
  * @author Artur Neumann <artur@jankaritech.com>
  *
  */
-class UploadHelper extends \PHPUnit\Framework\Assert {
+class UploadHelper extends Assert {
 	/**
 	 *
 	 * @param string|null $baseUrl URL of owncloud
@@ -46,9 +48,10 @@ class UploadHelper extends \PHPUnit\Framework\Assert {
 	 * @param int|null $davPathVersionToUse (1|2)
 	 * @param int|null $chunkingVersion (1|2|null)
 	 *                                  if set to null chunking will not be used
-	 * @param int|null $noOfChunks how many chunks do we want to upload
+	 * @param int|null $noOfChunks how many chunks to upload
 	 *
 	 * @return ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function upload(
 		?string $baseUrl,
@@ -79,10 +82,12 @@ class UploadHelper extends \PHPUnit\Framework\Assert {
 		} else {
 			//prepare chunking
 			$chunks = self::chunkFile($source, $noOfChunks);
-			$chunkingId = 'chunking-' . (string)\rand(1000, 9999);
+			$chunkingId = 'chunking-' . \rand(1000, 9999);
 			$v2ChunksDestination = '/uploads/' . $user . '/' . $chunkingId;
 		}
 
+		$result = null;
+
 		//prepare chunking version specific stuff
 		if ($chunkingVersion === 1) {
 			$headers['OC-Chunked'] = '1';
@@ -108,10 +113,11 @@ class UploadHelper extends \PHPUnit\Framework\Assert {
 		foreach ($chunks as $index => $chunk) {
 			if ($chunkingVersion === 1) {
 				$filename = $destination . "-" . $chunkingId . "-" .
-					\count($chunks) . '-' . ( string ) $index;
+					\count($chunks) . '-' . $index;
 				$davRequestType = "files";
-			} elseif ($chunkingVersion === 2) {
-				$filename = $v2ChunksDestination . '/' . (string)($index);
+			} else {
+				// do chunking version 2
+				$filename = $v2ChunksDestination . '/' . $index;
 				$davRequestType = "uploads";
 			}
 			$result = WebDavHelper::makeDavRequest(
@@ -152,6 +158,7 @@ class UploadHelper extends \PHPUnit\Framework\Assert {
 				return $result;
 			}
 		}
+		self::assertNotNull($result, __METHOD__ . " chunking version $chunkingVersion was requested but no upload was done.");
 		return $result;
 	}
 
@@ -169,6 +176,7 @@ class UploadHelper extends \PHPUnit\Framework\Assert {
 	 * @param string|null $exceptChunkingType empty string or "old" or "new"
 	 *
 	 * @return array of ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function uploadWithAllMechanisms(
 		?string $baseUrl,
diff --git a/tests/TestHelpers/UserHelper.php b/tests/TestHelpers/UserHelper.php
index 8dda97fdc24..33de75b3748 100644
--- a/tests/TestHelpers/UserHelper.php
+++ b/tests/TestHelpers/UserHelper.php
@@ -23,6 +23,7 @@ namespace TestHelpers;
 
 use Exception;
 use GuzzleHttp\Exception\ClientException;
+use GuzzleHttp\Exception\GuzzleException;
 use Psr\Http\Message\ResponseInterface;
 
 /**
@@ -44,6 +45,7 @@ class UserHelper {
 	 * @param int|null $ocsApiVersion
 	 *
 	 * @return ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function editUser(
 		?string $baseUrl,
@@ -99,15 +101,12 @@ class UserHelper {
 			$path = "/cloud/users/" . $data['user'];
 			$body = ["key" => $data['key'], 'value' => $data["value"]];
 			// Create the OCS API requests and push them to an array.
-			\array_push(
-				$requests,
-				OcsApiHelper::createOcsRequest(
-					$baseUrl,
-					'PUT',
-					$path,
-					$xRequestId,
-					$body
-				)
+			$requests[] = OcsApiHelper::createOcsRequest(
+				$baseUrl,
+				'PUT',
+				$path,
+				$xRequestId,
+				$body
 			);
 		}
 		// Send the array of requests at once in parallel.
@@ -135,6 +134,7 @@ class UserHelper {
 	 * @param int|null $ocsApiVersion
 	 *
 	 * @return ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function getUser(
 		?string $baseUrl,
@@ -166,6 +166,7 @@ class UserHelper {
 	 * @param int|null $ocsApiVersion
 	 *
 	 * @return ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function deleteUser(
 		?string $baseUrl,
@@ -196,6 +197,7 @@ class UserHelper {
 	 * @param string|null $xRequestId
 	 *
 	 * @return ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function createGroup(
 		?string $baseUrl,
@@ -225,6 +227,7 @@ class UserHelper {
 	 * @param int|null $ocsApiVersion
 	 *
 	 * @return ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function deleteGroup(
 		?string $baseUrl,
@@ -258,6 +261,7 @@ class UserHelper {
 	 * @param int|null $ocsApiVersion (1|2)
 	 *
 	 * @return ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function addUserToGroup(
 		?string $baseUrl,
@@ -291,6 +295,7 @@ class UserHelper {
 	 * @param int|null $ocsApiVersion (1|2)
 	 *
 	 * @return ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function removeUserFromGroup(
 		?string $baseUrl,
@@ -322,6 +327,7 @@ class UserHelper {
 	 * @param string|null $search
 	 *
 	 * @return ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function getGroups(
 		?string $baseUrl,
@@ -349,7 +355,7 @@ class UserHelper {
 	 * @param string|null $search
 	 *
 	 * @return string[]
-	 * @throws Exception
+	 * @throws Exception|GuzzleException
 	 */
 	public static function getGroupsAsArray(
 		?string $baseUrl,
diff --git a/tests/TestHelpers/WebDavHelper.php b/tests/TestHelpers/WebDavHelper.php
index e8d0c9905bf..fdb249f74aa 100644
--- a/tests/TestHelpers/WebDavHelper.php
+++ b/tests/TestHelpers/WebDavHelper.php
@@ -29,7 +29,6 @@ use PHPUnit\Framework\Assert;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\StreamInterface;
 use DateTime;
-use TestHelpers\SpaceNotFoundException;
 
 /**
  * Helper to make WebDav Requests
@@ -41,12 +40,12 @@ class WebDavHelper {
 	public const DAV_VERSION_OLD = 1;
 	public const DAV_VERSION_NEW = 2;
 	public const DAV_VERSION_SPACES = 3;
-	public static $SPACE_ID_FROM_OCIS = '';
+	public static string $SPACE_ID_FROM_OCIS = '';
 
 	/**
-	 * @var array of users with their different spaces ids
+	 * @var array of users with their different space ids
 	 */
-	public static $spacesIdRef = [];
+	public static array $spacesIdRef = [];
 
 	/**
 	 * clear space id reference for user
@@ -75,7 +74,7 @@ class WebDavHelper {
 	 * @param int|null $davPathVersionToUse
 	 *
 	 * @return string
-	 * @throws Exception
+	 * @throws Exception|GuzzleException
 	 */
 	public static function getFileIdForPath(
 		?string $baseUrl,
@@ -174,7 +173,7 @@ class WebDavHelper {
 	 * @param string[] $properties
 	 *        string can contain namespace prefix,
 	 *        if no prefix is given 'd:' is used as prefix
-	 *        if associated array is used then the key will be used as namespace
+	 *        if an associative array is used, then the key will be used as namespace
 	 * @param string|null $xRequestId
 	 * @param string|null $folderDepth
 	 * @param string|null $type
@@ -182,6 +181,8 @@ class WebDavHelper {
 	 * @param string|null $doDavRequestAsUser
 	 *
 	 * @return ResponseInterface
+	 * @throws Exception
+	 * @throws GuzzleException
 	 */
 	public static function propfind(
 		?string $baseUrl,
@@ -237,6 +238,7 @@ class WebDavHelper {
 	 * @param string|null $type
 	 *
 	 * @return ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function proppatch(
 		?string $baseUrl,
@@ -387,6 +389,7 @@ class WebDavHelper {
 	 * @param int|null $davPathVersionToUse
 	 *
 	 * @return ResponseInterface
+	 * @throws GuzzleException
 	 */
 	public static function listFolder(
 		?string $baseUrl,
@@ -544,7 +547,7 @@ class WebDavHelper {
 	}
 
 	/**
-	 * First checks if a user exist to return its space ID
+	 * First checks if a user exists to return its space ID
 	 * In case of any exception, it returns a fake space ID
 	 *
 	 * @param string $baseUrl
@@ -553,7 +556,7 @@ class WebDavHelper {
 	 * @param string $xRequestId
 	 *
 	 * @return string
-	 * @throws Exception
+	 * @throws Exception|GuzzleException
 	 */
 	public static function getPersonalSpaceIdForUserOrFakeIfNotFound(string $baseUrl, string $user, string $password, string $xRequestId):string {
 		try {
@@ -596,7 +599,7 @@ class WebDavHelper {
 	 * @param int|null $timeout
 	 * @param Client|null $client
 	 * @param array|null $urlParameter to concatenate with path
-	 * @param string|null $doDavRequestAsUser run the DAV as this user, if null its same as $user
+	 * @param string|null $doDavRequestAsUser run the DAV as this user, if null it is the same as $user
 	 *
 	 * @return ResponseInterface
 	 * @throws GuzzleException
@@ -766,7 +769,7 @@ class WebDavHelper {
 	}
 
 	/**
-	 * make sure there are no double slash in the URL
+	 * make sure there are no double-slashes in the URL
 	 *
 	 * @param string|null $url
 	 * @param bool|null $trailingSlash forces a trailing slash
@@ -779,16 +782,15 @@ class WebDavHelper {
 		} else {
 			$url = \rtrim($url, "/");
 		}
-		$url = \preg_replace("/([^:]\/)\/+/", '$1', $url);
-		return $url;
+		return \preg_replace("/([^:]\/)\/+/", '$1', $url);
 	}
 
 	/**
-	 * decides if the proposed dav version and chunking version are
+	 * Decides if the proposed dav version and chunking version are
 	 * a valid combination.
 	 * If no chunkingVersion is specified, then any dav version is valid.
 	 * If a chunkingVersion is specified, then it has to match the dav version.
-	 * Note: in future the dav and chunking versions might or might not
+	 * Note: in future, the dav and chunking versions might or might not
 	 * move together and/or be supported together. So a more complex
 	 * matrix could be needed here.
 	 *
@@ -821,9 +823,9 @@ class WebDavHelper {
 	 * @param int|null $davVersionToUse
 	 *
 	 * @return string
-	 * @throws Exception
+	 * @throws Exception|GuzzleException
 	 */
-	public static function getMtimeOfFileinPublicLinkShare(
+	public static function getMtimeOfFileInPublicLinkShare(
 		?string $baseUrl,
 		?string $fileName,
 		?string $token,
@@ -834,7 +836,7 @@ class WebDavHelper {
 			$baseUrl,
 			null,
 			null,
-			"/public-files/{$token}/{$fileName}",
+			"/public-files/$token/$fileName",
 			['d:getlastmodified'],
 			$xRequestId,
 			'1',
@@ -862,6 +864,7 @@ class WebDavHelper {
 	 *
 	 * @return string
 	 * @throws Exception
+	 * @throws GuzzleException
 	 */
 	public static function getMtimeOfResource(
 		?string $user,
@@ -886,13 +889,13 @@ class WebDavHelper {
 			$response,
 			__METHOD__
 		);
-		$xmlpart = $responseXmlObject->xpath("//d:getlastmodified");
+		$xmlPart = $responseXmlObject->xpath("//d:getlastmodified");
 		Assert::assertArrayHasKey(
 			0,
-			$xmlpart,
-			__METHOD__ . " XML part does not have key 0. Expected a value at index 0 of 'xmlPart' but, found: " . (string) json_encode($xmlpart)
+			$xmlPart,
+			__METHOD__ . " XML part does not have key 0. Expected a value at index 0 of 'xmlPart' but, found: " . json_encode($xmlPart)
 		);
-		$mtime = new DateTime($xmlpart[0]->__toString());
+		$mtime = new DateTime($xmlPart[0]->__toString());
 		return $mtime->format('U');
 	}
 }
diff --git a/tests/acceptance/config/behat.yml b/tests/acceptance/config/behat.yml
index 73aa64c21ed..0baeb28b7cc 100644
--- a/tests/acceptance/config/behat.yml
+++ b/tests/acceptance/config/behat.yml
@@ -168,6 +168,22 @@ default:
         - TrashbinContext:
         - GraphContext:
 
+    apiEmailNotification:
+      paths:
+        - '%paths.base%/../features/apiEmailNotification'
+      context: *common_ldap_suite_context
+      contexts:
+        - NotificationContext:
+        - SpacesContext:
+        - FeatureContext: *common_feature_context_params
+        - WebDavPropertiesContext:
+        - OCSContext:
+        - GraphContext:
+        - TrashbinContext:
+        - FavoritesContext:
+        - ChecksumContext:
+        - FilesVersionsContext:
+        - RoleAssignmentContext:
 
   extensions:
     rdx\behatvars\BehatVariablesExtension: ~
diff --git a/tests/acceptance/expected-failures-API-on-OCIS-storage.md b/tests/acceptance/expected-failures-API-on-OCIS-storage.md
index e6c5bee81f6..098ed7f79c8 100644
--- a/tests/acceptance/expected-failures-API-on-OCIS-storage.md
+++ b/tests/acceptance/expected-failures-API-on-OCIS-storage.md
@@ -157,17 +157,16 @@ File and sync features in a shared scenario
 
 #### [ocs sharing api always returns an empty exact list while searching for a sharee](https://github.com/owncloud/ocis/issues/4265)
 
+- [coreApiSharees/sharees.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L100)
 - [coreApiSharees/sharees.feature:101](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L101)
-- [coreApiSharees/sharees.feature:102](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L102)
+- [coreApiSharees/sharees.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L120)
 - [coreApiSharees/sharees.feature:121](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L121)
-- [coreApiSharees/sharees.feature:122](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L122)
+- [coreApiSharees/sharees.feature:140](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L140)
 - [coreApiSharees/sharees.feature:141](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L141)
-- [coreApiSharees/sharees.feature:142](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L142)
+- [coreApiSharees/sharees.feature:160](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L160)
 - [coreApiSharees/sharees.feature:161](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L161)
-- [coreApiSharees/sharees.feature:162](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L162)
+- [coreApiSharees/sharees.feature:180](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L180)
 - [coreApiSharees/sharees.feature:181](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L181)
-- [coreApiSharees/sharees.feature:182](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L182)
-
 
 #### [accepting matching name shared resources from different users/groups sets no serial identifiers on the resource name for the receiver](https://github.com/owncloud/ocis/issues/4289)
 
@@ -220,7 +219,7 @@ cannot share a folder with create permission
 - [coreApiShareOperationsToShares1/gettingShares.feature:190](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L190)
 
 #### [Public link enforce permissions](https://github.com/owncloud/ocis/issues/1269)
-- [coreApiSharePublicLink1/createPublicLinkShare.feature:356](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L356)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:355](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L355)
 
 #### [download previews of other users file](https://github.com/owncloud/ocis/issues/2071)
 
@@ -242,7 +241,7 @@ cannot share a folder with create permission
 #### [Upload-only shares must not overwrite but create a separate file](https://github.com/owncloud/ocis/issues/1267)
 
 - [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:10](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L10)
-- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:131](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L131)
+- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:111](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L111)
 
 #### [Set quota over settings](https://github.com/owncloud/ocis/issues/1290)
 
@@ -295,45 +294,11 @@ cannot share a folder with create permission
 
 - [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L32)
 - [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:33](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L33)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:84](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L84)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:85](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L85)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:141](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L141)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:142](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L142)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:199](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L199)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:200](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L200)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:201](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L201)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:202](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L202)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:285](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L285)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:286](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L286)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:316](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L316)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:317](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L317)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:318](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L318)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:319](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L319)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:377](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L377)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:378](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L378)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:379](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L379)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:380](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L380)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:381](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L381)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:382](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L382)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:411](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L411)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:412](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L412)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:413](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L413)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:414](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L414)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:442](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L442)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:443](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L443)
 
 #### Expiration date of group shares
 
 - [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:58](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L58)
 - [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:59](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L59)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:114](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L114)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:115](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L115)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:170](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L170)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:171](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L171)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:230](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L230)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:231](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L231)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:232](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L232)
-- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:233](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L233)
 
 #### [Cannot move folder/file from one received share to another](https://github.com/owncloud/ocis/issues/2442)
 
@@ -400,7 +365,7 @@ API, search, favorites, config, capabilities, not existing endpoints, CORS and o
 - [coreApiAuthOcs/ocsGETAuth.feature:124](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsGETAuth.feature#L124)
 - [coreApiAuthOcs/ocsPOSTAuth.feature:11](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsPOSTAuth.feature#L11)
 - [coreApiAuthOcs/ocsPUTAuth.feature:11](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsPUTAuth.feature#L11)
-- [coreApiSharePublicLink1/createPublicLinkShare.feature:346](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L346)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:345](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L345)
 
 #### [sending MKCOL requests to another user's webDav endpoints as normal user gives 404 instead of 403 ](https://github.com/owncloud/ocis/issues/3872)
 
@@ -549,6 +514,7 @@ And other missing implementation of favorites
 
 #### [Trying to accept a share with invalid ID gives incorrect OCS and HTTP status](https://github.com/owncloud/ocis/issues/2111)
 
+- [coreApiShareOperationsToShares2/shareAccessByID.feature:85](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L85)
 - [coreApiShareOperationsToShares2/shareAccessByID.feature:86](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L86)
 - [coreApiShareOperationsToShares2/shareAccessByID.feature:87](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L87)
 - [coreApiShareOperationsToShares2/shareAccessByID.feature:88](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L88)
@@ -556,20 +522,18 @@ And other missing implementation of favorites
 - [coreApiShareOperationsToShares2/shareAccessByID.feature:90](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L90)
 - [coreApiShareOperationsToShares2/shareAccessByID.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L91)
 - [coreApiShareOperationsToShares2/shareAccessByID.feature:92](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L92)
-- [coreApiShareOperationsToShares2/shareAccessByID.feature:93](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L93)
-- [coreApiShareOperationsToShares2/shareAccessByID.feature:105](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L105)
-- [coreApiShareOperationsToShares2/shareAccessByID.feature:106](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L106)
+- [coreApiShareOperationsToShares2/shareAccessByID.feature:103](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L103)
+- [coreApiShareOperationsToShares2/shareAccessByID.feature:104](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L104)
+- [coreApiShareOperationsToShares2/shareAccessByID.feature:134](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L134)
+- [coreApiShareOperationsToShares2/shareAccessByID.feature:135](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L135)
+- [coreApiShareOperationsToShares2/shareAccessByID.feature:136](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L136)
 - [coreApiShareOperationsToShares2/shareAccessByID.feature:137](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L137)
 - [coreApiShareOperationsToShares2/shareAccessByID.feature:138](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L138)
 - [coreApiShareOperationsToShares2/shareAccessByID.feature:139](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L139)
 - [coreApiShareOperationsToShares2/shareAccessByID.feature:140](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L140)
 - [coreApiShareOperationsToShares2/shareAccessByID.feature:141](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L141)
-- [coreApiShareOperationsToShares2/shareAccessByID.feature:142](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L142)
-- [coreApiShareOperationsToShares2/shareAccessByID.feature:143](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L143)
-- [coreApiShareOperationsToShares2/shareAccessByID.feature:144](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L144)
-- [coreApiShareOperationsToShares2/shareAccessByID.feature:156](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L156)
-- [coreApiShareOperationsToShares2/shareAccessByID.feature:157](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L157)
-
+- [coreApiShareOperationsToShares2/shareAccessByID.feature:152](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L152)
+- [coreApiShareOperationsToShares2/shareAccessByID.feature:153](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L153)
 
 #### [Shares to deleted group listed in the response](https://github.com/owncloud/ocis/issues/2441)
 
@@ -628,8 +592,8 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers
 - [coreApiShareManagementToShares/acceptShares.feature:183](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L183)
 - [coreApiShareManagementToShares/acceptShares.feature:228](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L228)
 - [coreApiShareManagementToShares/acceptShares.feature:438](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L438)
-- [coreApiShareOperationsToShares2/shareAccessByID.feature:124](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L124)
-- [coreApiShareOperationsToShares2/shareAccessByID.feature:125](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L125)
+- [coreApiShareOperationsToShares2/shareAccessByID.feature:122](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L122)
+- [coreApiShareOperationsToShares2/shareAccessByID.feature:123](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L123)
 - [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:178](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L178)
 - [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:179](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L179)
 - [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:180](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L180)
diff --git a/tests/acceptance/features/apiEmailNotification/emailNotification.feature b/tests/acceptance/features/apiEmailNotification/emailNotification.feature
new file mode 100644
index 00000000000..ccd0fae962b
--- /dev/null
+++ b/tests/acceptance/features/apiEmailNotification/emailNotification.feature
@@ -0,0 +1,42 @@
+@api @email
+Feature: Email notification
+  As a user
+  I want to get email notification of events related to me
+  So that I can stay updated about the events
+
+  Background:
+    Given these users have been created with default attributes and without skeleton files:
+      | username |
+      | Alice    |
+      | Brian    |
+
+
+  Scenario: a user gets an email notification when someone shares a project space
+    Given the administrator has given "Alice" the role "Space Admin" using the settings api
+    And user "Alice" has created a space "new-space" with the default quota using the GraphApi
+    When user "Alice" shares a space "new-space" with settings:
+      | shareWith | Brian  |
+      | role      | Editor |
+    Then the HTTP status code should be "200"
+    And user "Brian" should have received the following email from user "Alice" about the share of project space "new-space"
+      """
+      Hello Brian Murphy,
+
+      %displayname% has invited you to join "new-space".
+
+      Click here to view it: %base_url%/f/%space_id%
+      """
+
+
+  Scenario: a user gets an email notification when someone shares a file
+    Given user "Alice" has uploaded file with content "sample text" to "lorem.txt"
+    When user "Alice" has shared file "lorem.txt" with user "Brian" with permissions "17"
+    Then the HTTP status code should be "200"
+    And user "Brian" should have received the following email from user "Alice"
+      """
+      Hello Brian Murphy
+
+      %displayname% has shared "lorem.txt" with you.
+
+      Click here to view it: %base_url%/files/shares/with-me
+      """
diff --git a/tests/acceptance/features/apiGraph/userGDPRExport.feature b/tests/acceptance/features/apiGraph/userGDPRExport.feature
index 9ab56bd1967..62bfd0897b4 100644
--- a/tests/acceptance/features/apiGraph/userGDPRExport.feature
+++ b/tests/acceptance/features/apiGraph/userGDPRExport.feature
@@ -454,3 +454,113 @@ Feature: user GDPR (General Data Protection Regulation) report
       }
     }
     """
+
+
+  Scenario: generate a GDPR report after the admin updates the quota of personal space
+    Given user "Admin" has changed the quota of the personal space of "Alice Hansen" space to "10000"
+    When user "Alice" exports her GDPR report to "/.personal_data_export.json" using the Graph API
+    And user "Alice" downloads the content of GDPR report ".personal_data_export.json"
+    Then the HTTP status code of responses on each endpoint should be "201, 200" respectively
+    And the downloaded JSON content should contain event type "events.SpaceUpdated" in item 'events' and should match
+    """
+    {
+      "type": "object",
+      "required": [
+        "event"
+      ],
+      "properties": {
+        "event" : {
+          "type": "object",
+          "required": [
+            "Executant",
+            "Space"
+          ],
+          "properties": {
+            "Executant": {
+              "type": "object",
+              "required": [
+                "idp",
+                "opaque_id",
+                "type"
+              ],
+              "properties": {
+                "idp": {
+                  "type": "string",
+                  "pattern": "^%base_url%$"
+                },
+                "opaque_id": {
+                  "type": "string",
+                  "pattern": "^%user_id_pattern%$"
+                },
+                "type": {
+                  "type": "number",
+                  "enum": [1]
+                }
+              }
+            },
+            "Space": {
+              "type": "object",
+              "required": [
+                "name",
+                "quota",
+                "space_type"
+              ],
+              "properties": {
+                "name": {
+                  "type": "string",
+                  "enum": ["Alice Hansen"]
+                },
+                "quota": {
+                  "type": "object",
+                  "required": [
+                    "quota_max_bytes",
+                    "quota_max_files"
+                  ],
+                  "properties": {
+                    "quota_max_bytes": {
+                      "type": "number",
+                      "enum": [10000]
+                    },
+                    "quota_max_files": {
+                      "type": "number",
+                      "enum": [18446744073709552000]
+                    }
+                  }
+                },
+                "space_type": {
+                  "type": "string",
+                  "enum": ["personal"]
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    """
+
+
+  Scenario Outline: user tries to generate GDPR report of other users
+    Given user "Brian" has been created with default attributes and without skeleton files
+    And the administrator has given "Alice" the role "<userRole>" using the settings api
+    And the administrator has given "Brian" the role "<role>" using the settings api
+    When user "Alice" tries to export GDPR report of user "Brian" to "/.personal_data_export.json" using Graph API
+    Then the HTTP status code should be "400"
+    Examples:
+      | userRole    | role        |
+      | Space Admin | Space Admin |
+      | Space Admin | User        |
+      | Space Admin | Guest       |
+      | Space Admin | Admin       |
+      | User        | Space Admin |
+      | User        | User        |
+      | User        | Guest       |
+      | User        | Admin       |
+      | Guest       | Space Admin |
+      | Guest       | User        |
+      | Guest       | Guest       |
+      | Guest       | Admin       |
+      | Admin       | Space Admin |
+      | Admin       | User        |
+      | Admin       | Guest       |
+      | Admin       | Admin       |
diff --git a/tests/acceptance/features/bootstrap/AppConfigurationContext.php b/tests/acceptance/features/bootstrap/AppConfigurationContext.php
index 91cefc07b85..6b6d8ddc3ef 100644
--- a/tests/acceptance/features/bootstrap/AppConfigurationContext.php
+++ b/tests/acceptance/features/bootstrap/AppConfigurationContext.php
@@ -57,22 +57,6 @@ class AppConfigurationContext implements Context {
 		$this->modifyAppConfig($app, $parameter, $value);
 	}
 
-	/**
-	 * @Given /^parameter "([^"]*)" of app "([^"]*)" has been set to ((?:'[^']*')|(?:"[^"]*"))$/
-	 *
-	 * @param string $parameter
-	 * @param string $app
-	 * @param string $value
-	 *
-	 * @return void
-	 * @throws Exception
-	 */
-	public function serverParameterHasBeenSetTo(string $parameter, string $app, string $value):void {
-		// The capturing group of the regex always includes the quotes at each
-		// end of the captured string, so trim them.
-		return;
-	}
-
 	/**
 	 * @Then the capabilities setting of :capabilitiesApp path :capabilitiesPath should be :expectedValue
 	 * @Given the capabilities setting of :capabilitiesApp path :capabilitiesPath has been confirmed to be :expectedValue
diff --git a/tests/acceptance/features/bootstrap/ArchiverContext.php b/tests/acceptance/features/bootstrap/ArchiverContext.php
index 461af9c69b1..e9415c12b44 100644
--- a/tests/acceptance/features/bootstrap/ArchiverContext.php
+++ b/tests/acceptance/features/bootstrap/ArchiverContext.php
@@ -35,7 +35,6 @@ require_once 'bootstrap.php';
  * Context for Archiver specific steps
  */
 class ArchiverContext implements Context {
-
 	/**
 	 * @var FeatureContext
 	 */
diff --git a/tests/acceptance/features/bootstrap/GraphContext.php b/tests/acceptance/features/bootstrap/GraphContext.php
index a22fa7069cc..f18f85a4987 100644
--- a/tests/acceptance/features/bootstrap/GraphContext.php
+++ b/tests/acceptance/features/bootstrap/GraphContext.php
@@ -2389,4 +2389,28 @@ class GraphContext implements Context {
 			$this->featureContext->getJSONSchema($schemaString)
 		);
 	}
+
+	/**
+	 * @When user :user tries to export GDPR report of user :ofUser to :path using Graph API
+	 *
+	 * @param string $user
+	 * @param string $ofUser
+	 * @param string $path
+	 *
+	 * @return void
+	 *
+	 */
+	public function userTriesToExportGdprReportOfAnotherUserUsingGraphApi(string $user, string $ofUser, string $path): void {
+		$credentials = $this->getAdminOrUserCredentials($user);
+		$this->featureContext->setResponse(
+			GraphHelper::generateGDPRReport(
+				$this->featureContext->getBaseUrl(),
+				$this->featureContext->getStepLineRef(),
+				$credentials['username'],
+				$credentials['password'],
+				$this->featureContext->getAttributeOfCreatedUser($ofUser, 'id'),
+				$path
+			)
+		);
+	}
 }
diff --git a/tests/acceptance/features/bootstrap/NotificationContext.php b/tests/acceptance/features/bootstrap/NotificationContext.php
index f236bd40256..59af1f7d681 100644
--- a/tests/acceptance/features/bootstrap/NotificationContext.php
+++ b/tests/acceptance/features/bootstrap/NotificationContext.php
@@ -11,6 +11,9 @@ use Behat\Behat\Hook\Scope\BeforeScenarioScope;
 use TestHelpers\OcsApiHelper;
 use Behat\Gherkin\Node\PyStringNode;
 use Helmich\JsonAssert\JsonAssertions;
+use TestHelpers\EmailHelper;
+use PHPUnit\Framework\Assert;
+use TestHelpers\GraphHelper;
 
 require_once 'bootstrap.php';
 
@@ -19,7 +22,11 @@ require_once 'bootstrap.php';
  */
 class NotificationContext implements Context {
 	private FeatureContext $featureContext;
+
+	private SpacesContext $spacesContext;
+
 	private string $notificationEndpointPath = '/apps/notifications/api/v1/notifications?format=json';
+
 	private array $notificationIds;
 
 	/**
@@ -70,6 +77,7 @@ class NotificationContext implements Context {
 		$environment = $scope->getEnvironment();
 		// Get all the contexts you need in this context
 		$this->featureContext = $environment->getContext('FeatureContext');
+		$this->spacesContext = $environment->getContext('SpacesContext');
 	}
 
 	/**
@@ -134,4 +142,105 @@ class NotificationContext implements Context {
 			$this->featureContext->getJSONSchema($schemaString)
 		);
 	}
+
+	/**
+	 * @Then user :user should have received the following email from user :sender about the share of project space :spaceName
+	 *
+	 * @param string $user
+	 * @param string $sender
+	 * @param string $spaceName
+	 * @param PyStringNode $content
+	 *
+	 * @return void
+	 * @throws Exception
+	 */
+	public function userShouldHaveReceivedTheFollowingEmailFromUserAboutTheShareOfProjectSpace(string $user, string $sender, string $spaceName, PyStringNode $content):void {
+		$rawExpectedEmailBodyContent = \str_replace("\r\n", "\n", $content->getRaw());
+		$this->featureContext->setResponse(
+			GraphHelper::getMySpaces(
+				$this->featureContext->getBaseUrl(),
+				$user,
+				$this->featureContext->getPasswordForUser($user)
+			)
+		);
+		$expectedEmailBodyContent = $this->featureContext->substituteInLineCodes(
+			$rawExpectedEmailBodyContent,
+			$sender,
+			[],
+			[
+				[
+					"code" => "%space_id%",
+					"function" =>
+						[$this->spacesContext, "getSpaceIdByNameFromResponse"],
+					"parameter" => [$spaceName]
+				],
+			],
+			null,
+			null
+		);
+		$this->assertEmailContains($user, $expectedEmailBodyContent);
+	}
+
+	/**
+	 * @Then user :user should have received the following email from user :sender
+	 *
+	 * @param string $user
+	 * @param string $sender
+	 * @param PyStringNode $content
+	 *
+	 * @return void
+	 * @throws Exception
+	 */
+	public function userShouldHaveReceivedTheFollowingEmailFromUser(string $user, string $sender, PyStringNode $content):void {
+		$rawExpectedEmailBodyContent = \str_replace("\r\n", "\n", $content->getRaw());
+		$expectedEmailBodyContent = $this->featureContext->substituteInLineCodes(
+			$rawExpectedEmailBodyContent,
+			$sender
+		);
+		$this->assertEmailContains($user, $expectedEmailBodyContent);
+	}
+
+	/***
+	 * @param string $user
+	 * @param string $expectedEmailBodyContent
+	 *
+	 * @return void
+	 * @throws GuzzleException
+	 */
+	public function assertEmailContains(string $user, string $expectedEmailBodyContent):void {
+		$address = $this->featureContext->getEmailAddressForUser($user);
+		$this->featureContext->pushEmailRecipientAsMailBox($address);
+		$actualEmailBodyContent = EmailHelper::getBodyOfLastEmail($address, $this->featureContext->getStepLineRef());
+		Assert::assertStringContainsString(
+			$expectedEmailBodyContent,
+			$actualEmailBodyContent,
+			"The email address '$address' should have received an email with the body containing $expectedEmailBodyContent
+			but the received email is $actualEmailBodyContent"
+		);
+	}
+
+	/**
+	 * Delete all the inbucket emails
+	 *
+	 * @AfterScenario @email
+	 *
+	 * @return void
+	 */
+	public function clearInbucketMessages():void {
+		try {
+			if (!empty($this->featureContext->emailRecipients)) {
+				foreach ($this->featureContext->emailRecipients as $emailRecipent) {
+					EmailHelper::deleteAllEmailsForAMailbox(
+						EmailHelper::getLocalEmailUrl(),
+						$this->featureContext->getStepLineRef(),
+						$emailRecipent
+					);
+				}
+			}
+		} catch (Exception $e) {
+			echo __METHOD__ .
+				" could not delete inbucket messages, is inbucket set up?\n" .
+				$e->getMessage();
+		}
+	}
 }
diff --git a/tests/acceptance/features/bootstrap/PublicWebDavContext.php b/tests/acceptance/features/bootstrap/PublicWebDavContext.php
index 429d2996904..1d0e96270b6 100644
--- a/tests/acceptance/features/bootstrap/PublicWebDavContext.php
+++ b/tests/acceptance/features/bootstrap/PublicWebDavContext.php
@@ -1428,7 +1428,7 @@ class PublicWebDavContext implements Context {
 		$mtime = \implode(" ", $mtime);
 		Assert::assertStringContainsString(
 			$mtime,
-			WebDavHelper::getMtimeOfFileinPublicLinkShare(
+			WebDavHelper::getMtimeOfFileInPublicLinkShare(
 				$baseUrl,
 				$fileName,
 				$token,
@@ -1454,7 +1454,7 @@ class PublicWebDavContext implements Context {
 		$baseUrl = $this->featureContext->getBaseUrl();
 		Assert::assertNotEquals(
 			$mtime,
-			WebDavHelper::getMtimeOfFileinPublicLinkShare(
+			WebDavHelper::getMtimeOfFileInPublicLinkShare(
 				$baseUrl,
 				$fileName,
 				$token,
diff --git a/tests/acceptance/features/bootstrap/Sharing.php b/tests/acceptance/features/bootstrap/Sharing.php
index 8116149a618..d4db525f70c 100644
--- a/tests/acceptance/features/bootstrap/Sharing.php
+++ b/tests/acceptance/features/bootstrap/Sharing.php
@@ -1821,8 +1821,7 @@ trait Sharing {
 			true
 		);
 
-		Assert::assertEquals(
-			true,
+		Assert::assertTrue(
 			$this->isUserOrGroupInSharedData($group, "group", $permissions),
 			__METHOD__
 			. " Could not assert that user '$user' has shared '$filepath' with group '$group' with permissions '$permissions'"
diff --git a/tests/acceptance/features/coreApiShareManagementToShares/acceptSharesToSharesFolder.feature b/tests/acceptance/features/coreApiShareManagementToShares/acceptSharesToSharesFolder.feature
index 23dc4c341d6..abcef37246c 100644
--- a/tests/acceptance/features/coreApiShareManagementToShares/acceptSharesToSharesFolder.feature
+++ b/tests/acceptance/features/coreApiShareManagementToShares/acceptSharesToSharesFolder.feature
@@ -5,8 +5,7 @@ Feature: accept/decline shares coming from internal users to the Shares folder
   So that I can keep my file system clean
 
   Background:
-    Given parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
-    And using OCS API version "1"
+    Given using OCS API version "1"
     And using new DAV path
     And these users have been created with default attributes and without skeleton files:
       | username |
diff --git a/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature b/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature
index 2d7bcdf3761..8884d080fb0 100644
--- a/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature
+++ b/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature
@@ -75,8 +75,7 @@ Feature: share access by ID
 
 
   Scenario Outline: accept a share using the invalid share Id
-    Given parameter "shareapi_auto_accept_share" of app "core" has been set to "yes"
-    And using OCS API version "<ocs_api_version>"
+    Given using OCS API version "<ocs_api_version>"
     When user "Brian" accepts share with ID "<share_id>" using the sharing API
     Then the OCS status code should be "404"
     And the HTTP status code should be "<http_status_code>"
@@ -94,8 +93,7 @@ Feature: share access by ID
 
 
   Scenario Outline: accept a share using empty share Id
-    Given parameter "shareapi_auto_accept_share" of app "core" has been set to "yes"
-    And using OCS API version "<ocs_api_version>"
+    Given using OCS API version "<ocs_api_version>"
     When user "Brian" accepts share with ID "" using the sharing API
     Then the OCS status code should be "<ocs_status_code>"
     And the HTTP status code should be "<http_status_code>"
@@ -118,16 +116,15 @@ Feature: share access by ID
       | /Shares/textfile0.txt |
     And the sharing API should report to user "Brian" that these shares are in the declined state
       | path                  |
-      | <declined_share_path> |
+      | /Shares/textfile0.txt |
     Examples:
-      | ocs_api_version | ocs_status_code | declined_share_path   |
-      | 1               | 100             | /Shares/textfile0.txt |
-      | 2               | 200             | /Shares/textfile0.txt |
+      | ocs_api_version | ocs_status_code |
+      | 1               | 100             |
+      | 2               | 200             |
 
 
   Scenario Outline: decline a share using a invalid share Id
-    Given parameter "shareapi_auto_accept_share" of app "core" has been set to "yes"
-    And using OCS API version "<ocs_api_version>"
+    Given using OCS API version "<ocs_api_version>"
     When user "Brian" declines share with ID "<share_id>" using the sharing API
     Then the OCS status code should be "404"
     And the HTTP status code should be "<http_status_code>"
@@ -145,8 +142,7 @@ Feature: share access by ID
 
 
   Scenario Outline: decline a share using empty share Id
-    Given parameter "shareapi_auto_accept_share" of app "core" has been set to "yes"
-    And using OCS API version "<ocs_api_version>"
+    Given using OCS API version "<ocs_api_version>"
     When user "Brian" declines share with ID "" using the sharing API
     Then the OCS status code should be "<ocs_status_code>"
     And the HTTP status code should be "<http_status_code>"
diff --git a/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature b/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature
index 58e54d8ed70..68a12369da8 100644
--- a/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature
+++ b/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature
@@ -219,7 +219,6 @@ Feature: create a public link share
 
   Scenario Outline: creating a link share with no specified permissions defaults to read permissions when public upload is disabled globally and accessing using the public WebDAV API
     Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_allow_public_upload" of app "core" has been set to "no"
     And user "Alice" has created folder "/afolder"
     When user "Alice" creates a public link share using the sharing API with settings
       | path | /afolder |
diff --git a/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature b/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature
index 606047026db..50af20be026 100644
--- a/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature
+++ b/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature
@@ -98,26 +98,6 @@ Feature: upload to a public link share
     When the public uploads file "test.txt" with content "test-file" using the new public WebDAV API
     Then the HTTP status code should be "507"
 
-  @issue-1328
-  Scenario: Uploading file to a public shared folder does not work when allow public uploads has been disabled before sharing and again enabled after sharing the folder with public API
-    Given parameter "shareapi_allow_public_upload" of app "core" has been set to "no"
-    And user "Alice" has created a public link share with settings
-      | path | FOLDER |
-    And parameter "shareapi_allow_public_upload" of app "core" has been set to "yes"
-    When the public uploads file "test.txt" with content "test-file" using the new public WebDAV API
-    And the HTTP status code should be "403"
-
-  @issue-1328
-  Scenario: Uploading file to a public shared folder works when allow public uploads has been disabled and again enabled after sharing the folder with public API
-    Given user "Alice" has created a public link share with settings
-      | path        | FOLDER |
-      | permissions | create |
-    And parameter "shareapi_allow_public_upload" of app "core" has been set to "no"
-    And parameter "shareapi_allow_public_upload" of app "core" has been set to "yes"
-    When the public uploads file "test.txt" with content "test-file" using the new public WebDAV API
-    Then the HTTP status code should be "201"
-    And the content of file "/FOLDER/test.txt" for user "Alice" should be "test-file"
-
   @smokeTest
   Scenario: Uploading to a public upload-write and no edit and no overwrite share with public API
     Given user "Alice" has created a public link share with settings
diff --git a/tests/acceptance/features/coreApiShareReshareToShares2/reShareDisabled.feature b/tests/acceptance/features/coreApiShareReshareToShares2/reShareDisabled.feature
index b47cf457664..b0c6133f6bc 100644
--- a/tests/acceptance/features/coreApiShareReshareToShares2/reShareDisabled.feature
+++ b/tests/acceptance/features/coreApiShareReshareToShares2/reShareDisabled.feature
@@ -11,7 +11,6 @@ Feature: resharing can be disabled
 
   Scenario Outline: ordinary sharing is allowed when allow resharing has been disabled
     Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_allow_resharing" of app "core" has been set to "no"
     When user "Alice" shares file "/textfile0.txt" with user "Brian" with permissions "share,update,read" using the sharing API
     Then the OCS status code should be "<ocs_status_code>"
     And the HTTP status code should be "200"
diff --git a/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature b/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature
index d9d9de5c1d0..8514b0fa131 100644
--- a/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature
+++ b/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature
@@ -59,271 +59,8 @@ Feature: resharing a resource with an expiration date
       | 2               | 200             |
 
 
-  Scenario Outline: resharing with user using the sharing API with expire days set and combinations of default/enforce expire date enabled
-    Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_user_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_user_share" of app "core" has been set to "yes"
-    And parameter "shareapi_expire_after_n_days_user_share" of app "core" has been set to "30"
-    And user "Carol" has been created with default attributes and without skeleton files
-    And user "Alice" has shared file "/textfile0.txt" with user "Brian" with permissions "read,update,share"
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    When user "Brian" creates a share using the sharing API with settings
-      | path        | /Shares/textfile0.txt |
-      | shareType   | user                  |
-      | permissions | change                |
-      | shareWith   | Carol                 |
-    Then the HTTP status code should be "200"
-    And the OCS status code should be "<ocs_status_code>"
-    And user "Carol" should be able to accept pending share "/textfile0.txt" offered by user "Brian"
-    And the information of the last share of user "Brian" should include
-      | expiration | <expected-expire-date> |
-    And the response when user "Carol" gets the info of the last share should include
-      | expiration | <expected-expire-date> |
-    Examples:
-      | ocs_api_version | default-expire-date | expected-expire-date | ocs_status_code |
-      | 1               | yes                 | +30 days             | 100             |
-      | 2               | yes                 | +30 days             | 200             |
-      | 1               | no                  |                      | 100             |
-      | 2               | no                  |                      | 200             |
-
-  @issue-1289
-  Scenario Outline: resharing with group using the sharing API with expire days set and combinations of default/enforce expire date enabled
-    Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_group_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_group_share" of app "core" has been set to "yes"
-    And parameter "shareapi_expire_after_n_days_group_share" of app "core" has been set to "30"
-    And user "Carol" has been created with default attributes and without skeleton files
-    And group "grp1" has been created
-    And user "Carol" has been added to group "grp1"
-    And user "Alice" has shared file "/textfile0.txt" with user "Brian" with permissions "read,update,share"
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    When user "Brian" creates a share using the sharing API with settings
-      | path        | /Shares/textfile0.txt |
-      | shareType   | group                 |
-      | permissions | change                |
-      | shareWith   | grp1                  |
-    Then the HTTP status code should be "200"
-    And the OCS status code should be "<ocs_status_code>"
-    And user "Carol" should be able to accept pending share "/textfile0.txt" offered by user "Brian"
-    And the information of the last share of user "Brian" should include
-      | expiration | <expected-expire-date> |
-    And the response when user "Carol" gets the info of the last share should include
-      | expiration | <expected-expire-date> |
-    Examples:
-      | ocs_api_version | default-expire-date | expected-expire-date | ocs_status_code |
-      | 1               | yes                 | +30 days             | 100             |
-      | 2               | yes                 | +30 days             | 200             |
-      | 1               | no                  |                      | 100             |
-      | 2               | no                  |                      | 200             |
-
-
-  Scenario Outline: resharing with user using the sharing API without expire days set and with combinations of default/enforce expire date enabled
-    Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_user_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_user_share" of app "core" has been set to "yes"
-    And user "Carol" has been created with default attributes and without skeleton files
-    And user "Alice" has shared file "/textfile0.txt" with user "Brian" with permissions "read,update,share"
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    When user "Brian" creates a share using the sharing API with settings
-      | path        | /Shares/textfile0.txt |
-      | shareType   | user                  |
-      | permissions | change                |
-      | shareWith   | Carol                 |
-    Then the HTTP status code should be "200"
-    And the OCS status code should be "<ocs_status_code>"
-    And user "Carol" should be able to accept pending share "/textfile0.txt" offered by user "Brian"
-    And the information of the last share of user "Brian" should include
-      | expiration | <expected-expire-date> |
-    And the response when user "Carol" gets the info of the last share should include
-      | expiration | <expected-expire-date> |
-    Examples:
-      | ocs_api_version | default-expire-date | expected-expire-date | ocs_status_code |
-      | 1               | yes                 | +7 days              | 100             |
-      | 2               | yes                 | +7 days              | 200             |
-      | 1               | no                  |                      | 100             |
-      | 2               | no                  |                      | 200             |
-
-  @issue-1289
-  Scenario Outline: resharing with group using the sharing API without expire days set and with combinations of default/enforce expire date enabled
-    Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_group_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_group_share" of app "core" has been set to "yes"
-    And user "Carol" has been created with default attributes and without skeleton files
-    And group "grp1" has been created
-    And user "Carol" has been added to group "grp1"
-    And user "Alice" has shared file "/textfile0.txt" with user "Brian" with permissions "read,update,share"
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    When user "Brian" creates a share using the sharing API with settings
-      | path        | /Shares/textfile0.txt |
-      | shareType   | group                 |
-      | permissions | change                |
-      | shareWith   | grp1                  |
-    Then the HTTP status code should be "200"
-    And the OCS status code should be "<ocs_status_code>"
-    And user "Carol" should be able to accept pending share "/textfile0.txt" offered by user "Brian"
-    And the information of the last share of user "Brian" should include
-      | expiration | <expected-expire-date> |
-    And the response when user "Carol" gets the info of the last share should include
-      | expiration | <expected-expire-date> |
-    Examples:
-      | ocs_api_version | default-expire-date | expected-expire-date | ocs_status_code |
-      | 1               | yes                 | +7 days              | 100             |
-      | 2               | yes                 | +7 days              | 200             |
-      | 1               | no                  |                      | 100             |
-      | 2               | no                  |                      | 200             |
-
-
-  Scenario Outline: resharing with user using the sharing API with expire days set and with combinations of default/enforce expire date enabled and specify expire date in share
-    Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_user_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_user_share" of app "core" has been set to "yes"
-    And parameter "shareapi_expire_after_n_days_user_share" of app "core" has been set to "30"
-    And user "Carol" has been created with default attributes and without skeleton files
-    And user "Alice" has shared file "/textfile0.txt" with user "Brian" with permissions "read,update,share"
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    When user "Brian" creates a share using the sharing API with settings
-      | path        | /Shares/textfile0.txt |
-      | shareType   | user                  |
-      | permissions | change                |
-      | shareWith   | Carol                 |
-      | expireDate  | +20 days              |
-    Then the HTTP status code should be "200"
-    And the OCS status code should be "<ocs_status_code>"
-    And user "Carol" should be able to accept pending share "/textfile0.txt" offered by user "Brian"
-    And the information of the last share of user "Brian" should include
-      | expiration | +20 days |
-    And the response when user "Carol" gets the info of the last share should include
-      | expiration | +20 days |
-    Examples:
-      | ocs_api_version | default-expire-date | ocs_status_code |
-      | 1               | yes                 | 100             |
-      | 2               | yes                 | 200             |
-      | 1               | no                  | 100             |
-      | 2               | no                  | 200             |
-
-  @issue-1289
-  Scenario Outline: resharing with group using the sharing API with expire days set and with combinations of default/enforce expire date enabled and specify expire date in share
-    Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_group_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_group_share" of app "core" has been set to "yes"
-    And parameter "shareapi_expire_after_n_days_group_share" of app "core" has been set to "30"
-    And user "Carol" has been created with default attributes and without skeleton files
-    And group "grp1" has been created
-    And user "Carol" has been added to group "grp1"
-    And user "Alice" has shared file "/textfile0.txt" with user "Brian" with permissions "read,update,share"
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    When user "Brian" creates a share using the sharing API with settings
-      | path        | /Shares/textfile0.txt |
-      | shareType   | group                 |
-      | permissions | change                |
-      | shareWith   | grp1                  |
-      | expireDate  | +20 days              |
-    Then the HTTP status code should be "200"
-    And the OCS status code should be "<ocs_status_code>"
-    And user "Carol" should be able to accept pending share "/textfile0.txt" offered by user "Brian"
-    And the information of the last share of user "Brian" should include
-      | expiration | +20 days |
-    And the response when user "Carol" gets the info of the last share should include
-      | expiration | +20 days |
-    Examples:
-      | ocs_api_version | default-expire-date | ocs_status_code |
-      | 1               | yes                 | 100             |
-      | 2               | yes                 | 200             |
-      | 1               | no                  | 100             |
-      | 2               | no                  | 200             |
-
-
-  Scenario Outline: Setting default expiry date and enforcement after the share is created
-    Given using OCS API version "<ocs_api_version>"
-    And user "Carol" has been created with default attributes and without skeleton files
-    And user "Alice" has shared file "/textfile0.txt" with user "Brian" with permissions "read,update,share"
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    And user "Brian" has shared file "/Shares/textfile0.txt" with user "Carol"
-    And user "Carol" has accepted share "/textfile0.txt" offered by user "Brian"
-    And parameter "shareapi_default_expire_date_user_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_user_share" of app "core" has been set to "yes"
-    And parameter "shareapi_expire_after_n_days_user_share" of app "core" has been set to "4"
-    When user "Brian" gets the info of the last share using the sharing API
-    Then the HTTP status code should be "200"
-    And the OCS status code should be "<ocs_status_code>"
-    And the information of the last share of user "Brian" should include
-      | expiration |  |
-    And the response when user "Carol" gets the info of the last share should include
-      | expiration |  |
-    Examples:
-      | ocs_api_version | default-expire-date | ocs_status_code |
-      | 1               | yes                 | 100             |
-      | 2               | yes                 | 200             |
-      | 1               | no                  | 100             |
-      | 2               | no                  | 200             |
-
-  @issue-1289
-  Scenario Outline: resharing group share with user using the sharing API with default expire date set and with combinations of default/enforce expire date enabled
-    Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_user_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_user_share" of app "core" has been set to "yes"
-    And parameter "shareapi_expire_after_n_days_user_share" of app "core" has been set to "30"
-    And group "grp1" has been created
-    And user "Carol" has been created with default attributes and without skeleton files
-    And user "Brian" has been added to group "grp1"
-    And user "Alice" has shared file "/textfile0.txt" with group "grp1" with permissions "read,update,share"
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    When user "Brian" creates a share using the sharing API with settings
-      | path        | /Shares/textfile0.txt |
-      | shareType   | user                  |
-      | permissions | change                |
-      | shareWith   | Carol                 |
-    Then the HTTP status code should be "200"
-    And the OCS status code should be "<ocs_status_code>"
-    And user "Carol" should be able to accept pending share "/textfile0.txt" offered by user "Brian"
-    And the information of the last share of user "Brian" should include
-      | expiration | <expected-expire-date> |
-    And the response when user "Carol" gets the info of the last share should include
-      | expiration | <expected-expire-date> |
-    Examples:
-      | ocs_api_version | default-expire-date | expected-expire-date | ocs_status_code |
-      | 1               | yes                 | +30 days             | 100             |
-      | 2               | yes                 | +30 days             | 200             |
-      | 1               | no                  |                      | 100             |
-      | 2               | no                  |                      | 200             |
-
-  @issue-1289
-  Scenario Outline: resharing group share with user using the sharing API with default expire date set and specifying expiration on share and with combinations of default/enforce expire date enabled
-    Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_user_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_user_share" of app "core" has been set to "yes"
-    And parameter "shareapi_expire_after_n_days_user_share" of app "core" has been set to "30"
-    And group "grp1" has been created
-    And user "Carol" has been created with default attributes and without skeleton files
-    And user "Brian" has been added to group "grp1"
-    And user "Alice" has shared file "/textfile0.txt" with group "grp1" with permissions "read,update,share"
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    When user "Brian" creates a share using the sharing API with settings
-      | path        | /Shares/textfile0.txt |
-      | shareType   | user                  |
-      | permissions | change                |
-      | shareWith   | Carol                 |
-      | expireDate  | +20 days              |
-    Then the HTTP status code should be "200"
-    And the OCS status code should be "<ocs_status_code>"
-    And user "Carol" should be able to accept pending share "/textfile0.txt" offered by user "Brian"
-    And the information of the last share of user "Brian" should include
-      | expiration | +20 days |
-    And the response when user "Carol" gets the info of the last share should include
-      | expiration | +20 days |
-    Examples:
-      | ocs_api_version | default-expire-date | ocs_status_code |
-      | 1               | yes                 | 100             |
-      | 2               | yes                 | 200             |
-      | 1               | no                  | 100             |
-      | 2               | no                  | 200             |
-
-
   Scenario Outline: resharing using the sharing API with default expire date set but not enforced
     Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_user_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_user_share" of app "core" has been set to "no"
-    And parameter "shareapi_expire_after_n_days_user_share" of app "core" has been set to "30"
     And user "Carol" has been created with default attributes and without skeleton files
     And user "Alice" has shared file "/textfile0.txt" with user "Brian" with permissions "read,update,share"
     And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
@@ -340,104 +77,6 @@ Feature: resharing a resource with an expiration date
     And the response when user "Carol" gets the info of the last share should include
       | expiration |  |
     Examples:
-      | ocs_api_version | default-expire-date | ocs_status_code |
-      | 1               | yes                 | 100             |
-      | 2               | yes                 | 200             |
-      | 1               | no                  | 100             |
-      | 2               | no                  | 200             |
-
-
-  Scenario Outline: reshare extends the received expiry date up to the default by default
-    Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_user_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_user_share" of app "core" has been set to "<enforce-expire-date>"
-    And parameter "shareapi_expire_after_n_days_user_share" of app "core" has been set to "30"
-    And user "Carol" has been created with default attributes and without skeleton files
-    And user "Alice" has created a share with settings
-      | path        | textfile0.txt |
-      | shareType   | user          |
-      | permissions | all           |
-      | shareWith   | Brian         |
-      | expireDate  | +20 days      |
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    When user "Brian" creates a share using the sharing API with settings
-      | path        | /Shares/textfile0.txt |
-      | shareType   | user                  |
-      | permissions | change                |
-      | shareWith   | Carol                 |
-    Then the HTTP status code should be "200"
-    And the OCS status code should be "<ocs_status_code>"
-    And user "Carol" should be able to accept pending share "/textfile0.txt" offered by user "Brian"
-    And the information of the last share of user "Alice" should include
-      | expiration | +20 days |
-    And the response when user "Carol" gets the info of the last share should include
-      | expiration | +20 |
-    Examples:
-      | ocs_api_version | default-expire-date | enforce-expire-date | ocs_status_code |
-      | 1               | yes                 | yes                 | 100             |
-      | 2               | yes                 | yes                 | 200             |
-      | 1               | yes                 | no                  | 100             |
-      | 2               | yes                 | no                  | 200             |
-      | 1               | no                  | no                  | 100             |
-      | 2               | no                  | no                  | 200             |
-
-
-  Scenario Outline: reshare cannot extend the received expiry date further into the future
-    Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_user_share" of app "core" has been set to "<default-expire-date>"
-    And parameter "shareapi_enforce_expire_date_user_share" of app "core" has been set to "no"
-    And parameter "shareapi_expire_after_n_days_user_share" of app "core" has been set to "30"
-    And user "Carol" has been created with default attributes and without skeleton files
-    And user "Alice" has created a share with settings
-      | path        | textfile0.txt |
-      | shareType   | user          |
-      | permissions | all           |
-      | shareWith   | Brian         |
-      | expireDate  | +20 days      |
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    When user "Brian" creates a share using the sharing API with settings
-      | path        | /Shares/textfile0.txt |
-      | shareType   | user                  |
-      | permissions | change                |
-      | shareWith   | Carol                 |
-      | expireDate  | +40 days              |
-    #The action of changing the expiration date while resharing should be forbidden
-    Then the HTTP status code should be "403"
-    And the OCS status code should be "403"
-    And the information of the last share of user "Alice" should include
-      | expiration | +20 days |
-    Examples:
-      | ocs_api_version | default-expire-date |
-      | 1               | yes                 |
-      | 2               | yes                 |
-      | 1               | no                  |
-      | 2               | no                  |
-
-
-  Scenario Outline: reshare cannot extend the received expiry date past the default when the default is enforced
-    Given using OCS API version "<ocs_api_version>"
-    And parameter "shareapi_default_expire_date_user_share" of app "core" has been set to "yes"
-    And parameter "shareapi_enforce_expire_date_user_share" of app "core" has been set to "yes"
-    And parameter "shareapi_expire_after_n_days_user_share" of app "core" has been set to "30"
-    And user "Carol" has been created with default attributes and without skeleton files
-    And user "Alice" has created a share with settings
-      | path        | textfile0.txt |
-      | shareType   | user          |
-      | permissions | all           |
-      | shareWith   | Brian         |
-      | expireDate  | +20 days      |
-    And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
-    When user "Brian" creates a share using the sharing API with settings
-      | path        | /Shares/textfile0.txt |
-      | shareType   | user                  |
-      | permissions | change                |
-      | shareWith   | Carol                 |
-      | expireDate  | +40 days              |
-    Then the HTTP status code should be "403"
-    And the OCS status code should be "403"
-    And the information of the last share of user "Alice" should include
-      | expiration | +20 days |
-    Examples:
-      | ocs_api_version |
-      | 1               |
-      | 2               |
+      | ocs_api_version | ocs_status_code |
+      | 1               | 100             |
+      | 2               | 200             |
diff --git a/tests/acceptance/features/coreApiSharees/sharees.feature b/tests/acceptance/features/coreApiSharees/sharees.feature
index 8744a596cbd..0f8cb14617f 100644
--- a/tests/acceptance/features/coreApiSharees/sharees.feature
+++ b/tests/acceptance/features/coreApiSharees/sharees.feature
@@ -60,13 +60,12 @@ Feature: search sharees
 
   Scenario Outline: search only with group members - allowed
     Given using OCS API version "<ocs-api-version>"
-    And parameter "shareapi_only_share_with_group_members" of app "core" has been set to "yes"
     And user "Sharee1" has been added to group "ShareeGroup2"
     When user "Alice" gets the sharees using the sharing API with parameters
       | search   | sharee |
       | itemType | file   |
     Then the OCS status code should be "<ocs-status>"
-    And the HTTP status code should be "<http-status>"
+    And the HTTP status code should be "200"
     And the "exact users" sharees returned should be empty
     And the "users" sharees returned should be
       | Sharee One | 0 | sharee1 |
@@ -77,9 +76,9 @@ Feature: search sharees
     And the "exact remotes" sharees returned should be empty
     And the "remotes" sharees returned should be empty
     Examples:
-      | ocs-api-version | ocs-status | http-status |
-      | 1               | 100        | 200         |
-      | 2               | 200        | 200         |
+      | ocs-api-version | ocs-status |
+      | 1               | 100        |
+      | 2               | 200        |
 
 
   Scenario Outline: search with exact match
@@ -207,7 +206,6 @@ Feature: search sharees
       | username | displayname |
       | another  | Another     |
     And user "Another" has been added to group "ShareeGroup2"
-    And parameter "shareapi_share_dialog_user_enumeration_group_members" of app "core" has been set to "yes"
     When user "Alice" gets the sharees using the sharing API with parameters
       | search   | anot |
       | itemType | file |
diff --git a/tests/acceptance/features/coreApiWebdavEtagPropagation1/deleteFileFolder.feature b/tests/acceptance/features/coreApiWebdavEtagPropagation1/deleteFileFolder.feature
index d3d5d9cefcc..86a85070c71 100644
--- a/tests/acceptance/features/coreApiWebdavEtagPropagation1/deleteFileFolder.feature
+++ b/tests/acceptance/features/coreApiWebdavEtagPropagation1/deleteFileFolder.feature
@@ -3,7 +3,6 @@ Feature: propagation of etags when deleting a file or folder
 
   Background:
     Given user "Alice" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And user "Alice" has created folder "/upload"
 
 
@@ -147,7 +146,6 @@ Feature: propagation of etags when deleting a file or folder
   @issue-product-280
   Scenario Outline: as share receiver deleting a folder changes the etags of all parents for all collaborators
     Given user "Brian" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And using <dav_version> DAV path
     And user "Alice" has created folder "/upload/sub"
     And user "Alice" has created folder "/upload/sub/toDelete"
@@ -179,7 +177,6 @@ Feature: propagation of etags when deleting a file or folder
   @issue-product-280
   Scenario Outline: as sharer deleting a folder changes the etags of all parents for all collaborators
     Given user "Brian" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And using <dav_version> DAV path
     And user "Alice" has created folder "/upload/sub"
     And user "Alice" has created folder "/upload/sub/toDelete"
diff --git a/tests/acceptance/features/coreApiWebdavEtagPropagation1/moveFileFolder.feature b/tests/acceptance/features/coreApiWebdavEtagPropagation1/moveFileFolder.feature
index 35b3d0b0769..ec7d141616c 100644
--- a/tests/acceptance/features/coreApiWebdavEtagPropagation1/moveFileFolder.feature
+++ b/tests/acceptance/features/coreApiWebdavEtagPropagation1/moveFileFolder.feature
@@ -157,7 +157,6 @@ Feature: propagation of etags when moving files or folders
 
   Scenario Outline: as share receiver renaming a file inside a folder changes its etag for all collaborators
     Given user "Brian" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And using <dav_version> DAV path
     And user "Alice" has created folder "/upload"
     And user "Alice" has uploaded file with content "uploaded content" to "/upload/file.txt"
@@ -185,7 +184,6 @@ Feature: propagation of etags when moving files or folders
 
   Scenario Outline: as sharer renaming a file inside a folder changes its etag for all collaborators
     Given user "Brian" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And using <dav_version> DAV path
     And user "Alice" has created folder "/upload"
     And user "Alice" has uploaded file with content "uploaded content" to "/upload/file.txt"
@@ -213,7 +211,6 @@ Feature: propagation of etags when moving files or folders
   @issue-product-280
   Scenario Outline: as sharer moving a file from one folder to an other changes the etags of both folders for all collaborators
     Given user "Brian" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And using <dav_version> DAV path
     And user "Alice" has created folder "/src"
     And user "Alice" has created folder "/dst"
@@ -248,7 +245,6 @@ Feature: propagation of etags when moving files or folders
 
   Scenario Outline: as share receiver moving a file from one folder to an other changes the etags of both folders for all collaborators
     Given user "Brian" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And using <dav_version> DAV path
     And user "Alice" has created folder "/src"
     And user "Alice" has created folder "/dst"
@@ -283,7 +279,6 @@ Feature: propagation of etags when moving files or folders
   @issue-product-280
   Scenario Outline: as sharer moving a folder from one folder to an other changes the etags of both folders for all collaborators
     Given user "Brian" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And using <dav_version> DAV path
     And user "Alice" has created folder "/src"
     And user "Alice" has created folder "/dst"
@@ -318,7 +313,6 @@ Feature: propagation of etags when moving files or folders
 
   Scenario Outline: as share receiver moving a folder from one folder to an other changes the etags of both folders for all collaborators
     Given user "Brian" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And using <dav_version> DAV path
     And user "Alice" has created folder "/src"
     And user "Alice" has created folder "/dst"
diff --git a/tests/acceptance/features/coreApiWebdavEtagPropagation2/copyFileFolder.feature b/tests/acceptance/features/coreApiWebdavEtagPropagation2/copyFileFolder.feature
index 75cdeaabf9b..7f3149199d2 100644
--- a/tests/acceptance/features/coreApiWebdavEtagPropagation2/copyFileFolder.feature
+++ b/tests/acceptance/features/coreApiWebdavEtagPropagation2/copyFileFolder.feature
@@ -154,7 +154,6 @@ Feature: propagation of etags when copying files or folders
 
   Scenario Outline: as share receiver copying a file inside a folder changes its etag for all collaborators
     Given user "Brian" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And using <dav_version> DAV path
     And user "Alice" has created folder "/upload"
     And user "Alice" has uploaded file with content "uploaded content" to "/upload/file.txt"
@@ -192,7 +191,6 @@ Feature: propagation of etags when copying files or folders
   @issue-product-280
   Scenario Outline: as sharer copying a file inside a folder changes its etag for all collaborators
     Given user "Brian" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And using <dav_version> DAV path
     And user "Alice" has created folder "/upload"
     And user "Alice" has uploaded file with content "uploaded content" to "/upload/file.txt"
diff --git a/tests/acceptance/features/coreApiWebdavEtagPropagation2/createFolder.feature b/tests/acceptance/features/coreApiWebdavEtagPropagation2/createFolder.feature
index 460a985bd10..aeeec2b61bd 100644
--- a/tests/acceptance/features/coreApiWebdavEtagPropagation2/createFolder.feature
+++ b/tests/acceptance/features/coreApiWebdavEtagPropagation2/createFolder.feature
@@ -3,7 +3,6 @@ Feature: propagation of etags when creating folders
 
   Background:
     Given user "Alice" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
 
   @issue-product-280
   Scenario Outline: creating a folder inside a folder changes its etag
diff --git a/tests/acceptance/features/coreApiWebdavEtagPropagation2/upload.feature b/tests/acceptance/features/coreApiWebdavEtagPropagation2/upload.feature
index a875e7579ca..90fd3a4b6b6 100644
--- a/tests/acceptance/features/coreApiWebdavEtagPropagation2/upload.feature
+++ b/tests/acceptance/features/coreApiWebdavEtagPropagation2/upload.feature
@@ -3,7 +3,6 @@ Feature: propagation of etags when uploading data
 
   Background:
     Given user "Alice" has been created with default attributes and without skeleton files
-    And parameter "shareapi_auto_accept_share" of app "core" has been set to "no"
     And user "Alice" has created folder "/upload"
 
   @issue-product-280
diff --git a/tests/parallelDeployAcceptance/features/bootstrap/ParallelContext.php b/tests/parallelDeployAcceptance/features/bootstrap/ParallelContext.php
index 23e6202ce87..671a9423c5f 100644
--- a/tests/parallelDeployAcceptance/features/bootstrap/ParallelContext.php
+++ b/tests/parallelDeployAcceptance/features/bootstrap/ParallelContext.php
@@ -31,7 +31,6 @@ require_once 'bootstrap.php';
  * Steps related to parallel deploy setup
  */
 class ParallelContext implements Context {
-
 	/**
 	 * @var FeatureContext
 	 */