Repository: owncloud/ocis
Pull request #9716 (2024-07-30 14:06:06)

add collabora extra param
this fix can help to solve this issue https://github.com/owncloud/ocis/issues/9706#issuecomment-2257756493 with local running collabora v.24

related https://github.com/owncloud/web/pull/11301

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

micbar: We need to create an env var for this in the .env file because we should not set the default to insecure.
sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=9716) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=9716&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=9716&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=9716&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=9716&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=9716&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=9716)


sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=9716) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=9716&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=9716&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=9716&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=9716&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=9716&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=9716)



Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 718200b0f70..530f1480412 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,6 @@
 # Table of Contents
 
 * [Changelog for unreleased](#changelog-for-unreleased-unreleased)
-* [Changelog for 6.2.0](#changelog-for-620-2024-07-30)
 * [Changelog for 6.1.0](#changelog-for-610-2024-07-08)
 * [Changelog for 6.0.0](#changelog-for-600-2024-06-19)
 * [Changelog for 5.0.3](#changelog-for-503-2024-05-02)
@@ -19,8 +18,8 @@
 * [Changelog for 3.0.0](#changelog-for-300-2023-06-06)
 * [Changelog for 2.0.0](#changelog-for-200-2022-11-30)
 * [Changelog for 1.20.0](#changelog-for-1200-2022-04-13)
-* [Changelog for 1.19.0](#changelog-for-1190-2022-03-29)
 * [Changelog for 1.19.1](#changelog-for-1191-2022-03-29)
+* [Changelog for 1.19.0](#changelog-for-1190-2022-03-29)
 * [Changelog for 1.18.0](#changelog-for-1180-2022-03-03)
 * [Changelog for 1.17.0](#changelog-for-1170-2022-02-16)
 * [Changelog for 1.16.0](#changelog-for-1160-2021-12-10)
@@ -45,54 +44,7 @@
 
 The following sections list the changes for unreleased.
 
-[unreleased]: https://github.com/owncloud/ocis/compare/v6.2.0...master
-
-## Summary
-
-* Bugfix - Ignore address for kubernetes registry: [#9490](https://github.com/owncloud/ocis/pull/9490)
-* Bugfix - Repair nats-js-kv registry: [#9656](https://github.com/owncloud/ocis/pull/9656)
-* Bugfix - Use bool type for web embed delegatedAuthentication: [#9692](https://github.com/owncloud/ocis/pull/9692)
-* Enhancement - Gateways should directly talk to themselves: [#9714](https://github.com/owncloud/ocis/pull/9714)
-* Enhancement - Bump reva: [#9715](https://github.com/owncloud/ocis/pull/9715)
-
-## Details
-
-* Bugfix - Ignore address for kubernetes registry: [#9490](https://github.com/owncloud/ocis/pull/9490)
-
-   We no longer pass an address to the go micro kubernetes registry implementation.
-   This causes the implementation to autodetect the namespace and not hardcode it
-   to `default`.
-
-   https://github.com/owncloud/ocis/pull/9490
-
-* Bugfix - Repair nats-js-kv registry: [#9656](https://github.com/owncloud/ocis/pull/9656)
-
-   The registry would always send traffic to only one pod. This is now fixed and
-   load should be spread evenly. Also implements watcher method so the cache can
-   use it.
-
-   https://github.com/owncloud/ocis/pull/9656
-
-* Bugfix - Use bool type for web embed delegatedAuthentication: [#9692](https://github.com/owncloud/ocis/pull/9692)
-
-   https://github.com/owncloud/ocis/pull/9692
-
-* Enhancement - Gateways should directly talk to themselves: [#9714](https://github.com/owncloud/ocis/pull/9714)
-
-   The CS3 gateway can directly to itself when it wants to talk to the registries
-   running in the same reva runtime.
-
-   https://github.com/owncloud/ocis/pull/9714
-
-* Enhancement - Bump reva: [#9715](https://github.com/owncloud/ocis/pull/9715)
-
-   https://github.com/owncloud/ocis/pull/9715
-
-# Changelog for [6.2.0] (2024-07-30)
-
-The following sections list the changes for 6.2.0.
-
-[6.2.0]: https://github.com/owncloud/ocis/compare/v6.1.0...v6.2.0
+[unreleased]: https://github.com/owncloud/ocis/compare/v6.1.0...master
 
 ## Summary
 
@@ -8852,7 +8804,7 @@ The following sections list the changes for 2.0.0.
 
 The following sections list the changes for 1.20.0.
 
-[1.20.0]: https://github.com/owncloud/ocis/compare/v1.19.0...v1.20.0
+[1.20.0]: https://github.com/owncloud/ocis/compare/v1.19.1...v1.20.0
 
 ## Summary
 
@@ -9026,11 +8978,29 @@ The following sections list the changes for 1.20.0.
    https://github.com/owncloud/ocis/pull/3509
    https://github.com/owncloud/web/releases/tag/v5.4.0
 
+# Changelog for [1.19.1] (2022-03-29)
+
+The following sections list the changes for 1.19.1.
+
+[1.19.1]: https://github.com/owncloud/ocis/compare/v1.19.0...v1.19.1
+
+## Summary
+
+* Bugfix - Return correct special item urls: [#3419](https://github.com/owncloud/ocis/pull/3419)
+
+## Details
+
+* Bugfix - Return correct special item urls: [#3419](https://github.com/owncloud/ocis/pull/3419)
+
+   URLs for Special items (space image, readme) were broken.
+
+   https://github.com/owncloud/ocis/pull/3419
+
 # Changelog for [1.19.0] (2022-03-29)
 
 The following sections list the changes for 1.19.0.
 
-[1.19.0]: https://github.com/owncloud/ocis/compare/v1.19.1...v1.19.0
+[1.19.0]: https://github.com/owncloud/ocis/compare/v1.18.0...v1.19.0
 
 ## Summary
 
@@ -9204,24 +9174,6 @@ The following sections list the changes for 1.19.0.
    https://github.com/owncloud/ocis/pull/3375
    https://github.com/owncloud/web/releases/tag/v5.3.0
 
-# Changelog for [1.19.1] (2022-03-29)
-
-The following sections list the changes for 1.19.1.
-
-[1.19.1]: https://github.com/owncloud/ocis/compare/v1.18.0...v1.19.1
-
-## Summary
-
-* Bugfix - Return correct special item urls: [#3419](https://github.com/owncloud/ocis/pull/3419)
-
-## Details
-
-* Bugfix - Return correct special item urls: [#3419](https://github.com/owncloud/ocis/pull/3419)
-
-   URLs for Special items (space image, readme) were broken.
-
-   https://github.com/owncloud/ocis/pull/3419
-
 # Changelog for [1.18.0] (2022-03-03)
 
 The following sections list the changes for 1.18.0.
diff --git a/changelog/6.2.0_2024-07-30/bump-reva.md b/changelog/6.2.0_2024-07-30/bump-reva.md
deleted file mode 100644
index 84288fd522e..00000000000
--- a/changelog/6.2.0_2024-07-30/bump-reva.md
+++ /dev/null
@@ -1,23 +0,0 @@
-Enhancement: Bump reva to v.2.22.0
-
-*   Bugfix [cs3org/reva#4741](https://github.com/cs3org/reva/pull/4741): Always find unique providers
-*   Bugfix [cs3org/reva#4762](https://github.com/cs3org/reva/pull/4762): Blanks in dav Content-Disposition header
-*   Bugfix [cs3org/reva#4775](https://github.com/cs3org/reva/pull/4775): Fixed the response code when copying the shared from to personal
-*   Bugfix [cs3org/reva#4633](https://github.com/cs3org/reva/pull/4633): Allow all users to create internal links
-*   Bugfix [cs3org/reva#4771](https://github.com/cs3org/reva/pull/4771): Deleting resources via their id
-*   Bugfix [cs3org/reva#4768](https://github.com/cs3org/reva/pull/4768): Fixed the file name validation if nodeid is used
-*   Bugfix [cs3org/reva#4758](https://github.com/cs3org/reva/pull/4758): Fix moving locked files, enable handling locked files via ocdav
-*   Bugfix [cs3org/reva#4774](https://github.com/cs3org/reva/pull/4774): Fix micro ocdav service init and registration
-*   Bugfix [cs3org/reva#4776](https://github.com/cs3org/reva/pull/4776): Fix response code for DEL file that in postprocessing
-*   Bugfix [cs3org/reva#4746](https://github.com/cs3org/reva/pull/4746): Uploading the same file multiple times leads to orphaned blobs
-*   Bugfix [cs3org/reva#4778](https://github.com/cs3org/reva/pull/4778): Zero byte uploads
-*   Change [cs3org/reva#4759](https://github.com/cs3org/reva/pull/4759): Updated to the latest version of the go-cs3apis
-*   Change [cs3org/reva#4773](https://github.com/cs3org/reva/pull/4773): Ocis bumped
-*   Enhancement [cs3org/reva#4766](https://github.com/cs3org/reva/pull/4766): Set archiver output format via query parameter
-*   Enhancement [cs3org/reva#4763](https://github.com/cs3org/reva/pull/4763): Improve posixfs storage driver
-
-https://github.com/owncloud/ocis/pull/9690
-https://github.com/owncloud/ocis/pull/9662
-https://github.com/owncloud/ocis/pull/9621
-https://github.com/owncloud/ocis/pull/9677
-https://github.com/owncloud/ocis/pull/9689
diff --git a/changelog/6.2.0_2024-07-30/added-full-docker-debug.md b/changelog/unreleased/added-full-docker-debug.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/added-full-docker-debug.md
rename to changelog/unreleased/added-full-docker-debug.md
diff --git a/changelog/6.2.0_2024-07-30/auth-app-service.md b/changelog/unreleased/auth-app-service.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/auth-app-service.md
rename to changelog/unreleased/auth-app-service.md
diff --git a/changelog/6.2.0_2024-07-30/bugfix-fix-crash-on-empty-tracingprovider.md b/changelog/unreleased/bugfix-fix-crash-on-empty-tracingprovider.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/bugfix-fix-crash-on-empty-tracingprovider.md
rename to changelog/unreleased/bugfix-fix-crash-on-empty-tracingprovider.md
diff --git a/changelog/6.2.0_2024-07-30/bugfix-missing-invitation-in-permissions.md b/changelog/unreleased/bugfix-missing-invitation-in-permissions.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/bugfix-missing-invitation-in-permissions.md
rename to changelog/unreleased/bugfix-missing-invitation-in-permissions.md
diff --git a/changelog/unreleased/bump-reva.md b/changelog/unreleased/bump-reva.md
index e2d1ab51865..84288fd522e 100644
--- a/changelog/unreleased/bump-reva.md
+++ b/changelog/unreleased/bump-reva.md
@@ -1,3 +1,23 @@
-Enhancement: Bump reva
+Enhancement: Bump reva to v.2.22.0
 
-https://github.com/owncloud/ocis/pull/9715
\ No newline at end of file
+*   Bugfix [cs3org/reva#4741](https://github.com/cs3org/reva/pull/4741): Always find unique providers
+*   Bugfix [cs3org/reva#4762](https://github.com/cs3org/reva/pull/4762): Blanks in dav Content-Disposition header
+*   Bugfix [cs3org/reva#4775](https://github.com/cs3org/reva/pull/4775): Fixed the response code when copying the shared from to personal
+*   Bugfix [cs3org/reva#4633](https://github.com/cs3org/reva/pull/4633): Allow all users to create internal links
+*   Bugfix [cs3org/reva#4771](https://github.com/cs3org/reva/pull/4771): Deleting resources via their id
+*   Bugfix [cs3org/reva#4768](https://github.com/cs3org/reva/pull/4768): Fixed the file name validation if nodeid is used
+*   Bugfix [cs3org/reva#4758](https://github.com/cs3org/reva/pull/4758): Fix moving locked files, enable handling locked files via ocdav
+*   Bugfix [cs3org/reva#4774](https://github.com/cs3org/reva/pull/4774): Fix micro ocdav service init and registration
+*   Bugfix [cs3org/reva#4776](https://github.com/cs3org/reva/pull/4776): Fix response code for DEL file that in postprocessing
+*   Bugfix [cs3org/reva#4746](https://github.com/cs3org/reva/pull/4746): Uploading the same file multiple times leads to orphaned blobs
+*   Bugfix [cs3org/reva#4778](https://github.com/cs3org/reva/pull/4778): Zero byte uploads
+*   Change [cs3org/reva#4759](https://github.com/cs3org/reva/pull/4759): Updated to the latest version of the go-cs3apis
+*   Change [cs3org/reva#4773](https://github.com/cs3org/reva/pull/4773): Ocis bumped
+*   Enhancement [cs3org/reva#4766](https://github.com/cs3org/reva/pull/4766): Set archiver output format via query parameter
+*   Enhancement [cs3org/reva#4763](https://github.com/cs3org/reva/pull/4763): Improve posixfs storage driver
+
+https://github.com/owncloud/ocis/pull/9690
+https://github.com/owncloud/ocis/pull/9662
+https://github.com/owncloud/ocis/pull/9621
+https://github.com/owncloud/ocis/pull/9677
+https://github.com/owncloud/ocis/pull/9689
diff --git a/changelog/6.2.0_2024-07-30/bump-web-commitid.md b/changelog/unreleased/bump-web-commitid.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/bump-web-commitid.md
rename to changelog/unreleased/bump-web-commitid.md
diff --git a/changelog/6.2.0_2024-07-30/collaboration-logging.md b/changelog/unreleased/collaboration-logging.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/collaboration-logging.md
rename to changelog/unreleased/collaboration-logging.md
diff --git a/changelog/6.2.0_2024-07-30/collaboration-msoo-locking.md b/changelog/unreleased/collaboration-msoo-locking.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/collaboration-msoo-locking.md
rename to changelog/unreleased/collaboration-msoo-locking.md
diff --git a/changelog/6.2.0_2024-07-30/collaboration-proofkeys.md b/changelog/unreleased/collaboration-proofkeys.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/collaboration-proofkeys.md
rename to changelog/unreleased/collaboration-proofkeys.md
diff --git a/changelog/6.2.0_2024-07-30/fix-401-on-admin-resources-by-nonadmin.md b/changelog/unreleased/fix-401-on-admin-resources-by-nonadmin.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/fix-401-on-admin-resources-by-nonadmin.md
rename to changelog/unreleased/fix-401-on-admin-resources-by-nonadmin.md
diff --git a/changelog/6.2.0_2024-07-30/fix-copy-responce.md b/changelog/unreleased/fix-copy-responce.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/fix-copy-responce.md
rename to changelog/unreleased/fix-copy-responce.md
diff --git a/changelog/6.2.0_2024-07-30/fix-filename-validation.md b/changelog/unreleased/fix-filename-validation.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/fix-filename-validation.md
rename to changelog/unreleased/fix-filename-validation.md
diff --git a/changelog/6.2.0_2024-07-30/fix-missing-secure-view-attr.md b/changelog/unreleased/fix-missing-secure-view-attr.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/fix-missing-secure-view-attr.md
rename to changelog/unreleased/fix-missing-secure-view-attr.md
diff --git a/changelog/unreleased/fix-natsjskv-registry-2.md b/changelog/unreleased/fix-natsjskv-registry-2.md
deleted file mode 100644
index bfb72368ac7..00000000000
--- a/changelog/unreleased/fix-natsjskv-registry-2.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Bugfix: Repair nats-js-kv registry
-
-The registry would always send traffic to only one pod. This is now fixed and load should be spread evenly. Also implements watcher method so the cache can use it.
-
-https://github.com/owncloud/ocis/pull/9656
diff --git a/changelog/6.2.0_2024-07-30/fix-natsjskv-registry.md b/changelog/unreleased/fix-natsjskv-registry.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/fix-natsjskv-registry.md
rename to changelog/unreleased/fix-natsjskv-registry.md
diff --git a/changelog/6.2.0_2024-07-30/fix-panic.md b/changelog/unreleased/fix-panic.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/fix-panic.md
rename to changelog/unreleased/fix-panic.md
diff --git a/changelog/6.2.0_2024-07-30/fix-postprocessing-responce.md b/changelog/unreleased/fix-postprocessing-responce.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/fix-postprocessing-responce.md
rename to changelog/unreleased/fix-postprocessing-responce.md
diff --git a/changelog/6.2.0_2024-07-30/fix-trash-command.md b/changelog/unreleased/fix-trash-command.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/fix-trash-command.md
rename to changelog/unreleased/fix-trash-command.md
diff --git a/changelog/unreleased/fix-web-delegatedauthentication-type.md b/changelog/unreleased/fix-web-delegatedauthentication-type.md
deleted file mode 100644
index b86f1c252dd..00000000000
--- a/changelog/unreleased/fix-web-delegatedauthentication-type.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Bugfix: use bool type for web embed delegatedAuthentication
-
-https://github.com/owncloud/ocis/pull/9692
\ No newline at end of file
diff --git a/changelog/6.2.0_2024-07-30/fix-workers-lock.md b/changelog/unreleased/fix-workers-lock.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/fix-workers-lock.md
rename to changelog/unreleased/fix-workers-lock.md
diff --git a/changelog/unreleased/ignore-address-for-kubernetes-registry.md b/changelog/unreleased/ignore-address-for-kubernetes-registry.md
deleted file mode 100644
index db857f75c7a..00000000000
--- a/changelog/unreleased/ignore-address-for-kubernetes-registry.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Bugfix: Ignore address for kubernetes registry
-
-We no longer pass an address to the go micro kubernetes registry implementation. This causes the implementation to autodetect the namespace and not hardcode it to `default`.
-
-https://github.com/owncloud/ocis/pull/9490
diff --git a/changelog/6.2.0_2024-07-30/initdiffmode.md b/changelog/unreleased/initdiffmode.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/initdiffmode.md
rename to changelog/unreleased/initdiffmode.md
diff --git a/changelog/6.2.0_2024-07-30/log-useragent-and-remoteaddr.md b/changelog/unreleased/log-useragent-and-remoteaddr.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/log-useragent-and-remoteaddr.md
rename to changelog/unreleased/log-useragent-and-remoteaddr.md
diff --git a/changelog/6.2.0_2024-07-30/missing-wopi-keys.md b/changelog/unreleased/missing-wopi-keys.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/missing-wopi-keys.md
rename to changelog/unreleased/missing-wopi-keys.md
diff --git a/changelog/unreleased/omit-some-lookups-in-gateway.md b/changelog/unreleased/omit-some-lookups-in-gateway.md
deleted file mode 100644
index 578081008dc..00000000000
--- a/changelog/unreleased/omit-some-lookups-in-gateway.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Enhancement: Gateways should directly talk to themselves
-
-The CS3 gateway can directly to itself when it wants to talk to the registries running in the same reva runtime.
-
-https://github.com/owncloud/ocis/pull/9714
diff --git a/changelog/6.2.0_2024-07-30/remove-oidc-go-dependency.md b/changelog/unreleased/remove-oidc-go-dependency.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/remove-oidc-go-dependency.md
rename to changelog/unreleased/remove-oidc-go-dependency.md
diff --git a/changelog/6.2.0_2024-07-30/remove-unavailable-web-config-options.md b/changelog/unreleased/remove-unavailable-web-config-options.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/remove-unavailable-web-config-options.md
rename to changelog/unreleased/remove-unavailable-web-config-options.md
diff --git a/changelog/6.2.0_2024-07-30/update-web-10.0.0.md b/changelog/unreleased/update-web-10.0.0.md
similarity index 100%
rename from changelog/6.2.0_2024-07-30/update-web-10.0.0.md
rename to changelog/unreleased/update-web-10.0.0.md
diff --git a/deployments/continuous-deployment-config/ocis_full/onlyoffice-rolling.yml b/deployments/continuous-deployment-config/ocis_full/onlyoffice-rolling.yml
index 8139dc4abf0..2393e0643bd 100644
--- a/deployments/continuous-deployment-config/ocis_full/onlyoffice-rolling.yml
+++ b/deployments/continuous-deployment-config/ocis_full/onlyoffice-rolling.yml
@@ -32,7 +32,7 @@
         env:
           INSECURE: "false"
           TRAEFIK_ACME_MAIL: mbarz@owncloud.com
-          OCIS_DOCKER_TAG: 6.2.0
+          OCIS_DOCKER_TAG: 6.1.0
           OCIS_DOCKER_IMAGE: owncloud/ocis-rolling
           OCIS_DOMAIN: ocis.ocis-onlyoffice.rolling.owncloud.works
           COMPANION_DOMAIN: companion.ocis-onlyoffice.rolling.owncloud.works
diff --git a/deployments/continuous-deployment-config/ocis_full/rolling.yml b/deployments/continuous-deployment-config/ocis_full/rolling.yml
index e4b54783684..e946d841b65 100644
--- a/deployments/continuous-deployment-config/ocis_full/rolling.yml
+++ b/deployments/continuous-deployment-config/ocis_full/rolling.yml
@@ -32,7 +32,7 @@
         env:
           INSECURE: "false"
           TRAEFIK_ACME_MAIL: mbarz@owncloud.com
-          OCIS_DOCKER_TAG: 6.2.0
+          OCIS_DOCKER_TAG: 6.1.0
           OCIS_DOCKER_IMAGE: owncloud/ocis-rolling
           OCIS_DOMAIN: ocis.ocis.rolling.owncloud.works
           COMPANION_DOMAIN: companion.ocis.rolling.owncloud.works
diff --git a/deployments/continuous-deployment-config/ocis_full/s3-rolling.yml b/deployments/continuous-deployment-config/ocis_full/s3-rolling.yml
index eb159495050..4bf01f21802 100644
--- a/deployments/continuous-deployment-config/ocis_full/s3-rolling.yml
+++ b/deployments/continuous-deployment-config/ocis_full/s3-rolling.yml
@@ -32,7 +32,7 @@
         env:
           INSECURE: "false"
           TRAEFIK_ACME_MAIL: mbarz@owncloud.com
-          OCIS_DOCKER_TAG: 6.2.0
+          OCIS_DOCKER_TAG: 6.1.0
           OCIS_DOCKER_IMAGE: owncloud/ocis-rolling
           OCIS_DOMAIN: ocis.ocis-s3.rolling.owncloud.works
           COMPANION_DOMAIN: companion.ocis-s3.rolling.owncloud.works
diff --git a/deployments/continuous-deployment-config/ocis_keycloak/rolling.yml b/deployments/continuous-deployment-config/ocis_keycloak/rolling.yml
index 9c91ae29124..66b28e5dbc5 100644
--- a/deployments/continuous-deployment-config/ocis_keycloak/rolling.yml
+++ b/deployments/continuous-deployment-config/ocis_keycloak/rolling.yml
@@ -32,7 +32,7 @@
         env:
           INSECURE: "false"
           TRAEFIK_ACME_MAIL: mbarz@owncloud.com
-          OCIS_DOCKER_TAG: 6.2.0
+          OCIS_DOCKER_TAG: 6.1.0
           OCIS_DOCKER_IMAGE: owncloud/ocis-rolling
           OCIS_DOMAIN: ocis.ocis-keycloak.rolling.owncloud.works
           KEYCLOAK_DOMAIN: keycloak.ocis-keycloak.rolling.owncloud.works
diff --git a/deployments/continuous-deployment-config/ocis_ldap/rolling.yml b/deployments/continuous-deployment-config/ocis_ldap/rolling.yml
index cfa761618f2..bc79cad2cbc 100644
--- a/deployments/continuous-deployment-config/ocis_ldap/rolling.yml
+++ b/deployments/continuous-deployment-config/ocis_ldap/rolling.yml
@@ -32,7 +32,7 @@
         env:
           INSECURE: "false"
           TRAEFIK_ACME_MAIL: mbarz@owncloud.com
-          OCIS_DOCKER_TAG: 6.2.0
+          OCIS_DOCKER_TAG: 6.1.0
           OCIS_DOCKER_IMAGE: owncloud/ocis-rolling
           OCIS_DOMAIN: ocis.ocis-ldap.rolling.owncloud.works
           LDAP_MANAGER_DOMAIN: ldap.ocis-ldap.rolling.owncloud.works
diff --git a/deployments/examples/ocis_full/.env b/deployments/examples/ocis_full/.env
index d5913ca1115..ec835d18c5a 100644
--- a/deployments/examples/ocis_full/.env
+++ b/deployments/examples/ocis_full/.env
@@ -129,6 +129,11 @@ COLLABORA_ADMIN_USER=
 # Admin password for Collabora.
 # Defaults to "admin".
 COLLABORA_ADMIN_PASSWORD=
+# Set to true to enable SSL for Collabora Online. Default is true if not specified.
+COLLABORA_SSL_ENABLE=false
+# If you're on an internet-facing server, enable SSL verification for Collabora Online.
+# Please comment out the following line:
+COLLABORA_SSL_VERIFICATION=false
 
 ### Supplemental Configurations ###
 # If you want to use supplemental configurations,
diff --git a/deployments/examples/ocis_full/collabora.yml b/deployments/examples/ocis_full/collabora.yml
index e39a5adee23..b766fba0591 100644
--- a/deployments/examples/ocis_full/collabora.yml
+++ b/deployments/examples/ocis_full/collabora.yml
@@ -55,7 +55,12 @@ services:
     environment:
       aliasgroup1: https://${WOPISERVER_DOMAIN:-wopiserver.owncloud.test}:443
       DONT_GEN_SSL_CERT: "YES"
-      extra_params: --o:ssl.enable=false --o:ssl.termination=true --o:welcome.enable=false --o:net.frame_ancestors=${OCIS_DOMAIN:-ocis.owncloud.test}
+      extra_params: |
+        --o:ssl.enable=${COLLABORA_SSL_ENABLE:-true} \
+        --o:ssl.ssl_verification=${COLLABORA_SSL_VERIFICATION:-true} \
+        --o:ssl.termination=true \
+        --o:welcome.enable=false \
+        --o:net.frame_ancestors=${OCIS_DOMAIN:-ocis.owncloud.test}
       username: ${COLLABORA_ADMIN_USER:-admin}
       password: ${COLLABORA_ADMIN_PASSWORD:-admin}
     cap_add:
diff --git a/deployments/examples/ocis_full/docker-compose.yml b/deployments/examples/ocis_full/docker-compose.yml
index 264e9f3a312..15a2389fe8b 100644
--- a/deployments/examples/ocis_full/docker-compose.yml
+++ b/deployments/examples/ocis_full/docker-compose.yml
@@ -11,7 +11,7 @@ services:
       - "--certificatesResolvers.http.acme.email=${TRAEFIK_ACME_MAIL:-example@example.org}"
       - "--certificatesResolvers.http.acme.storage=/certs/acme.json"
       - "--certificatesResolvers.http.acme.httpChallenge.entryPoint=http"
-      - "--certificatesresolvers.http.acme.caserver=${TRAEFIK_ACME_CASERVER:-https://acme-v02.api.letsencrypt.org/directory}"
+      - "--certificatesResolvers.http.acme.caserver=${TRAEFIK_ACME_CASERVER:-https://acme-v02.api.letsencrypt.org/directory}"
       # enable dashboard
       - "--api.dashboard=true"
       # define entrypoints
diff --git a/go.mod b/go.mod
index 5d193f86c0f..f7ad78d0dac 100644
--- a/go.mod
+++ b/go.mod
@@ -15,7 +15,7 @@ require (
 	github.com/cenkalti/backoff v2.2.1+incompatible
 	github.com/coreos/go-oidc/v3 v3.10.0
 	github.com/cs3org/go-cs3apis v0.0.0-20240724121416-062c4e3046cb
-	github.com/cs3org/reva/v2 v2.22.1-0.20240730105121-548644c31544
+	github.com/cs3org/reva/v2 v2.22.0
 	github.com/dhowden/tag v0.0.0-20230630033851-978a0926ee25
 	github.com/dutchcoders/go-clamd v0.0.0-20170520113014-b970184f4d9e
 	github.com/egirna/icap-client v0.1.1
@@ -307,7 +307,6 @@ require (
 	github.com/russross/blackfriday/v2 v2.1.0 // indirect
 	github.com/segmentio/kafka-go v0.4.47 // indirect
 	github.com/segmentio/ksuid v1.0.4 // indirect
-	github.com/sercand/kuberesolver/v5 v5.1.1 // indirect
 	github.com/sergi/go-diff v1.3.1 // indirect
 	github.com/sethvargo/go-password v0.2.0 // indirect
 	github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect
@@ -362,7 +361,7 @@ replace github.com/egirna/icap-client => github.com/fschade/icap-client v0.0.0-2
 
 replace github.com/unrolled/secure => github.com/DeepDiver1975/secure v0.0.0-20240611112133-abc838fb797c
 
-replace github.com/go-micro/plugins/v4/store/nats-js-kv => github.com/kobergj/plugins/v4/store/nats-js-kv v0.0.0-20240724102745-4bc93ffd7ab6
+replace github.com/go-micro/plugins/v4/store/nats-js-kv => github.com/kobergj/plugins/v4/store/nats-js-kv v0.0.0-20240723073728-b36ea3314b73
 
 // exclude the v2 line of go-sqlite3 which was released accidentally and prevents pulling in newer versions of go-sqlite3
 // see https://github.com/mattn/go-sqlite3/issues/965 for more details
diff --git a/go.sum b/go.sum
index fe686e3ed77..869b08fab49 100644
--- a/go.sum
+++ b/go.sum
@@ -1025,8 +1025,8 @@ github.com/crewjam/saml v0.4.14 h1:g9FBNx62osKusnFzs3QTN5L9CVA/Egfgm+stJShzw/c=
 github.com/crewjam/saml v0.4.14/go.mod h1:UVSZCf18jJkk6GpWNVqcyQJMD5HsRugBPf4I1nl2mME=
 github.com/cs3org/go-cs3apis v0.0.0-20240724121416-062c4e3046cb h1:KmYZDReplv/yfwc1LNYpDcVhVujC3Pasv6WjXx1haSU=
 github.com/cs3org/go-cs3apis v0.0.0-20240724121416-062c4e3046cb/go.mod h1:yyP8PRo0EZou3nSH7H4qjlzQwaydPeIRNgX50npQHpE=
-github.com/cs3org/reva/v2 v2.22.1-0.20240730105121-548644c31544 h1:cBqx8oou5aXM9SqiG96bYGBD4akYwecPoopsFva51yI=
-github.com/cs3org/reva/v2 v2.22.1-0.20240730105121-548644c31544/go.mod h1:R6OO/ZPMr8MivSiESfk7pUfsdXdr709L8kJErLgqvDI=
+github.com/cs3org/reva/v2 v2.22.0 h1:dMZGJDdrTCYYyMlVSzchbEUyFrHgvFI2Md/aLLiez54=
+github.com/cs3org/reva/v2 v2.22.0/go.mod h1:y9ujkcxepugOsv50baQSCtudfY5VY5S5eigNTvGfSZI=
 github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4=
 github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
 github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
@@ -1609,8 +1609,8 @@ github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
 github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
-github.com/kobergj/plugins/v4/store/nats-js-kv v0.0.0-20240724102745-4bc93ffd7ab6 h1:NNXx1/XWR6Ryud6qNanwrl/JuRx2KdCW1jS2/Cf/TO8=
-github.com/kobergj/plugins/v4/store/nats-js-kv v0.0.0-20240724102745-4bc93ffd7ab6/go.mod h1:pjcozWijkNPbEtX5SIQaxEW/h8VAVZYTLx+70bmB3LY=
+github.com/kobergj/plugins/v4/store/nats-js-kv v0.0.0-20240723073728-b36ea3314b73 h1:Cgg5BVWG99INUMX43nD5jhZgNzQJyFA0MvZkctNn0Lw=
+github.com/kobergj/plugins/v4/store/nats-js-kv v0.0.0-20240723073728-b36ea3314b73/go.mod h1:pjcozWijkNPbEtX5SIQaxEW/h8VAVZYTLx+70bmB3LY=
 github.com/kolo/xmlrpc v0.0.0-20200310150728-e0350524596b/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -1948,8 +1948,6 @@ github.com/segmentio/kafka-go v0.4.47 h1:IqziR4pA3vrZq7YdRxaT3w1/5fvIH5qpCwstUan
 github.com/segmentio/kafka-go v0.4.47/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg=
 github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c=
 github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE=
-github.com/sercand/kuberesolver/v5 v5.1.1 h1:CYH+d67G0sGBj7q5wLK61yzqJJ8gLLC8aeprPTHb6yY=
-github.com/sercand/kuberesolver/v5 v5.1.1/go.mod h1:Fs1KbKhVRnB2aDWN12NjKCB+RgYMWZJ294T3BtmVCpQ=
 github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
 github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
 github.com/sethgrid/pester v1.2.0/go.mod h1:hEUINb4RqvDxtoCaU0BNT/HV4ig5kfgOasrf1xcvr0A=
diff --git a/ocis-pkg/config/helpers.go b/ocis-pkg/config/helpers.go
index 1899e3bd46a..d8e4722bb86 100644
--- a/ocis-pkg/config/helpers.go
+++ b/ocis-pkg/config/helpers.go
@@ -1,14 +1,13 @@
 package config
 
 import (
+	gofig "github.com/gookit/config/v2"
+	gooyaml "github.com/gookit/config/v2/yaml"
+	"github.com/owncloud/ocis/v2/ocis-pkg/config/defaults"
 	"io/fs"
 	"os"
 	"path"
 	"strings"
-
-	gofig "github.com/gookit/config/v2"
-	gooyaml "github.com/gookit/config/v2/yaml"
-	"github.com/owncloud/ocis/v2/ocis-pkg/config/defaults"
 )
 
 var (
@@ -50,20 +49,3 @@ func bindSourcesToStructs(fileSystem fs.FS, filePath, service string, dst interf
 
 	return nil
 }
-
-// LocalEndpoint returns the local endpoint for a given protocol and address.
-// Use it when configuring the reva runtime to get a service endpoint in the same
-// runtime, e.g. a gateway talking to an authregistry service.
-func LocalEndpoint(protocol, addr string) string {
-	localEndpoint := addr
-	switch protocol {
-	case "tcp":
-		parts := strings.SplitN(addr, ":", 2)
-		if len(parts) == 2 {
-			localEndpoint = "dns:127.0.0.1:" + parts[1]
-		}
-	case "unix":
-		localEndpoint = "unix:" + addr
-	}
-	return localEndpoint
-}
diff --git a/ocis-pkg/natsjsregistry/registry.go b/ocis-pkg/natsjsregistry/registry.go
index b66896f168b..d9dcd5f9321 100644
--- a/ocis-pkg/natsjsregistry/registry.go
+++ b/ocis-pkg/natsjsregistry/registry.go
@@ -12,9 +12,9 @@ import (
 	"time"
 
 	natsjskv "github.com/go-micro/plugins/v4/store/nats-js-kv"
+	"github.com/google/uuid"
 	"github.com/nats-io/nats.go"
 	"go-micro.dev/v4/registry"
-	"go-micro.dev/v4/server"
 	"go-micro.dev/v4/store"
 	"go-micro.dev/v4/util/cmd"
 )
@@ -25,7 +25,7 @@ var (
 	_registryUsernameEnv = "MICRO_REGISTRY_AUTH_USERNAME"
 	_registryPasswordEnv = "MICRO_REGISTRY_AUTH_PASSWORD"
 
-	_serviceDelimiter = "@"
+	_serviceDelimiter = "/"
 )
 
 func init() {
@@ -90,12 +90,18 @@ func (n *storeregistry) Register(s *registry.Service, opts ...registry.RegisterO
 		o(&options)
 	}
 
+	unique := uuid.New().String()
+	if s.Metadata == nil {
+		s.Metadata = make(map[string]string)
+	}
+	s.Metadata["uuid"] = unique
+
 	b, err := json.Marshal(s)
 	if err != nil {
 		return err
 	}
 	return n.store.Write(&store.Record{
-		Key:    s.Name + _serviceDelimiter + server.DefaultId,
+		Key:    s.Name + _serviceDelimiter + unique,
 		Value:  b,
 		Expiry: options.TTL,
 	})
@@ -105,7 +111,13 @@ func (n *storeregistry) Register(s *registry.Service, opts ...registry.RegisterO
 func (n *storeregistry) Deregister(s *registry.Service, _ ...registry.DeregisterOption) error {
 	n.lock.RLock()
 	defer n.lock.RUnlock()
-	return n.store.Delete(s.Name + _serviceDelimiter + server.DefaultId)
+
+	var unique string
+	if s.Metadata != nil {
+		unique = s.Metadata["uuid"]
+	}
+
+	return n.store.Delete(s.Name + _serviceDelimiter + unique)
 }
 
 // GetService gets a specific service from the registry
diff --git a/ocis-pkg/natsjsregistry/watcher.go b/ocis-pkg/natsjsregistry/watcher.go
index 0dc59f48db9..f5187358f30 100644
--- a/ocis-pkg/natsjsregistry/watcher.go
+++ b/ocis-pkg/natsjsregistry/watcher.go
@@ -1,23 +1,21 @@
 package natsjsregistry
 
 import (
-	"encoding/json"
 	"errors"
 
-	natsjskv "github.com/go-micro/plugins/v4/store/nats-js-kv"
 	"github.com/nats-io/nats.go"
 	"go-micro.dev/v4/registry"
 )
 
 // NatsWatcher is the watcher of the nats interface
 type NatsWatcher interface {
-	WatchAll(bucket string, opts ...nats.WatchOpt) (<-chan *natsjskv.StoreUpdate, func() error, error)
+	WatchAll(bucket string, opts ...nats.WatchOpt) (nats.KeyWatcher, error)
 }
 
 // Watcher is used to keep track of changes in the registry
 type Watcher struct {
-	updates <-chan *natsjskv.StoreUpdate
-	stop    func() error
+	watch   nats.KeyWatcher
+	updates <-chan nats.KeyValueEntry
 	reg     *storeregistry
 }
 
@@ -28,14 +26,14 @@ func NewWatcher(s *storeregistry) (*Watcher, error) {
 		return nil, errors.New("store does not implement watcher interface")
 	}
 
-	watcher, stop, err := w.WatchAll("service-registry")
+	watcher, err := w.WatchAll("service-registry")
 	if err != nil {
 		return nil, err
 	}
 
 	return &Watcher{
-		updates: watcher,
-		stop:    stop,
+		watch:   watcher,
+		updates: watcher.Updates(),
 		reg:     s,
 	}, nil
 }
@@ -47,18 +45,30 @@ func (w *Watcher) Next() (*registry.Result, error) {
 		return nil, errors.New("watcher stopped")
 	}
 
-	var svc *registry.Service
-	if err := json.Unmarshal(kve.Value.Data, svc); err != nil {
+	service, err := w.reg.getService(kve.Key())
+	if err != nil {
 		return nil, err
 	}
 
+	var action string
+	switch kve.Operation() {
+	default:
+		action = "create"
+	case nats.KeyValuePut:
+		action = "create"
+	case nats.KeyValueDelete:
+		action = "delete"
+	case nats.KeyValuePurge:
+		action = "delete"
+	}
+
 	return &registry.Result{
-		Service: svc,
-		Action:  kve.Action,
+		Service: service,
+		Action:  action,
 	}, nil
 }
 
 // Stop stops the watcher
 func (w *Watcher) Stop() {
-	_ = w.stop()
+	_ = w.watch.Stop()
 }
diff --git a/ocis-pkg/registry/registry.go b/ocis-pkg/registry/registry.go
index bf2c9df1b59..d8df986ad77 100644
--- a/ocis-pkg/registry/registry.go
+++ b/ocis-pkg/registry/registry.go
@@ -70,7 +70,9 @@ func GetRegistry(opts ...Option) mRegistry.Registry {
 			cfg.DisableCache = true // no cache needed for in-memory registry
 		case "kubernetes":
 			fmt.Println("Attention: kubernetes registry is deprecated, use nats-js-kv instead")
-			_reg = kubernetesr.NewRegistry()
+			_reg = kubernetesr.NewRegistry(
+				mRegistry.Addrs(cfg.Addresses...),
+			)
 		case "nats":
 			fmt.Println("Attention: nats registry is deprecated, use nats-js-kv instead")
 			_reg = natsr.NewRegistry(
diff --git a/ocis-pkg/registry/service.go b/ocis-pkg/registry/service.go
index 65c62e8d262..da80a891223 100644
--- a/ocis-pkg/registry/service.go
+++ b/ocis-pkg/registry/service.go
@@ -7,11 +7,10 @@ import (
 	"strings"
 
 	mRegistry "go-micro.dev/v4/registry"
-	"go-micro.dev/v4/server"
 	"go-micro.dev/v4/util/addr"
 )
 
-func BuildGRPCService(serviceID, address string, version string) *mRegistry.Service {
+func BuildGRPCService(serviceID, uuid, address string, version string) *mRegistry.Service {
 	var host string
 	var port int
 
@@ -29,7 +28,7 @@ func BuildGRPCService(serviceID, address string, version string) *mRegistry.Serv
 	}
 
 	node := &mRegistry.Node{
-		Id:       serviceID + "-" + server.DefaultId,
+		Id:       serviceID + "-" + uuid,
 		Address:  net.JoinHostPort(addr, fmt.Sprint(port)),
 		Metadata: make(map[string]string),
 	}
@@ -47,7 +46,7 @@ func BuildGRPCService(serviceID, address string, version string) *mRegistry.Serv
 	}
 }
 
-func BuildHTTPService(serviceID, address string, version string) *mRegistry.Service {
+func BuildHTTPService(serviceID, uuid, address string, version string) *mRegistry.Service {
 	var host string
 	var port int
 
@@ -65,7 +64,7 @@ func BuildHTTPService(serviceID, address string, version string) *mRegistry.Serv
 	}
 
 	node := &mRegistry.Node{
-		Id:       serviceID + "-" + server.DefaultId,
+		Id:       serviceID + "-" + uuid,
 		Address:  net.JoinHostPort(addr, fmt.Sprint(port)),
 		Metadata: make(map[string]string),
 	}
diff --git a/ocis-pkg/service/grpc/service.go b/ocis-pkg/service/grpc/service.go
index 6afe731e2f8..3364c2194b1 100644
--- a/ocis-pkg/service/grpc/service.go
+++ b/ocis-pkg/service/grpc/service.go
@@ -25,7 +25,6 @@ func NewServiceWithClient(client client.Client, opts ...Option) (Service, error)
 	var mServer server.Server
 	sopts := newOptions(opts...)
 	tlsConfig := &tls.Config{}
-
 	if sopts.TLSEnabled {
 		var cert tls.Certificate
 		var err error
diff --git a/ocis-pkg/version/version.go b/ocis-pkg/version/version.go
index 84faca8b1e2..8f362fddc37 100644
--- a/ocis-pkg/version/version.go
+++ b/ocis-pkg/version/version.go
@@ -16,7 +16,7 @@ var (
 	// LatestTag is the latest released version plus the dev meta version.
 	// Will be overwritten by the release pipeline
 	// Needs a manual change for every tagged release
-	LatestTag = "6.2.0+dev"
+	LatestTag = "6.1.0+dev"
 
 	// Date indicates the build date.
 	// This has been removed, it looks like you can only replace static strings with recent go versions
diff --git a/ocis/pkg/command/root.go b/ocis/pkg/command/root.go
index 6dd7136e41e..2edf4a750f5 100644
--- a/ocis/pkg/command/root.go
+++ b/ocis/pkg/command/root.go
@@ -1,10 +1,7 @@
 package command
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/ocis-pkg/clihelper"
 	"github.com/owncloud/ocis/v2/ocis-pkg/config"
@@ -28,6 +25,5 @@ func Execute() error {
 		)
 	}
 
-	ctx, _ := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	return app.RunContext(ctx, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/ocis/pkg/command/server.go b/ocis/pkg/command/server.go
index f9c3aed0703..108038ce72d 100644
--- a/ocis/pkg/command/server.go
+++ b/ocis/pkg/command/server.go
@@ -21,7 +21,7 @@ func Server(cfg *config.Config) *cli.Command {
 		Action: func(c *cli.Context) error {
 			// Prefer the in-memory registry as the default when running in single-binary mode
 			r := runtime.New(cfg)
-			return r.Start(c.Context)
+			return r.Start()
 		},
 	}
 }
diff --git a/ocis/pkg/runtime/runtime.go b/ocis/pkg/runtime/runtime.go
index 49ce93c3b7e..32e6b8e1a91 100644
--- a/ocis/pkg/runtime/runtime.go
+++ b/ocis/pkg/runtime/runtime.go
@@ -1,8 +1,6 @@
 package runtime
 
 import (
-	"context"
-
 	"github.com/owncloud/ocis/v2/ocis-pkg/config"
 	"github.com/owncloud/ocis/v2/ocis/pkg/runtime/service"
 )
@@ -20,6 +18,6 @@ func New(cfg *config.Config) Runtime {
 }
 
 // Start rpc runtime
-func (r *Runtime) Start(ctx context.Context) error {
-	return service.Start(ctx, service.WithConfig(r.c))
+func (r *Runtime) Start() error {
+	return service.Start(service.WithConfig(r.c))
 }
diff --git a/ocis/pkg/runtime/service/service.go b/ocis/pkg/runtime/service/service.go
index 311d6f7c1ea..d42604b7e64 100644
--- a/ocis/pkg/runtime/service/service.go
+++ b/ocis/pkg/runtime/service/service.go
@@ -7,8 +7,10 @@ import (
 	"net/http"
 	"net/rpc"
 	"os"
+	"os/signal"
 	"sort"
 	"strings"
+	"syscall"
 	"time"
 
 	authapp "github.com/owncloud/ocis/v2/services/auth-app/pkg/command"
@@ -94,7 +96,7 @@ type Service struct {
 // calls are done explicitly to loadFromEnv().
 // Since this is the public constructor, options need to be added, at the moment only logging options
 // are supported in order to match the running OwnCloud services structured log.
-func NewService(ctx context.Context, options ...Option) (*Service, error) {
+func NewService(options ...Option) (*Service, error) {
 	opts := NewOptions()
 
 	for _, f := range options {
@@ -107,7 +109,7 @@ func NewService(ctx context.Context, options ...Option) (*Service, error) {
 		log.Level(opts.Config.Log.Level),
 	)
 
-	globalCtx, cancelGlobal := context.WithCancel(ctx)
+	globalCtx, cancelGlobal := context.WithCancel(context.Background())
 
 	s := &Service{
 		Services:   make([]serviceFuncMap, len(_waitFuncs)),
@@ -350,18 +352,19 @@ func NewService(ctx context.Context, options ...Option) (*Service, error) {
 
 // Start a rpc service. By default, the package scope Start will run all default services to provide with a working
 // oCIS instance.
-func Start(ctx context.Context, o ...Option) error {
+func Start(o ...Option) error {
 	// Start the runtime. Most likely this was called ONLY by the `ocis server` subcommand, but since we cannot protect
 	// from the caller, the previous statement holds truth.
 
 	// prepare a new rpc Service struct.
-	s, err := NewService(ctx, o...)
+	s, err := NewService(o...)
 	if err != nil {
 		return err
 	}
 
-	// get a cancel function to stop the service
-	ctx, cancel := context.WithCancel(ctx)
+	// halt listens for interrupt signals and blocks.
+	halt := make(chan os.Signal, 1)
+	signal.Notify(halt, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
 
 	// tolerance controls backoff cycles from the supervisor.
 	tolerance := 5
@@ -373,7 +376,7 @@ func Start(ctx context.Context, o ...Option) error {
 			if e.Type() == suture.EventTypeBackoff {
 				totalBackoff++
 				if totalBackoff == tolerance {
-					cancel()
+					halt <- os.Interrupt
 				}
 			}
 			s.Log.Info().Str("event", e.String()).Msg(fmt.Sprintf("supervisor: %v", e.Map()["supervisor_name"]))
@@ -421,8 +424,8 @@ func Start(ctx context.Context, o ...Option) error {
 	// https://pkg.go.dev/github.com/thejerf/suture/v4@v4.0.0#Supervisor
 	go s.Supervisor.ServeBackground(s.context)
 
-	// trap will block on context done channel for interruptions.
-	go trap(s, ctx)
+	// trap will block on halt channel for interruptions.
+	go trap(s, halt)
 
 	for i, service := range s.Services {
 		scheduleServiceTokens(s, service)
@@ -505,8 +508,9 @@ func (s *Service) List(_ struct{}, reply *string) error {
 
 // trap blocks on halt channel. When the runtime is interrupted it
 // signals the controller to stop any supervised process.
-func trap(s *Service, ctx context.Context) {
-	<-ctx.Done()
+func trap(s *Service, halt chan os.Signal) {
+	<-halt
+	s.cancel()
 	for sName := range s.serviceToken {
 		for i := range s.serviceToken[sName] {
 			if err := s.Supervisor.Remove(s.serviceToken[sName][i]); err != nil {
diff --git a/services/activitylog/cmd/activitylog/main.go b/services/activitylog/cmd/activitylog/main.go
index dae55b4f16f..d10204f4c88 100644
--- a/services/activitylog/cmd/activitylog/main.go
+++ b/services/activitylog/cmd/activitylog/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/activitylog/pkg/command"
 	"github.com/owncloud/ocis/v2/services/activitylog/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/activitylog/pkg/command/root.go b/services/activitylog/pkg/command/root.go
index 0874c938902..518d6309b36 100644
--- a/services/activitylog/pkg/command/root.go
+++ b/services/activitylog/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/activitylog/pkg/command/server.go b/services/activitylog/pkg/command/server.go
index 232bc1aa1f7..e6854065c8b 100644
--- a/services/activitylog/pkg/command/server.go
+++ b/services/activitylog/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/cs3org/reva/v2/pkg/events"
 	"github.com/cs3org/reva/v2/pkg/events/stream"
@@ -60,7 +61,12 @@ func Server(cfg *config.Config) *cli.Command {
 			}
 
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := func() (context.Context, context.CancelFunc) {
+				if cfg.Context == nil {
+					return context.WithCancel(context.Background())
+				}
+				return context.WithCancel(cfg.Context)
+			}()
 
 			mtrcs := metrics.New()
 			mtrcs.BuildInfo.WithLabelValues(version.GetString()).Set(1)
@@ -139,6 +145,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/antivirus/cmd/antivirus/main.go b/services/antivirus/cmd/antivirus/main.go
index 8f0332ad1db..b37a1ca3edf 100644
--- a/services/antivirus/cmd/antivirus/main.go
+++ b/services/antivirus/cmd/antivirus/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/antivirus/pkg/command"
 	"github.com/owncloud/ocis/v2/services/antivirus/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/antivirus/pkg/command/root.go b/services/antivirus/pkg/command/root.go
index 4683d3bc52c..2884482748e 100644
--- a/services/antivirus/pkg/command/root.go
+++ b/services/antivirus/pkg/command/root.go
@@ -25,5 +25,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/antivirus/pkg/command/server.go b/services/antivirus/pkg/command/server.go
index 0acbd873212..32e2fd8b44f 100644
--- a/services/antivirus/pkg/command/server.go
+++ b/services/antivirus/pkg/command/server.go
@@ -29,8 +29,13 @@ func Server(cfg *config.Config) *cli.Command {
 		Action: func(c *cli.Context) error {
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				logger      = log.NewLogger(
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				logger = log.NewLogger(
 					log.Name(cfg.Service.Name),
 					log.Level(cfg.Log.Level),
 					log.Pretty(cfg.Log.Pretty),
diff --git a/services/app-provider/cmd/app-provider/main.go b/services/app-provider/cmd/app-provider/main.go
index 1d7474d45b2..c4afd562c2d 100644
--- a/services/app-provider/cmd/app-provider/main.go
+++ b/services/app-provider/cmd/app-provider/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/app-provider/pkg/command"
 	"github.com/owncloud/ocis/v2/services/app-provider/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/app-provider/pkg/command/root.go b/services/app-provider/pkg/command/root.go
index 42ac00c4940..d7bbe2bb4ff 100644
--- a/services/app-provider/pkg/command/root.go
+++ b/services/app-provider/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/app-provider/pkg/command/server.go b/services/app-provider/pkg/command/server.go
index 450bb2d7abb..6259e7b8498 100644
--- a/services/app-provider/pkg/command/server.go
+++ b/services/app-provider/pkg/command/server.go
@@ -38,7 +38,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -61,6 +61,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -81,7 +82,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -90,3 +91,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/app-registry/cmd/app-registry/main.go b/services/app-registry/cmd/app-registry/main.go
index ddb4faa2952..6a9d91f7d68 100644
--- a/services/app-registry/cmd/app-registry/main.go
+++ b/services/app-registry/cmd/app-registry/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/app-registry/pkg/command"
 	"github.com/owncloud/ocis/v2/services/app-registry/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/app-registry/pkg/command/root.go b/services/app-registry/pkg/command/root.go
index 41582af228e..9f20d6051a3 100644
--- a/services/app-registry/pkg/command/root.go
+++ b/services/app-registry/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/app-registry/pkg/command/server.go b/services/app-registry/pkg/command/server.go
index b8d1a790bfb..54bf5241035 100644
--- a/services/app-registry/pkg/command/server.go
+++ b/services/app-registry/pkg/command/server.go
@@ -37,7 +37,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -60,6 +60,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -76,7 +77,7 @@ func Server(cfg *config.Config) *cli.Command {
 				cancel()
 			})
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -85,3 +86,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/audit/cmd/audit/main.go b/services/audit/cmd/audit/main.go
index 56413c60b55..f365e874ec3 100644
--- a/services/audit/cmd/audit/main.go
+++ b/services/audit/cmd/audit/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/audit/pkg/command"
 	"github.com/owncloud/ocis/v2/services/audit/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/audit/pkg/command/root.go b/services/audit/pkg/command/root.go
index c52fd880deb..abe6054a56a 100644
--- a/services/audit/pkg/command/root.go
+++ b/services/audit/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/audit/pkg/command/server.go b/services/audit/pkg/command/server.go
index 93f945e4976..6c55e638c1f 100644
--- a/services/audit/pkg/command/server.go
+++ b/services/audit/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/cs3org/reva/v2/pkg/events"
 	"github.com/cs3org/reva/v2/pkg/events/stream"
@@ -33,7 +34,12 @@ func Server(cfg *config.Config) *cli.Command {
 				gr     = run.Group{}
 				logger = logging.Configure(cfg.Service.Name, cfg.Log)
 
-				ctx, cancel = context.WithCancel(c.Context)
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
 			)
 			defer cancel()
 
@@ -54,6 +60,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Err(err).
 					Msg("Shutting down server")
 				cancel()
+				os.Exit(1)
 			})
 
 			{
diff --git a/services/auth-app/cmd/auth-app/main.go b/services/auth-app/cmd/auth-app/main.go
index ada20d1afda..185d6eb9fd9 100644
--- a/services/auth-app/cmd/auth-app/main.go
+++ b/services/auth-app/cmd/auth-app/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/auth-app/pkg/command"
 	"github.com/owncloud/ocis/v2/services/auth-app/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/auth-app/pkg/command/root.go b/services/auth-app/pkg/command/root.go
index a3c2c87df05..f1ba83b36ec 100644
--- a/services/auth-app/pkg/command/root.go
+++ b/services/auth-app/pkg/command/root.go
@@ -31,5 +31,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/auth-app/pkg/command/server.go b/services/auth-app/pkg/command/server.go
index 323e203c73c..afb3b54dc00 100644
--- a/services/auth-app/pkg/command/server.go
+++ b/services/auth-app/pkg/command/server.go
@@ -31,14 +31,14 @@ func Server(cfg *config.Config) *cli.Command {
 		Before: func(_ *cli.Context) error {
 			return configlog.ReturnFatal(parser.ParseConfig(cfg))
 		},
-		Action: func(c *cli.Context) error {
+		Action: func(_ *cli.Context) error {
 			logger := logging.Configure(cfg.Service.Name, cfg.Log)
 			traceProvider, err := tracing.GetServiceTraceProvider(cfg.Tracing, cfg.Service.Name)
 			if err != nil {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -61,6 +61,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -81,7 +82,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -90,3 +91,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/auth-basic/cmd/auth-basic/main.go b/services/auth-basic/cmd/auth-basic/main.go
index 6235d5da74a..ec5af41edf3 100644
--- a/services/auth-basic/cmd/auth-basic/main.go
+++ b/services/auth-basic/cmd/auth-basic/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/auth-basic/pkg/command"
 	"github.com/owncloud/ocis/v2/services/auth-basic/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/auth-basic/pkg/command/root.go b/services/auth-basic/pkg/command/root.go
index 46823bc174a..cb53a0a6670 100644
--- a/services/auth-basic/pkg/command/root.go
+++ b/services/auth-basic/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/auth-basic/pkg/command/server.go b/services/auth-basic/pkg/command/server.go
index a89ccb5326b..3a7aaf312a7 100644
--- a/services/auth-basic/pkg/command/server.go
+++ b/services/auth-basic/pkg/command/server.go
@@ -39,7 +39,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -74,6 +74,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -94,7 +95,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -103,3 +104,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/auth-bearer/cmd/auth-bearer/main.go b/services/auth-bearer/cmd/auth-bearer/main.go
index 8cab6c04a11..8617701cfde 100644
--- a/services/auth-bearer/cmd/auth-bearer/main.go
+++ b/services/auth-bearer/cmd/auth-bearer/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/auth-bearer/pkg/command"
 	"github.com/owncloud/ocis/v2/services/auth-bearer/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/auth-bearer/pkg/command/root.go b/services/auth-bearer/pkg/command/root.go
index c22b4f9ae3b..c923e706fb2 100644
--- a/services/auth-bearer/pkg/command/root.go
+++ b/services/auth-bearer/pkg/command/root.go
@@ -33,7 +33,7 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
 
 // SutureService allows for the accounts command to be embedded and supervised by a suture supervisor tree.
diff --git a/services/auth-bearer/pkg/command/server.go b/services/auth-bearer/pkg/command/server.go
index 1c8e239b3ae..5646f639914 100644
--- a/services/auth-bearer/pkg/command/server.go
+++ b/services/auth-bearer/pkg/command/server.go
@@ -38,7 +38,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -61,6 +61,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -81,7 +82,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -90,3 +91,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/auth-machine/cmd/auth-machine/main.go b/services/auth-machine/cmd/auth-machine/main.go
index f2b0bdc360d..937b0b20cdf 100644
--- a/services/auth-machine/cmd/auth-machine/main.go
+++ b/services/auth-machine/cmd/auth-machine/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/auth-machine/pkg/command"
 	"github.com/owncloud/ocis/v2/services/auth-machine/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/auth-machine/pkg/command/root.go b/services/auth-machine/pkg/command/root.go
index 733789b9796..fe153cd7847 100644
--- a/services/auth-machine/pkg/command/root.go
+++ b/services/auth-machine/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/auth-machine/pkg/command/server.go b/services/auth-machine/pkg/command/server.go
index 0a4dcbb59b0..e19fb45f69b 100644
--- a/services/auth-machine/pkg/command/server.go
+++ b/services/auth-machine/pkg/command/server.go
@@ -38,7 +38,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -61,6 +61,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -81,7 +82,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -90,3 +91,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/auth-service/cmd/auth-service/main.go b/services/auth-service/cmd/auth-service/main.go
index 70b2c3d7f91..bcc7a625ec7 100644
--- a/services/auth-service/cmd/auth-service/main.go
+++ b/services/auth-service/cmd/auth-service/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/auth-service/pkg/command"
 	"github.com/owncloud/ocis/v2/services/auth-service/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/auth-service/pkg/command/root.go b/services/auth-service/pkg/command/root.go
index f37d4584c72..2fd57dd7adb 100644
--- a/services/auth-service/pkg/command/root.go
+++ b/services/auth-service/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/auth-service/pkg/command/server.go b/services/auth-service/pkg/command/server.go
index 58ab0dde1d8..565f6757476 100644
--- a/services/auth-service/pkg/command/server.go
+++ b/services/auth-service/pkg/command/server.go
@@ -38,7 +38,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -61,6 +61,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -82,7 +83,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -91,3 +92,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/clientlog/cmd/clientlog/main.go b/services/clientlog/cmd/clientlog/main.go
index 9c6595c600c..ce0d4a4aff9 100644
--- a/services/clientlog/cmd/clientlog/main.go
+++ b/services/clientlog/cmd/clientlog/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/clientlog/pkg/command"
 	"github.com/owncloud/ocis/v2/services/clientlog/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/clientlog/pkg/command/root.go b/services/clientlog/pkg/command/root.go
index ca9b26166be..389caf1bb21 100644
--- a/services/clientlog/pkg/command/root.go
+++ b/services/clientlog/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/clientlog/pkg/command/server.go b/services/clientlog/pkg/command/server.go
index 80261be3d32..29cfaf6cf8c 100644
--- a/services/clientlog/pkg/command/server.go
+++ b/services/clientlog/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/cs3org/reva/v2/pkg/events"
 	"github.com/cs3org/reva/v2/pkg/events/stream"
@@ -61,7 +62,12 @@ func Server(cfg *config.Config) *cli.Command {
 			}
 
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := func() (context.Context, context.CancelFunc) {
+				if cfg.Context == nil {
+					return context.WithCancel(context.Background())
+				}
+				return context.WithCancel(cfg.Context)
+			}()
 
 			mtrcs := metrics.New()
 			mtrcs.BuildInfo.WithLabelValues(version.GetString()).Set(1)
@@ -112,6 +118,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/collaboration/pkg/command/root.go b/services/collaboration/pkg/command/root.go
index 11035c80078..31fe6db63fd 100644
--- a/services/collaboration/pkg/command/root.go
+++ b/services/collaboration/pkg/command/root.go
@@ -25,5 +25,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/collaboration/pkg/command/server.go b/services/collaboration/pkg/command/server.go
index 799448d4cf3..5732c55890f 100644
--- a/services/collaboration/pkg/command/server.go
+++ b/services/collaboration/pkg/command/server.go
@@ -36,7 +36,12 @@ func Server(cfg *config.Config) *cli.Command {
 			}
 
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := func() (context.Context, context.CancelFunc) {
+				if cfg.Context == nil {
+					return context.WithCancel(context.Background())
+				}
+				return context.WithCancel(cfg.Context)
+			}()
 			defer cancel()
 
 			// prepare components
diff --git a/services/collaboration/pkg/helpers/registration.go b/services/collaboration/pkg/helpers/registration.go
index 321a1947c16..c4967dac7d2 100644
--- a/services/collaboration/pkg/helpers/registration.go
+++ b/services/collaboration/pkg/helpers/registration.go
@@ -8,6 +8,7 @@ import (
 	gatewayv1beta1 "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1"
 	rpcv1beta1 "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1"
 	"github.com/cs3org/reva/v2/pkg/mime"
+	"github.com/gofrs/uuid"
 	"github.com/owncloud/ocis/v2/ocis-pkg/log"
 	"github.com/owncloud/ocis/v2/ocis-pkg/registry"
 	"github.com/owncloud/ocis/v2/ocis-pkg/version"
@@ -18,7 +19,7 @@ import (
 // There are no explicit requirements for the context, and it will be passed
 // without changes to the underlying RegisterService method.
 func RegisterOcisService(ctx context.Context, cfg *config.Config, logger log.Logger) error {
-	svc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name+"."+cfg.App.Name, cfg.GRPC.Addr, version.GetString())
+	svc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name+"."+cfg.App.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 	return registry.RegisterService(ctx, svc, logger)
 }
 
diff --git a/services/eventhistory/cmd/eventhistory/main.go b/services/eventhistory/cmd/eventhistory/main.go
index 47eb6483c10..d2172949bc6 100644
--- a/services/eventhistory/cmd/eventhistory/main.go
+++ b/services/eventhistory/cmd/eventhistory/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/eventhistory/pkg/command"
 	"github.com/owncloud/ocis/v2/services/eventhistory/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/eventhistory/pkg/command/root.go b/services/eventhistory/pkg/command/root.go
index a1d27a56363..683c716a30b 100644
--- a/services/eventhistory/pkg/command/root.go
+++ b/services/eventhistory/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/eventhistory/pkg/command/server.go b/services/eventhistory/pkg/command/server.go
index 1c9146aa756..197e07ae8bc 100644
--- a/services/eventhistory/pkg/command/server.go
+++ b/services/eventhistory/pkg/command/server.go
@@ -47,8 +47,13 @@ func Server(cfg *config.Config) *cli.Command {
 
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				m           = metrics.New()
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				m = metrics.New()
 			)
 
 			defer cancel()
diff --git a/services/frontend/cmd/frontend/main.go b/services/frontend/cmd/frontend/main.go
index a3e887680f5..cbdc5dac510 100644
--- a/services/frontend/cmd/frontend/main.go
+++ b/services/frontend/cmd/frontend/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/frontend/pkg/command"
 	"github.com/owncloud/ocis/v2/services/frontend/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/frontend/pkg/command/root.go b/services/frontend/pkg/command/root.go
index 0e906f15ea6..ab4fd045238 100644
--- a/services/frontend/pkg/command/root.go
+++ b/services/frontend/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/frontend/pkg/command/server.go b/services/frontend/pkg/command/server.go
index cd22a4be7f1..a60e81153dc 100644
--- a/services/frontend/pkg/command/server.go
+++ b/services/frontend/pkg/command/server.go
@@ -38,7 +38,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -65,6 +65,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -85,7 +86,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			httpSvc := registry.BuildHTTPService(cfg.HTTP.Namespace+"."+cfg.Service.Name, cfg.HTTP.Addr, version.GetString())
+			httpSvc := registry.BuildHTTPService(cfg.HTTP.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.HTTP.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, httpSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the http service")
 			}
@@ -101,3 +102,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/gateway/cmd/gateway/main.go b/services/gateway/cmd/gateway/main.go
index 766b15bcf99..d22e804011a 100644
--- a/services/gateway/cmd/gateway/main.go
+++ b/services/gateway/cmd/gateway/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/gateway/pkg/command"
 	"github.com/owncloud/ocis/v2/services/gateway/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/gateway/pkg/command/root.go b/services/gateway/pkg/command/root.go
index 940a43259cf..fcf6db18db0 100644
--- a/services/gateway/pkg/command/root.go
+++ b/services/gateway/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/gateway/pkg/command/server.go b/services/gateway/pkg/command/server.go
index 9f556d556e7..ebbc7f7eb4a 100644
--- a/services/gateway/pkg/command/server.go
+++ b/services/gateway/pkg/command/server.go
@@ -37,7 +37,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -51,9 +51,7 @@ func Server(cfg *config.Config) *cli.Command {
 					runtime.WithRegistry(reg),
 					runtime.WithTraceProvider(traceProvider),
 				)
-				logger.Info().
-					Str("server", cfg.Service.Name).
-					Msg("reva runtime exited")
+
 				return nil
 			}, func(err error) {
 				logger.Error().
@@ -62,6 +60,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -75,13 +74,10 @@ func Server(cfg *config.Config) *cli.Command {
 			}
 
 			gr.Add(debugServer.ListenAndServe, func(_ error) {
-				logger.Info().
-					Str("server", cfg.Service.Name).
-					Msg("Shutting down debug erver")
 				cancel()
 			})
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -90,3 +86,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/gateway/pkg/revaconfig/config.go b/services/gateway/pkg/revaconfig/config.go
index f24fd87fc81..035ae05bf6b 100644
--- a/services/gateway/pkg/revaconfig/config.go
+++ b/services/gateway/pkg/revaconfig/config.go
@@ -6,15 +6,12 @@ import (
 	"strings"
 
 	"github.com/cs3org/reva/v2/pkg/utils"
-	pkgconfig "github.com/owncloud/ocis/v2/ocis-pkg/config"
 	"github.com/owncloud/ocis/v2/ocis-pkg/log"
 	"github.com/owncloud/ocis/v2/services/gateway/pkg/config"
 )
 
 // GatewayConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service.
 func GatewayConfigFromStruct(cfg *config.Config, logger log.Logger) map[string]interface{} {
-	localEndpoint := pkgconfig.LocalEndpoint(cfg.GRPC.Protocol, cfg.GRPC.Addr)
-
 	rcfg := map[string]interface{}{
 		"core": map[string]interface{}{
 			"tracing_enabled":      cfg.Tracing.Enabled,
@@ -42,8 +39,8 @@ func GatewayConfigFromStruct(cfg *config.Config, logger log.Logger) map[string]i
 				"gateway": map[string]interface{}{
 					"applicationauthsvc": cfg.AuthAppEndpoint,
 					// registries are located on the gateway
-					"authregistrysvc":    localEndpoint,
-					"storageregistrysvc": localEndpoint,
+					"authregistrysvc":    cfg.Reva.Address,
+					"storageregistrysvc": cfg.Reva.Address,
 					"appregistrysvc":     cfg.AppRegistryEndpoint,
 					// user metadata is located on the users services
 					"preferencessvc":   cfg.UsersEndpoint,
diff --git a/services/graph/cmd/graph/main.go b/services/graph/cmd/graph/main.go
index b0d9189e0a0..7844daa6af9 100644
--- a/services/graph/cmd/graph/main.go
+++ b/services/graph/cmd/graph/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/graph/pkg/command"
 	"github.com/owncloud/ocis/v2/services/graph/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/graph/pkg/command/root.go b/services/graph/pkg/command/root.go
index dd967ffbedd..5c9fae28940 100644
--- a/services/graph/pkg/command/root.go
+++ b/services/graph/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Usage:    "Serve Graph API for oCIS",
 		Commands: GetCommands(cfg),
 	})
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/graph/pkg/command/server.go b/services/graph/pkg/command/server.go
index 7c10c330ba1..2c547aefeb7 100644
--- a/services/graph/pkg/command/server.go
+++ b/services/graph/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/oklog/run"
 	"github.com/owncloud/ocis/v2/ocis-pkg/config/configlog"
@@ -34,7 +35,12 @@ func Server(cfg *config.Config) *cli.Command {
 			}
 
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := func() (context.Context, context.CancelFunc) {
+				if cfg.Context == nil {
+					return context.WithCancel(context.Background())
+				}
+				return context.WithCancel(cfg.Context)
+			}()
 			mtrcs := metrics.New()
 
 			defer cancel()
@@ -63,6 +69,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/groups/cmd/groups/main.go b/services/groups/cmd/groups/main.go
index c1d4afadbef..2172fc84505 100644
--- a/services/groups/cmd/groups/main.go
+++ b/services/groups/cmd/groups/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/groups/pkg/command"
 	"github.com/owncloud/ocis/v2/services/groups/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/groups/pkg/command/root.go b/services/groups/pkg/command/root.go
index ba2a991b40b..fdc14e68564 100644
--- a/services/groups/pkg/command/root.go
+++ b/services/groups/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/groups/pkg/command/server.go b/services/groups/pkg/command/server.go
index cd6dffcb6d3..6690ebbb118 100644
--- a/services/groups/pkg/command/server.go
+++ b/services/groups/pkg/command/server.go
@@ -39,7 +39,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -74,6 +74,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -94,7 +95,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -103,3 +104,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/idm/cmd/idm/main.go b/services/idm/cmd/idm/main.go
index e61c15349d0..f30202e587d 100644
--- a/services/idm/cmd/idm/main.go
+++ b/services/idm/cmd/idm/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/idm/pkg/command"
 	"github.com/owncloud/ocis/v2/services/idm/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/idm/pkg/command/resetpw.go b/services/idm/pkg/command/resetpw.go
index bdc37044864..0fd204c501a 100644
--- a/services/idm/pkg/command/resetpw.go
+++ b/services/idm/pkg/command/resetpw.go
@@ -40,7 +40,12 @@ func ResetPassword(cfg *config.Config) *cli.Command {
 		},
 		Action: func(c *cli.Context) error {
 			logger := logging.Configure(cfg.Service.Name, cfg.Log)
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := func() (context.Context, context.CancelFunc) {
+				if cfg.Context == nil {
+					return context.WithCancel(context.Background())
+				}
+				return context.WithCancel(cfg.Context)
+			}()
 
 			defer cancel()
 			return resetPassword(ctx, logger, cfg, c.String("user-name"))
diff --git a/services/idm/pkg/command/root.go b/services/idm/pkg/command/root.go
index 6e6c9c4dc8f..85134a4375d 100644
--- a/services/idm/pkg/command/root.go
+++ b/services/idm/pkg/command/root.go
@@ -31,5 +31,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/idm/pkg/command/server.go b/services/idm/pkg/command/server.go
index 3ec90806ac6..048ef8d3b68 100644
--- a/services/idm/pkg/command/server.go
+++ b/services/idm/pkg/command/server.go
@@ -40,7 +40,12 @@ func Server(cfg *config.Config) *cli.Command {
 			var (
 				gr          = run.Group{}
 				logger      = logging.Configure(cfg.Service.Name, cfg.Log)
-				ctx, cancel = context.WithCancel(c.Context)
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
 			)
 
 			defer cancel()
@@ -90,6 +95,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Err(err).
 						Msg("Shutting down server")
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/idp/cmd/idp/main.go b/services/idp/cmd/idp/main.go
index de20d3a5b3c..174283c909a 100644
--- a/services/idp/cmd/idp/main.go
+++ b/services/idp/cmd/idp/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/idp/pkg/command"
 	"github.com/owncloud/ocis/v2/services/idp/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/idp/pkg/command/root.go b/services/idp/pkg/command/root.go
index b6707989cde..724620d7da3 100644
--- a/services/idp/pkg/command/root.go
+++ b/services/idp/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/idp/pkg/command/server.go b/services/idp/pkg/command/server.go
index 02bf30eaa0f..48f431f5921 100644
--- a/services/idp/pkg/command/server.go
+++ b/services/idp/pkg/command/server.go
@@ -56,8 +56,13 @@ func Server(cfg *config.Config) *cli.Command {
 			}
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				metrics     = metrics.New()
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				metrics = metrics.New()
 			)
 
 			defer cancel()
@@ -90,6 +95,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/invitations/cmd/invitations/main.go b/services/invitations/cmd/invitations/main.go
index 8c9a45aeabc..3290c0b3065 100644
--- a/services/invitations/cmd/invitations/main.go
+++ b/services/invitations/cmd/invitations/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/invitations/pkg/command"
 	"github.com/owncloud/ocis/v2/services/invitations/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/invitations/pkg/command/root.go b/services/invitations/pkg/command/root.go
index 7425baf0d39..aa8c993ab37 100644
--- a/services/invitations/pkg/command/root.go
+++ b/services/invitations/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/invitations/pkg/command/server.go b/services/invitations/pkg/command/server.go
index 0b2b358cda6..01000c7d727 100644
--- a/services/invitations/pkg/command/server.go
+++ b/services/invitations/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/oklog/run"
 	"github.com/owncloud/ocis/v2/ocis-pkg/config/configlog"
@@ -36,8 +37,13 @@ func Server(cfg *config.Config) *cli.Command {
 
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				metrics     = metrics.New(metrics.Logger(logger))
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				metrics = metrics.New(metrics.Logger(logger))
 			)
 
 			defer cancel()
@@ -83,6 +89,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/nats/cmd/nats/main.go b/services/nats/cmd/nats/main.go
index 347a2cc3e9e..4b5803ac78c 100644
--- a/services/nats/cmd/nats/main.go
+++ b/services/nats/cmd/nats/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/nats/pkg/command"
 	"github.com/owncloud/ocis/v2/services/nats/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/nats/pkg/command/root.go b/services/nats/pkg/command/root.go
index 483d91b63c0..067bd39cd57 100644
--- a/services/nats/pkg/command/root.go
+++ b/services/nats/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/nats/pkg/command/server.go b/services/nats/pkg/command/server.go
index 983909d8c67..e118d43312b 100644
--- a/services/nats/pkg/command/server.go
+++ b/services/nats/pkg/command/server.go
@@ -4,6 +4,7 @@ import (
 	"context"
 	"crypto/tls"
 	"fmt"
+	"os"
 
 	"github.com/oklog/run"
 
@@ -32,7 +33,12 @@ func Server(cfg *config.Config) *cli.Command {
 			logger := logging.Configure(cfg.Service.Name, cfg.Log)
 
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := func() (context.Context, context.CancelFunc) {
+				if cfg.Context == nil {
+					return context.WithCancel(context.Background())
+				}
+				return context.WithCancel(cfg.Context)
+			}()
 
 			defer cancel()
 
@@ -108,6 +114,7 @@ func Server(cfg *config.Config) *cli.Command {
 
 				natsServer.Shutdown()
 				cancel()
+				os.Exit(1)
 			})
 
 			return gr.Run()
diff --git a/services/notifications/cmd/notifications/main.go b/services/notifications/cmd/notifications/main.go
index 73f31b88fc6..5d5752af388 100644
--- a/services/notifications/cmd/notifications/main.go
+++ b/services/notifications/cmd/notifications/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/notifications/pkg/command"
 	"github.com/owncloud/ocis/v2/services/notifications/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/notifications/pkg/command/root.go b/services/notifications/pkg/command/root.go
index 2833e622edb..aa048245a01 100644
--- a/services/notifications/pkg/command/root.go
+++ b/services/notifications/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/notifications/pkg/command/server.go b/services/notifications/pkg/command/server.go
index 0b635a2a2a0..55b3c7ad3c4 100644
--- a/services/notifications/pkg/command/server.go
+++ b/services/notifications/pkg/command/server.go
@@ -53,7 +53,13 @@ func Server(cfg *config.Config) *cli.Command {
 
 			gr := run.Group{}
 
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := func() (context.Context, context.CancelFunc) {
+				if cfg.Context == nil {
+					return context.WithCancel(context.Background())
+				}
+				return context.WithCancel(cfg.Context)
+			}()
+
 			defer cancel()
 
 			{
diff --git a/services/ocdav/cmd/ocdav/main.go b/services/ocdav/cmd/ocdav/main.go
index 5a6d24390f0..9875027bdb5 100644
--- a/services/ocdav/cmd/ocdav/main.go
+++ b/services/ocdav/cmd/ocdav/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/ocdav/pkg/command"
 	"github.com/owncloud/ocis/v2/services/ocdav/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/ocdav/pkg/command/root.go b/services/ocdav/pkg/command/root.go
index 6dd8518683d..5b1afc5b301 100644
--- a/services/ocdav/pkg/command/root.go
+++ b/services/ocdav/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/ocdav/pkg/command/server.go b/services/ocdav/pkg/command/server.go
index 4272419e84d..33bb9b32264 100644
--- a/services/ocdav/pkg/command/server.go
+++ b/services/ocdav/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/cs3org/reva/v2/pkg/micro/ocdav"
 	"github.com/cs3org/reva/v2/pkg/sharedconf"
@@ -35,7 +36,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -103,6 +104,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Str("server", c.Command.Name).
 					Msg("Shutting down server")
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -125,3 +127,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/ocm/cmd/ocm/main.go b/services/ocm/cmd/ocm/main.go
index 77a2913ba61..6ac3d5a5773 100644
--- a/services/ocm/cmd/ocm/main.go
+++ b/services/ocm/cmd/ocm/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/ocm/pkg/command"
 	"github.com/owncloud/ocis/v2/services/ocm/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/ocm/pkg/command/root.go b/services/ocm/pkg/command/root.go
index e524c73bd33..7187fe52735 100644
--- a/services/ocm/pkg/command/root.go
+++ b/services/ocm/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/ocm/pkg/command/server.go b/services/ocm/pkg/command/server.go
index 6dc234fda9a..1025d1ce735 100644
--- a/services/ocm/pkg/command/server.go
+++ b/services/ocm/pkg/command/server.go
@@ -38,7 +38,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -62,6 +62,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -82,12 +83,12 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
 
-			httpSvc := registry.BuildHTTPService(cfg.HTTP.Namespace+"."+cfg.Service.Name, cfg.HTTP.Addr, version.GetString())
+			httpSvc := registry.BuildHTTPService(cfg.HTTP.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.HTTP.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, httpSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the http service")
 			}
@@ -96,3 +97,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/ocs/cmd/ocs/main.go b/services/ocs/cmd/ocs/main.go
index 96de1a08e17..a2b9021ead9 100644
--- a/services/ocs/cmd/ocs/main.go
+++ b/services/ocs/cmd/ocs/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/ocs/pkg/command"
 	"github.com/owncloud/ocis/v2/services/ocs/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/ocs/pkg/command/root.go b/services/ocs/pkg/command/root.go
index 1d2d38d8818..569ff06ab40 100644
--- a/services/ocs/pkg/command/root.go
+++ b/services/ocs/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/ocs/pkg/command/server.go b/services/ocs/pkg/command/server.go
index 1054ea2e280..cdb23116331 100644
--- a/services/ocs/pkg/command/server.go
+++ b/services/ocs/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/oklog/run"
 	"github.com/owncloud/ocis/v2/ocis-pkg/config/configlog"
@@ -41,8 +42,13 @@ func Server(cfg *config.Config) *cli.Command {
 
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				metrics     = metrics.New()
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				metrics = metrics.New()
 			)
 
 			defer cancel()
@@ -76,6 +82,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/policies/cmd/policies/main.go b/services/policies/cmd/policies/main.go
index e774e8c4a64..db0896e4072 100644
--- a/services/policies/cmd/policies/main.go
+++ b/services/policies/cmd/policies/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/policies/pkg/command"
 	"github.com/owncloud/ocis/v2/services/policies/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/policies/pkg/command/root.go b/services/policies/pkg/command/root.go
index 5926061c539..368ca7657c8 100644
--- a/services/policies/pkg/command/root.go
+++ b/services/policies/pkg/command/root.go
@@ -25,5 +25,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/policies/pkg/command/server.go b/services/policies/pkg/command/server.go
index 5719335ae21..6f4729f6911 100644
--- a/services/policies/pkg/command/server.go
+++ b/services/policies/pkg/command/server.go
@@ -35,8 +35,13 @@ func Server(cfg *config.Config) *cli.Command {
 		Action: func(c *cli.Context) error {
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				logger      = log.NewLogger(
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				logger = log.NewLogger(
 					log.Name(cfg.Service.Name),
 					log.Level(cfg.Log.Level),
 					log.Pretty(cfg.Log.Pretty),
diff --git a/services/postprocessing/cmd/postprocessing/main.go b/services/postprocessing/cmd/postprocessing/main.go
index 869d23db024..ddc191e3a39 100644
--- a/services/postprocessing/cmd/postprocessing/main.go
+++ b/services/postprocessing/cmd/postprocessing/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/postprocessing/pkg/command"
 	"github.com/owncloud/ocis/v2/services/postprocessing/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/postprocessing/pkg/command/root.go b/services/postprocessing/pkg/command/root.go
index 1e9796445fb..f4a20863206 100644
--- a/services/postprocessing/pkg/command/root.go
+++ b/services/postprocessing/pkg/command/root.go
@@ -31,5 +31,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/postprocessing/pkg/command/server.go b/services/postprocessing/pkg/command/server.go
index 6715a914634..f5033c12341 100644
--- a/services/postprocessing/pkg/command/server.go
+++ b/services/postprocessing/pkg/command/server.go
@@ -36,9 +36,15 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 		Action: func(c *cli.Context) error {
 			var (
-				gr          = run.Group{}
-				logger      = logging.Configure(cfg.Service.Name, cfg.Log)
-				ctx, cancel = context.WithCancel(c.Context)
+				gr     = run.Group{}
+				logger = logging.Configure(cfg.Service.Name, cfg.Log)
+
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
 			)
 			defer cancel()
 
@@ -82,6 +88,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Str("server", "http").
 						Msg("Shutting down server")
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/proxy/cmd/proxy/main.go b/services/proxy/cmd/proxy/main.go
index 889bc6772ee..7db75b5de08 100644
--- a/services/proxy/cmd/proxy/main.go
+++ b/services/proxy/cmd/proxy/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/proxy/pkg/command"
 	"github.com/owncloud/ocis/v2/services/proxy/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/proxy/pkg/command/root.go b/services/proxy/pkg/command/root.go
index b918424d6d8..65d32b57535 100644
--- a/services/proxy/pkg/command/root.go
+++ b/services/proxy/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/proxy/pkg/command/server.go b/services/proxy/pkg/command/server.go
index 7888a69794d..beb83ae506f 100644
--- a/services/proxy/pkg/command/server.go
+++ b/services/proxy/pkg/command/server.go
@@ -5,6 +5,7 @@ import (
 	"crypto/tls"
 	"fmt"
 	"net/http"
+	"os"
 	"time"
 
 	gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1"
@@ -119,7 +120,12 @@ func Server(cfg *config.Config) *cli.Command {
 			m := metrics.New()
 
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := func() (context.Context, context.CancelFunc) {
+				if cfg.Context == nil {
+					return context.WithCancel(context.Background())
+				}
+				return context.WithCancel(cfg.Context)
+			}()
 
 			defer cancel()
 
@@ -215,6 +221,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/search/cmd/search/main.go b/services/search/cmd/search/main.go
index 1426e298d38..70103e7bf00 100644
--- a/services/search/cmd/search/main.go
+++ b/services/search/cmd/search/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/search/pkg/command"
 	"github.com/owncloud/ocis/v2/services/search/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/search/pkg/command/root.go b/services/search/pkg/command/root.go
index f0f9d05b713..e850b3612fa 100644
--- a/services/search/pkg/command/root.go
+++ b/services/search/pkg/command/root.go
@@ -31,5 +31,5 @@ func Execute(cfg *config.Config) error {
 		Usage:    "Serve search API for oCIS",
 		Commands: GetCommands(cfg),
 	})
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/search/pkg/command/server.go b/services/search/pkg/command/server.go
index 1e823e42e4e..4983ab9a83b 100644
--- a/services/search/pkg/command/server.go
+++ b/services/search/pkg/command/server.go
@@ -41,7 +41,12 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := func() (context.Context, context.CancelFunc) {
+				if cfg.Context == nil {
+					return context.WithCancel(context.Background())
+				}
+				return context.WithCancel(cfg.Context)
+			}()
 			defer cancel()
 
 			mtrcs := metrics.New()
diff --git a/services/settings/cmd/settings/main.go b/services/settings/cmd/settings/main.go
index 965c6385401..1e21338dd80 100644
--- a/services/settings/cmd/settings/main.go
+++ b/services/settings/cmd/settings/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/settings/pkg/command"
 	"github.com/owncloud/ocis/v2/services/settings/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/settings/pkg/command/root.go b/services/settings/pkg/command/root.go
index d9679de4107..641cf491c6e 100644
--- a/services/settings/pkg/command/root.go
+++ b/services/settings/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/settings/pkg/command/server.go b/services/settings/pkg/command/server.go
index 5b11f00a56e..bcdb7f247d7 100644
--- a/services/settings/pkg/command/server.go
+++ b/services/settings/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/oklog/run"
 	"github.com/owncloud/ocis/v2/ocis-pkg/config/configlog"
@@ -43,7 +44,12 @@ func Server(cfg *config.Config) *cli.Command {
 			}
 
 			servers := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := func() (context.Context, context.CancelFunc) {
+				if cfg.Context == nil {
+					return context.WithCancel(context.Background())
+				}
+				return context.WithCancel(cfg.Context)
+			}()
 			defer cancel()
 
 			mtrcs := metrics.New()
@@ -73,6 +79,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Str("server", "http").
 					Msg("shutting down server")
 				cancel()
+				os.Exit(1)
 			})
 
 			// prepare a gRPC server and add it to the group run.
@@ -91,6 +98,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Str("server", "grpc").
 					Msg("shutting down server")
 				cancel()
+				os.Exit(1)
 			})
 
 			// prepare a debug server and add it to the group run.
diff --git a/services/sharing/cmd/sharing/main.go b/services/sharing/cmd/sharing/main.go
index c059753eb0b..54e0996e3fd 100644
--- a/services/sharing/cmd/sharing/main.go
+++ b/services/sharing/cmd/sharing/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/sharing/pkg/command"
 	"github.com/owncloud/ocis/v2/services/sharing/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/sharing/pkg/command/root.go b/services/sharing/pkg/command/root.go
index 4330a939b40..fba13bf9050 100644
--- a/services/sharing/pkg/command/root.go
+++ b/services/sharing/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/sharing/pkg/command/server.go b/services/sharing/pkg/command/server.go
index 5fc2bf58c5c..c0a89bfb974 100644
--- a/services/sharing/pkg/command/server.go
+++ b/services/sharing/pkg/command/server.go
@@ -39,7 +39,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -77,6 +77,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -98,7 +99,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -107,3 +108,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/sse/cmd/sse/main.go b/services/sse/cmd/sse/main.go
index 4e951b92514..8bd438f1148 100644
--- a/services/sse/cmd/sse/main.go
+++ b/services/sse/cmd/sse/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/sse/pkg/command"
 	"github.com/owncloud/ocis/v2/services/sse/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/sse/pkg/command/root.go b/services/sse/pkg/command/root.go
index 290cc700112..f3a6e4b2769 100644
--- a/services/sse/pkg/command/root.go
+++ b/services/sse/pkg/command/root.go
@@ -26,5 +26,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/sse/pkg/command/server.go b/services/sse/pkg/command/server.go
index 06491d29062..ac027d606d2 100644
--- a/services/sse/pkg/command/server.go
+++ b/services/sse/pkg/command/server.go
@@ -37,8 +37,13 @@ func Server(cfg *config.Config) *cli.Command {
 		Action: func(c *cli.Context) error {
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				logger      = log.NewLogger(
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				logger = log.NewLogger(
 					log.Name(cfg.Service.Name),
 					log.Level(cfg.Log.Level),
 					log.Pretty(cfg.Log.Pretty),
diff --git a/services/storage-publiclink/cmd/storage-publiclink/main.go b/services/storage-publiclink/cmd/storage-publiclink/main.go
index 2207a7829eb..6d2415a0070 100644
--- a/services/storage-publiclink/cmd/storage-publiclink/main.go
+++ b/services/storage-publiclink/cmd/storage-publiclink/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/storage-publiclink/pkg/command"
 	"github.com/owncloud/ocis/v2/services/storage-publiclink/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/storage-publiclink/pkg/command/root.go b/services/storage-publiclink/pkg/command/root.go
index a3822e8b0e1..9ca05cc710e 100644
--- a/services/storage-publiclink/pkg/command/root.go
+++ b/services/storage-publiclink/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/storage-publiclink/pkg/command/server.go b/services/storage-publiclink/pkg/command/server.go
index 64551f0366e..b0829d4728c 100644
--- a/services/storage-publiclink/pkg/command/server.go
+++ b/services/storage-publiclink/pkg/command/server.go
@@ -38,7 +38,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -61,6 +61,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -81,7 +82,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -90,3 +91,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/storage-shares/cmd/storage-shares/main.go b/services/storage-shares/cmd/storage-shares/main.go
index 5a292e0ec2f..8a8f9336beb 100644
--- a/services/storage-shares/cmd/storage-shares/main.go
+++ b/services/storage-shares/cmd/storage-shares/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/storage-shares/pkg/command"
 	"github.com/owncloud/ocis/v2/services/storage-shares/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/storage-shares/pkg/command/root.go b/services/storage-shares/pkg/command/root.go
index 2295b539da3..fd36affa1ef 100644
--- a/services/storage-shares/pkg/command/root.go
+++ b/services/storage-shares/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/storage-shares/pkg/command/server.go b/services/storage-shares/pkg/command/server.go
index 4cc258a84a2..d7c186a1f12 100644
--- a/services/storage-shares/pkg/command/server.go
+++ b/services/storage-shares/pkg/command/server.go
@@ -38,7 +38,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -61,6 +61,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -81,7 +82,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -90,3 +91,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/storage-system/cmd/storage-system/main.go b/services/storage-system/cmd/storage-system/main.go
index 9f2bdaa45e7..d9242ea0571 100644
--- a/services/storage-system/cmd/storage-system/main.go
+++ b/services/storage-system/cmd/storage-system/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/storage-system/pkg/command"
 	"github.com/owncloud/ocis/v2/services/storage-system/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/storage-system/pkg/command/root.go b/services/storage-system/pkg/command/root.go
index a9786726f17..92b6e757af6 100644
--- a/services/storage-system/pkg/command/root.go
+++ b/services/storage-system/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/storage-system/pkg/command/server.go b/services/storage-system/pkg/command/server.go
index 369f2a5ad7f..5424a456e9e 100644
--- a/services/storage-system/pkg/command/server.go
+++ b/services/storage-system/pkg/command/server.go
@@ -38,7 +38,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -61,6 +61,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -81,12 +82,12 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
 
-			httpScv := registry.BuildHTTPService(cfg.HTTP.Namespace+"."+cfg.Service.Name, cfg.HTTP.Addr, version.GetString())
+			httpScv := registry.BuildHTTPService(cfg.HTTP.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.HTTP.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, httpScv, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the http service")
 			}
@@ -95,3 +96,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/storage-system/pkg/revaconfig/config.go b/services/storage-system/pkg/revaconfig/config.go
index 82373265e8e..0dc62e3be54 100644
--- a/services/storage-system/pkg/revaconfig/config.go
+++ b/services/storage-system/pkg/revaconfig/config.go
@@ -2,14 +2,11 @@ package revaconfig
 
 import (
 	userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
-	pkgconfig "github.com/owncloud/ocis/v2/ocis-pkg/config"
 	"github.com/owncloud/ocis/v2/services/storage-system/pkg/config"
 )
 
 // StorageSystemFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service.
 func StorageSystemFromStruct(cfg *config.Config) map[string]interface{} {
-	localEndpoint := pkgconfig.LocalEndpoint(cfg.GRPC.Protocol, cfg.GRPC.Addr)
-
 	rcfg := map[string]interface{}{
 		"shared": map[string]interface{}{
 			"jwt_secret":                cfg.TokenManager.JWTSecret,
@@ -28,12 +25,12 @@ func StorageSystemFromStruct(cfg *config.Config) map[string]interface{} {
 			"services": map[string]interface{}{
 				"gateway": map[string]interface{}{
 					// registries are located on the gateway
-					"authregistrysvc":    localEndpoint,
-					"storageregistrysvc": localEndpoint,
+					"authregistrysvc":    "com.owncloud.api.storage-system",
+					"storageregistrysvc": "com.owncloud.api.storage-system",
 					// user metadata is located on the users services
-					"userprovidersvc":  localEndpoint,
-					"groupprovidersvc": localEndpoint,
-					"permissionssvc":   localEndpoint,
+					"userprovidersvc":  "com.owncloud.api.storage-system",
+					"groupprovidersvc": "com.owncloud.api.storage-system",
+					"permissionssvc":   "com.owncloud.api.storage-system",
 					// other
 					"disable_home_creation_on_login": true, // metadata manually creates a space
 					// metadata always uses the simple upload, so no transfer secret or datagateway needed
@@ -63,7 +60,7 @@ func StorageSystemFromStruct(cfg *config.Config) map[string]interface{} {
 					"drivers": map[string]interface{}{
 						"static": map[string]interface{}{
 							"rules": map[string]interface{}{
-								"machine": localEndpoint,
+								"machine": "com.owncloud.api.storage-system",
 							},
 						},
 					},
@@ -73,7 +70,7 @@ func StorageSystemFromStruct(cfg *config.Config) map[string]interface{} {
 					"auth_managers": map[string]interface{}{
 						"machine": map[string]interface{}{
 							"api_key":      cfg.SystemUserAPIKey,
-							"gateway_addr": localEndpoint,
+							"gateway_addr": "com.owncloud.api.storage-system",
 						},
 					},
 				},
@@ -89,7 +86,7 @@ func StorageSystemFromStruct(cfg *config.Config) map[string]interface{} {
 						"static": map[string]interface{}{
 							"rules": map[string]interface{}{
 								"/": map[string]interface{}{
-									"address": localEndpoint,
+									"address": "com.owncloud.api.storage-system",
 								},
 							},
 						},
@@ -97,7 +94,7 @@ func StorageSystemFromStruct(cfg *config.Config) map[string]interface{} {
 				},
 				"storageprovider": map[string]interface{}{
 					"driver":          cfg.Driver,
-					"drivers":         metadataDrivers(localEndpoint, cfg),
+					"drivers":         metadataDrivers(cfg),
 					"data_server_url": cfg.DataServerURL,
 				},
 			},
@@ -116,7 +113,7 @@ func StorageSystemFromStruct(cfg *config.Config) map[string]interface{} {
 				"dataprovider": map[string]interface{}{
 					"prefix":  "data",
 					"driver":  cfg.Driver,
-					"drivers": metadataDrivers(localEndpoint, cfg),
+					"drivers": metadataDrivers(cfg),
 					"data_txs": map[string]interface{}{
 						"simple": map[string]interface{}{
 							"cache_store":    "noop",
@@ -147,7 +144,7 @@ func StorageSystemFromStruct(cfg *config.Config) map[string]interface{} {
 	return rcfg
 }
 
-func metadataDrivers(localEndpoint string, cfg *config.Config) map[string]interface{} {
+func metadataDrivers(cfg *config.Config) map[string]interface{} {
 	return map[string]interface{}{
 		"ocis": map[string]interface{}{
 			"metadata_backend":           cfg.Drivers.OCIS.MetadataBackend,
@@ -155,7 +152,7 @@ func metadataDrivers(localEndpoint string, cfg *config.Config) map[string]interf
 			"user_layout":                "{{.Id.OpaqueId}}",
 			"treetime_accounting":        false,
 			"treesize_accounting":        false,
-			"permissionssvc":             localEndpoint,
+			"permissionssvc":             "com.owncloud.api.storage-system",
 			"max_acquire_lock_cycles":    cfg.Drivers.OCIS.MaxAcquireLockCycles,
 			"lock_cycle_duration_factor": cfg.Drivers.OCIS.LockCycleDurationFactor,
 			"disable_versioning":         true,
diff --git a/services/storage-users/cmd/storage-users/main.go b/services/storage-users/cmd/storage-users/main.go
index 62bf86fd007..c3c7bc7e3f0 100644
--- a/services/storage-users/cmd/storage-users/main.go
+++ b/services/storage-users/cmd/storage-users/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/storage-users/pkg/command"
 	"github.com/owncloud/ocis/v2/services/storage-users/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/storage-users/pkg/command/root.go b/services/storage-users/pkg/command/root.go
index d24d37a6c1c..777ec6f2f67 100644
--- a/services/storage-users/pkg/command/root.go
+++ b/services/storage-users/pkg/command/root.go
@@ -32,5 +32,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/storage-users/pkg/command/server.go b/services/storage-users/pkg/command/server.go
index c4b41379107..8a13bc78e55 100644
--- a/services/storage-users/pkg/command/server.go
+++ b/services/storage-users/pkg/command/server.go
@@ -40,7 +40,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -63,6 +63,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -92,7 +93,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -127,3 +128,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/store/cmd/store/main.go b/services/store/cmd/store/main.go
index 4384dfab8c8..ecf42e81938 100644
--- a/services/store/cmd/store/main.go
+++ b/services/store/cmd/store/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/store/pkg/command"
 	"github.com/owncloud/ocis/v2/services/store/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/store/pkg/command/root.go b/services/store/pkg/command/root.go
index d105b28f9f8..8e208dba5b2 100644
--- a/services/store/pkg/command/root.go
+++ b/services/store/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/store/pkg/command/server.go b/services/store/pkg/command/server.go
index 8971d75517d..854bf0e7bb2 100644
--- a/services/store/pkg/command/server.go
+++ b/services/store/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/oklog/run"
 
@@ -34,6 +35,9 @@ func Server(cfg *config.Config) *cli.Command {
 			if err != nil {
 				return err
 			}
+			if err != nil {
+				return err
+			}
 			cfg.GrpcClient, err = ogrpc.NewClient(
 				append(ogrpc.GetClientOptions(cfg.GRPCClientTLS), ogrpc.WithTraceProvider(traceProvider))...,
 			)
@@ -43,8 +47,13 @@ func Server(cfg *config.Config) *cli.Command {
 
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				metrics     = metrics.New()
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				metrics = metrics.New()
 			)
 
 			defer cancel()
@@ -67,6 +76,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/thumbnails/cmd/thumbnails/main.go b/services/thumbnails/cmd/thumbnails/main.go
index f2e8ce62676..f0a86f58bf2 100644
--- a/services/thumbnails/cmd/thumbnails/main.go
+++ b/services/thumbnails/cmd/thumbnails/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/thumbnails/pkg/command"
 	"github.com/owncloud/ocis/v2/services/thumbnails/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/thumbnails/pkg/command/root.go b/services/thumbnails/pkg/command/root.go
index 2e12c42c3bc..8ddf1c23d67 100644
--- a/services/thumbnails/pkg/command/root.go
+++ b/services/thumbnails/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/thumbnails/pkg/command/server.go b/services/thumbnails/pkg/command/server.go
index f95cf997815..ba869dae9de 100644
--- a/services/thumbnails/pkg/command/server.go
+++ b/services/thumbnails/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/oklog/run"
 	"github.com/owncloud/ocis/v2/ocis-pkg/config/configlog"
@@ -28,7 +29,7 @@ func Server(cfg *config.Config) *cli.Command {
 		Before: func(_ *cli.Context) error {
 			return configlog.ReturnFatal(parser.ParseConfig(cfg))
 		},
-		Action: func(c *cli.Context) error {
+		Action: func(_ *cli.Context) error {
 			logger := logging.Configure(cfg.Service.Name, cfg.Log)
 
 			traceProvider, err := tracing.GetServiceTraceProvider(cfg.Tracing, cfg.Service.Name)
@@ -42,8 +43,13 @@ func Server(cfg *config.Config) *cli.Command {
 
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				m           = metrics.New()
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				m = metrics.New()
 			)
 
 			defer cancel()
@@ -68,6 +74,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			server, err := debug.Server(
diff --git a/services/userlog/cmd/userlog/main.go b/services/userlog/cmd/userlog/main.go
index 58d53b06360..efdb7ae4b8d 100644
--- a/services/userlog/cmd/userlog/main.go
+++ b/services/userlog/cmd/userlog/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/userlog/pkg/command"
 	"github.com/owncloud/ocis/v2/services/userlog/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/userlog/pkg/command/root.go b/services/userlog/pkg/command/root.go
index 8b8d1b1a5c7..dd80e5acb61 100644
--- a/services/userlog/pkg/command/root.go
+++ b/services/userlog/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/userlog/pkg/command/server.go b/services/userlog/pkg/command/server.go
index 71a52ca7fac..a0d2e996602 100644
--- a/services/userlog/pkg/command/server.go
+++ b/services/userlog/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/cs3org/reva/v2/pkg/events"
 	"github.com/cs3org/reva/v2/pkg/events/stream"
@@ -69,7 +70,12 @@ func Server(cfg *config.Config) *cli.Command {
 			}
 
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := func() (context.Context, context.CancelFunc) {
+				if cfg.Context == nil {
+					return context.WithCancel(context.Background())
+				}
+				return context.WithCancel(cfg.Context)
+			}()
 
 			mtrcs := metrics.New()
 			mtrcs.BuildInfo.WithLabelValues(version.GetString()).Set(1)
@@ -140,6 +146,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/users/cmd/user/main.go b/services/users/cmd/user/main.go
index 35d221577cc..cae358d3c0b 100644
--- a/services/users/cmd/user/main.go
+++ b/services/users/cmd/user/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/users/pkg/command"
 	"github.com/owncloud/ocis/v2/services/users/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/users/pkg/command/root.go b/services/users/pkg/command/root.go
index 8952e628aac..e0039b1c390 100644
--- a/services/users/pkg/command/root.go
+++ b/services/users/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/users/pkg/command/server.go b/services/users/pkg/command/server.go
index 92094a627a0..100dea31b7b 100644
--- a/services/users/pkg/command/server.go
+++ b/services/users/pkg/command/server.go
@@ -39,7 +39,7 @@ func Server(cfg *config.Config) *cli.Command {
 				return err
 			}
 			gr := run.Group{}
-			ctx, cancel := context.WithCancel(c.Context)
+			ctx, cancel := defineContext(cfg)
 
 			defer cancel()
 
@@ -74,6 +74,7 @@ func Server(cfg *config.Config) *cli.Command {
 					Msg("Shutting down server")
 
 				cancel()
+				os.Exit(1)
 			})
 
 			debugServer, err := debug.Server(
@@ -94,7 +95,7 @@ func Server(cfg *config.Config) *cli.Command {
 				sync.Trap(&gr, cancel)
 			}
 
-			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, cfg.GRPC.Addr, version.GetString())
+			grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
 			if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
 				logger.Fatal().Err(err).Msg("failed to register the grpc service")
 			}
@@ -103,3 +104,14 @@ func Server(cfg *config.Config) *cli.Command {
 		},
 	}
 }
+
+// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
+// if not, it will create a root context that can be cancelled.
+func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
+	return func() (context.Context, context.CancelFunc) {
+		if cfg.Context == nil {
+			return context.WithCancel(context.Background())
+		}
+		return context.WithCancel(cfg.Context)
+	}()
+}
diff --git a/services/web/cmd/web/main.go b/services/web/cmd/web/main.go
index 2331767f35b..9974c37fc9a 100644
--- a/services/web/cmd/web/main.go
+++ b/services/web/cmd/web/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/web/pkg/command"
 	"github.com/owncloud/ocis/v2/services/web/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/web/pkg/command/root.go b/services/web/pkg/command/root.go
index 6f91fb895f2..91a648c1a2d 100644
--- a/services/web/pkg/command/root.go
+++ b/services/web/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/web/pkg/command/server.go b/services/web/pkg/command/server.go
index 5ba91343195..a4423d0fe3a 100644
--- a/services/web/pkg/command/server.go
+++ b/services/web/pkg/command/server.go
@@ -27,7 +27,7 @@ func Server(cfg *config.Config) *cli.Command {
 		Before: func(_ *cli.Context) error {
 			return configlog.ReturnFatal(parser.ParseConfig(cfg))
 		},
-		Action: func(c *cli.Context) error {
+		Action: func(_ *cli.Context) error {
 			logger := logging.Configure(cfg.Service.Name, cfg.Log)
 			traceProvider, err := tracing.GetServiceTraceProvider(cfg.Tracing, cfg.Service.Name)
 			if err != nil {
@@ -49,8 +49,13 @@ func Server(cfg *config.Config) *cli.Command {
 
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				m           = metrics.New()
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				m = metrics.New()
 			)
 
 			defer cancel()
@@ -89,6 +94,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/web/pkg/config/defaults/defaultconfig.go b/services/web/pkg/config/defaults/defaultconfig.go
index f442df70a40..15f3d45bb30 100644
--- a/services/web/pkg/config/defaults/defaultconfig.go
+++ b/services/web/pkg/config/defaults/defaultconfig.go
@@ -193,7 +193,7 @@ func Sanitize(cfg *config.Config) {
 	if cfg.Web.Config.Options.Embed.Enabled == "" &&
 		cfg.Web.Config.Options.Embed.Target == "" &&
 		cfg.Web.Config.Options.Embed.MessagesOrigin == "" &&
-		cfg.Web.Config.Options.Embed.DelegateAuthentication &&
+		cfg.Web.Config.Options.Embed.DelegateAuthentication == "" &&
 		cfg.Web.Config.Options.Embed.DelegateAuthenticationOrigin == "" {
 		cfg.Web.Config.Options.Embed = nil
 	}
diff --git a/services/web/pkg/config/options.go b/services/web/pkg/config/options.go
index 53cb75a1cbf..1b7b2da13db 100644
--- a/services/web/pkg/config/options.go
+++ b/services/web/pkg/config/options.go
@@ -48,7 +48,7 @@ type Embed struct {
 	Enabled                      string `json:"enabled,omitempty" yaml:"enabled" env:"WEB_OPTION_EMBED_ENABLED" desc:"Defines whether Web should be running in 'embed' mode. Setting this to 'true' will enable a stripped down version of Web with reduced functionality used to integrate Web into other applications like via iFrame. Setting it to 'false' or not setting it (default) will run Web as usual with all functionality enabled. See the text description for more details." introductionVersion:"5.0"`
 	Target                       string `json:"target,omitempty" yaml:"target" env:"WEB_OPTION_EMBED_TARGET" desc:"Defines how Web is being integrated when running in 'embed' mode. Currently, the only supported options are '' (empty) and 'location'. With '' which is the default, Web will run regular as defined via the 'embed.enabled' config option. With 'location', Web will run embedded as location picker. Resource selection will be disabled and the selected resources array always includes the current folder as the only item. See the text description for more details." introductionVersion:"5.0"`
 	MessagesOrigin               string `json:"messagesOrigin,omitempty" yaml:"messagesOrigin" env:"WEB_OPTION_EMBED_MESSAGES_ORIGIN" desc:"Defines a URL under which Web can be integrated via iFrame in 'embed' mode. Note that setting this is mandatory when running Web in 'embed' mode. Use '*' as value to allow running the iFrame under any URL, although this is not recommended for security reasons. See the text description for more details." introductionVersion:"5.0"`
-	DelegateAuthentication       bool   `json:"delegateAuthentication,omitempty" yaml:"delegateAuthentication" env:"WEB_OPTION_EMBED_DELEGATE_AUTHENTICATION" desc:"Defines whether Web should require authentication to be done by the parent application when running in 'embed' mode. If set to 'true' Web will not try to authenticate the user on its own but will require an access token coming from the parent application. Defaults to being unset." introductionVersion:"5.0"`
+	DelegateAuthentication       string `json:"delegateAuthentication,omitempty" yaml:"delegateAuthentication" env:"WEB_OPTION_EMBED_DELEGATE_AUTHENTICATION" desc:"Defines whether Web should require authentication to be done by the parent application when running in 'embed' mode. If set to 'true' Web will not try to authenticate the user on its own but will require an access token coming from the parent application. Defaults to being unset." introductionVersion:"5.0"`
 	DelegateAuthenticationOrigin string `json:"delegateAuthenticationOrigin,omitempty" yaml:"delegateAuthenticationOrigin" env:"WEB_OPTION_EMBED_DELEGATE_AUTHENTICATION_ORIGIN" desc:"Defines the host to validate the message event origin against when running Web in 'embed' mode with delegated authentication. Defaults to event message origin validation being omitted, which is only recommended for development setups." introductionVersion:"5.0"`
 }
 
diff --git a/services/webdav/cmd/webdav/main.go b/services/webdav/cmd/webdav/main.go
index 444ea77ff83..84449ec2e3e 100644
--- a/services/webdav/cmd/webdav/main.go
+++ b/services/webdav/cmd/webdav/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/webdav/pkg/command"
 	"github.com/owncloud/ocis/v2/services/webdav/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/webdav/pkg/command/root.go b/services/webdav/pkg/command/root.go
index e2d6cf9f7fc..8a1d46b23ac 100644
--- a/services/webdav/pkg/command/root.go
+++ b/services/webdav/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/webdav/pkg/command/server.go b/services/webdav/pkg/command/server.go
index d7ed386242d..88983e1de72 100644
--- a/services/webdav/pkg/command/server.go
+++ b/services/webdav/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/oklog/run"
 	"github.com/owncloud/ocis/v2/ocis-pkg/config/configlog"
@@ -43,8 +44,13 @@ func Server(cfg *config.Config) *cli.Command {
 
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				metrics     = metrics.New()
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				metrics = metrics.New()
 			)
 
 			defer cancel()
@@ -78,6 +84,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/services/webfinger/cmd/webfinger/main.go b/services/webfinger/cmd/webfinger/main.go
index 112094e8a4d..f370d1c9e9e 100644
--- a/services/webfinger/cmd/webfinger/main.go
+++ b/services/webfinger/cmd/webfinger/main.go
@@ -1,19 +1,14 @@
 package main
 
 import (
-	"context"
 	"os"
-	"os/signal"
-	"syscall"
 
 	"github.com/owncloud/ocis/v2/services/webfinger/pkg/command"
 	"github.com/owncloud/ocis/v2/services/webfinger/pkg/config/defaults"
 )
 
 func main() {
-	cfg := defaults.DefaultConfig()
-	cfg.Context, _ = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)
-	if err := command.Execute(cfg); err != nil {
+	if err := command.Execute(defaults.DefaultConfig()); err != nil {
 		os.Exit(1)
 	}
 }
diff --git a/services/webfinger/pkg/command/root.go b/services/webfinger/pkg/command/root.go
index a6d30c53cfa..4d553a26559 100644
--- a/services/webfinger/pkg/command/root.go
+++ b/services/webfinger/pkg/command/root.go
@@ -30,5 +30,5 @@ func Execute(cfg *config.Config) error {
 		Commands: GetCommands(cfg),
 	})
 
-	return app.RunContext(cfg.Context, os.Args)
+	return app.Run(os.Args)
 }
diff --git a/services/webfinger/pkg/command/server.go b/services/webfinger/pkg/command/server.go
index 0ba9cbe1298..2d8c4b8e45c 100644
--- a/services/webfinger/pkg/command/server.go
+++ b/services/webfinger/pkg/command/server.go
@@ -3,6 +3,7 @@ package command
 import (
 	"context"
 	"fmt"
+	"os"
 
 	"github.com/oklog/run"
 	"github.com/owncloud/ocis/v2/ocis-pkg/config/configlog"
@@ -37,8 +38,13 @@ func Server(cfg *config.Config) *cli.Command {
 
 			var (
 				gr          = run.Group{}
-				ctx, cancel = context.WithCancel(c.Context)
-				m           = metrics.New(metrics.Logger(logger))
+				ctx, cancel = func() (context.Context, context.CancelFunc) {
+					if cfg.Context == nil {
+						return context.WithCancel(context.Background())
+					}
+					return context.WithCancel(cfg.Context)
+				}()
+				m = metrics.New(metrics.Logger(logger))
 			)
 
 			defer cancel()
@@ -91,6 +97,7 @@ func Server(cfg *config.Config) *cli.Command {
 						Msg("Shutting down server")
 
 					cancel()
+					os.Exit(1)
 				})
 			}
 
diff --git a/sonar-project.properties b/sonar-project.properties
index 8a547ca7789..9e5346db2aa 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -2,7 +2,7 @@
 sonar.projectKey=owncloud_ocis
 sonar.organization=owncloud-1
 sonar.projectName=ocis
-sonar.projectVersion=6.2.0
+sonar.projectVersion=6.1.0
 sonar.host.url=https://sonarcloud.io
 
 # =====================================================
diff --git a/vendor/github.com/cs3org/reva/v2/internal/grpc/services/gateway/appprovider.go b/vendor/github.com/cs3org/reva/v2/internal/grpc/services/gateway/appprovider.go
index af56ae88ea3..be55590f753 100644
--- a/vendor/github.com/cs3org/reva/v2/internal/grpc/services/gateway/appprovider.go
+++ b/vendor/github.com/cs3org/reva/v2/internal/grpc/services/gateway/appprovider.go
@@ -325,12 +325,12 @@ func getGRPCConfig(opaque *typespb.Opaque) (bool, bool) {
 
 func getConn(host string, ins, skipverify bool) (*grpc.ClientConn, error) {
 	if ins {
-		return grpc.NewClient(host, grpc.WithTransportCredentials(insecure.NewCredentials()))
+		return grpc.Dial(host, grpc.WithTransportCredentials(insecure.NewCredentials()))
 	}
 
 	// TODO(labkode): if in the future we want client-side certificate validation,
 	// we need to load the client cert here
 	tlsconf := &tls.Config{InsecureSkipVerify: skipverify}
 	creds := credentials.NewTLS(tlsconf)
-	return grpc.NewClient(host, grpc.WithTransportCredentials(creds))
+	return grpc.Dial(host, grpc.WithTransportCredentials(creds))
 }
diff --git a/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/copy.go b/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/copy.go
index c009e597893..e575bdda766 100644
--- a/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/copy.go
+++ b/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/copy.go
@@ -292,12 +292,6 @@ func (s *svc) executePathCopy(ctx context.Context, selector pool.Selectable[gate
 			return err
 		}
 		defer httpDownloadRes.Body.Close()
-		if httpDownloadRes.StatusCode == http.StatusForbidden {
-			w.WriteHeader(http.StatusForbidden)
-			b, err := errors.Marshal(http.StatusForbidden, http.StatusText(http.StatusForbidden), "", strconv.Itoa(http.StatusForbidden))
-			errors.HandleWebdavError(log, w, b, err)
-			return nil
-		}
 		if httpDownloadRes.StatusCode != http.StatusOK {
 			return fmt.Errorf("status code %d", httpDownloadRes.StatusCode)
 		}
diff --git a/vendor/github.com/cs3org/reva/v2/pkg/eosclient/eosgrpc/eosgrpc.go b/vendor/github.com/cs3org/reva/v2/pkg/eosclient/eosgrpc/eosgrpc.go
index 3e07b268e20..d57a2a63493 100644
--- a/vendor/github.com/cs3org/reva/v2/pkg/eosclient/eosgrpc/eosgrpc.go
+++ b/vendor/github.com/cs3org/reva/v2/pkg/eosclient/eosgrpc/eosgrpc.go
@@ -133,7 +133,7 @@ func newgrpc(ctx context.Context, opt *Options) (erpc.EosClient, error) {
 	log := appctx.GetLogger(ctx)
 	log.Info().Str("Setting up GRPC towards ", "'"+opt.GrpcURI+"'").Msg("")
 
-	conn, err := grpc.NewClient(opt.GrpcURI, grpc.WithTransportCredentials(insecure.NewCredentials()))
+	conn, err := grpc.Dial(opt.GrpcURI, grpc.WithTransportCredentials(insecure.NewCredentials()))
 	if err != nil {
 		log.Warn().Str("Error connecting to ", "'"+opt.GrpcURI+"' ").Str("err", err.Error()).Msg("")
 	}
diff --git a/vendor/github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool/connection.go b/vendor/github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool/connection.go
index cc454f8c0c4..d666dac7a3b 100644
--- a/vendor/github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool/connection.go
+++ b/vendor/github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool/connection.go
@@ -38,7 +38,7 @@ var (
 // NewConn creates a new connection to a grpc server
 // with open census tracing support.
 // TODO(labkode): make grpc tls configurable.
-func NewConn(target string, opts ...Option) (*grpc.ClientConn, error) {
+func NewConn(address string, opts ...Option) (*grpc.ClientConn, error) {
 
 	options := ClientOptions{}
 	if err := options.init(); err != nil {
@@ -84,34 +84,12 @@ func NewConn(target string, opts ...Option) (*grpc.ClientConn, error) {
 		maxRcvMsgSize = s
 	}
 
-	conn, err := grpc.NewClient(
-		target,
+	conn, err := grpc.Dial(
+		address,
 		grpc.WithTransportCredentials(cred),
 		grpc.WithDefaultCallOptions(
 			grpc.MaxCallRecvMsgSize(maxRcvMsgSize),
 		),
-		grpc.WithDefaultServiceConfig(`{
-			"loadBalancingPolicy":"round_robin"
-		}`),
-		/* we may want to retry more often than the default transparent retry, see https://grpc.io/docs/guides/retry/#retry-configuration
-		grpc.WithDefaultServiceConfig(`{
-			"loadBalancingPolicy":"round_robin"
-			"methodConfig": [
-				{
-					"name": [
-						{ "service": "grpc.examples.echo.Echo" }
-					],
-					"retryPolicy": {
-						"maxAttempts": 3,
-						"initialBackoff": "0.1s",
-						"maxBackoff": "1s",
-						"backoffMultiplier": 2,
-						"retryableStatusCodes": ["UNAVAILABLE", "CANCELLED", "RESOURCE_EXHAUSTED", "DEADLINE_EXCEEDED"]
-					}
-				}
-			]
-		}`),
-		*/
 		grpc.WithStatsHandler(otelgrpc.NewClientHandler(
 			otelgrpc.WithTracerProvider(
 				options.tracerProvider,
diff --git a/vendor/github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool/selector.go b/vendor/github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool/selector.go
index 7c88368fba2..27105ed8072 100644
--- a/vendor/github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool/selector.go
+++ b/vendor/github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool/selector.go
@@ -20,7 +20,6 @@ package pool
 
 import (
 	"fmt"
-	"strings"
 	"sync"
 
 	appProvider "github.com/cs3org/go-cs3apis/cs3/app/provider/v1beta1"
@@ -44,16 +43,9 @@ import (
 	tx "github.com/cs3org/go-cs3apis/cs3/tx/v1beta1"
 	"github.com/cs3org/reva/v2/pkg/registry"
 	"github.com/pkg/errors"
-	"github.com/sercand/kuberesolver/v5"
 	"google.golang.org/grpc"
 )
 
-func init() {
-	// grpc go resolver.Register must only be called during initialization time (i.e. in
-	// an init() function), and is not thread-safe.
-	kuberesolver.RegisterInCluster()
-}
-
 type Selectable[T any] interface {
 	Next(opts ...Option) (T, error)
 }
@@ -101,19 +93,8 @@ func (s *Selector[T]) Next(opts ...Option) (T, error) {
 		opt(&options)
 	}
 
-	target := s.id
-	// if the target is given as a recognized gRPC URI, skip registry lookup
-	// see https://github.com/grpc/grpc/blob/master/doc/naming.md#name-syntax
-	prefix := strings.SplitN(s.id, ":", 2)[0]
-	switch {
-	case prefix == "dns":
-		fallthrough
-	case prefix == "unix":
-		fallthrough
-	case prefix == "kubernetes":
-		// use target as is and skip registry lookup
-	case options.registry != nil:
-		// use service registry to look up address
+	address := s.id
+	if options.registry != nil {
 		services, err := options.registry.GetService(s.id)
 		if err != nil {
 			return *new(T), fmt.Errorf("%s: %w", s.id, err)
@@ -123,23 +104,22 @@ func (s *Selector[T]) Next(opts ...Option) (T, error) {
 		if err != nil {
 			return *new(T), fmt.Errorf("%s: %w", s.id, err)
 		}
-		target = nodeAddress
-	default:
-		// if no registry is available, use the target as is
+
+		address = nodeAddress
 	}
 
-	existingClient, ok := s.clientMap.Load(target)
+	existingClient, ok := s.clientMap.Load(address)
 	if ok {
 		return existingClient.(T), nil
 	}
 
-	conn, err := NewConn(target, allOpts...)
+	conn, err := NewConn(address, allOpts...)
 	if err != nil {
-		return *new(T), errors.Wrap(err, fmt.Sprintf("could not create connection for %s to %s", s.id, target))
+		return *new(T), errors.Wrap(err, fmt.Sprintf("could not create connection for %s to %s", s.id, address))
 	}
 
 	newClient := s.clientFactory(conn)
-	s.clientMap.Store(target, newClient)
+	s.clientMap.Store(address, newClient)
 
 	return newClient, nil
 }
diff --git a/vendor/github.com/cs3org/reva/v2/pkg/trace/trace.go b/vendor/github.com/cs3org/reva/v2/pkg/trace/trace.go
index f4bfcb9d9b8..e96fe10cda4 100644
--- a/vendor/github.com/cs3org/reva/v2/pkg/trace/trace.go
+++ b/vendor/github.com/cs3org/reva/v2/pkg/trace/trace.go
@@ -22,6 +22,7 @@ import (
 	"context"
 	"fmt"
 	"sync"
+	"time"
 
 	"go.opentelemetry.io/otel/attribute"
 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
@@ -105,11 +106,13 @@ func DefaultProvider() trace.TracerProvider {
 
 // getOtelTracerProvider returns a new TracerProvider, configure for the specified service
 func getOtlpTracerProvider(options Options) trace.TracerProvider {
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
+	defer cancel()
 	transportCredentials := options.TransportCredentials
 	if options.Insecure {
 		transportCredentials = insecure.NewCredentials()
 	}
-	conn, err := grpc.NewClient(options.Endpoint,
+	conn, err := grpc.DialContext(ctx, options.Endpoint,
 		grpc.WithTransportCredentials(transportCredentials),
 	)
 	if err != nil {
diff --git a/vendor/github.com/go-micro/plugins/v4/store/nats-js-kv/nats.go b/vendor/github.com/go-micro/plugins/v4/store/nats-js-kv/nats.go
index 280a6da1314..4ffba417a9b 100644
--- a/vendor/github.com/go-micro/plugins/v4/store/nats-js-kv/nats.go
+++ b/vendor/github.com/go-micro/plugins/v4/store/nats-js-kv/nats.go
@@ -335,63 +335,22 @@ func (n *natsStore) String() string {
 	return "NATS JetStream KeyValueStore"
 }
 
-// StoreUpdate is the update type for the store.
-type StoreUpdate struct {
-	Value  KeyValueEnvelope
-	Action string
-}
-
 // WatchAll exposes the watcher interface from the underlying JetStreamContext.
-func (n *natsStore) WatchAll(bucket string, opts ...nats.WatchOpt) (<-chan *StoreUpdate, func() error, error) {
+func (n *natsStore) WatchAll(bucket string, opts ...nats.WatchOpt) (nats.KeyWatcher, error) {
 	if bucket == "" {
-		return nil, nil, errors.New("multi bucket watching is not supported")
+		return nil, errors.New("multi bucket watching is not supported")
 	}
 
 	if err := n.initConn(); err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
 	b, err := n.js.KeyValue(bucket)
 	if err != nil {
-		return nil, nil, errors.Wrap(err, "Failed to get bucket")
+		return nil, errors.Wrap(err, "Failed to get bucket")
 	}
 
-	w, err := b.WatchAll(opts...)
-	if err != nil {
-		return nil, nil, errors.Wrap(err, "Failed to watch bucket")
-	}
-
-	ch := make(chan *StoreUpdate)
-	go func() {
-		for u := range w.Updates() {
-			if u == nil {
-				continue
-			}
-
-			var action string
-			switch u.Operation() {
-			default:
-				action = u.Operation().String()
-			case nats.KeyValuePut:
-				action = "create"
-			case nats.KeyValueDelete:
-				action = "delete"
-			case nats.KeyValuePurge:
-				action = "delete"
-			}
-
-			var kv KeyValueEnvelope
-			if err := json.Unmarshal(u.Value(), &kv); err != nil {
-				continue
-			}
-			ch <- &StoreUpdate{
-				Value:  kv,
-				Action: action,
-			}
-		}
-	}()
-
-	return ch, w.Stop, nil
+	return b.WatchAll(opts...)
 }
 
 // thread safe way to initialize the connection.
diff --git a/vendor/github.com/sercand/kuberesolver/v5/.gitignore b/vendor/github.com/sercand/kuberesolver/v5/.gitignore
deleted file mode 100644
index 24846343f0b..00000000000
--- a/vendor/github.com/sercand/kuberesolver/v5/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-.idea
-kuberesolver.iml
diff --git a/vendor/github.com/sercand/kuberesolver/v5/LICENSE b/vendor/github.com/sercand/kuberesolver/v5/LICENSE
deleted file mode 100644
index 5ae44e510f2..00000000000
--- a/vendor/github.com/sercand/kuberesolver/v5/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright 2017 Sercan Degirmenci
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
\ No newline at end of file
diff --git a/vendor/github.com/sercand/kuberesolver/v5/README.md b/vendor/github.com/sercand/kuberesolver/v5/README.md
deleted file mode 100644
index 814dc2c0bb5..00000000000
--- a/vendor/github.com/sercand/kuberesolver/v5/README.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# kuberesolver
-
-A Grpc name resolver by using kubernetes API.
-It comes with a small ~250 LOC kubernetes client to find service endpoints. Therefore it won't bloat your binaries.
-
-
-### USAGE
-
-```go
-
-// Import the module
-import "github.com/sercand/kuberesolver/v5"
-	
-// Register kuberesolver to grpc before calling grpc.Dial
-kuberesolver.RegisterInCluster()
-
-// it is same as
-resolver.Register(kuberesolver.NewBuilder(nil /*custom kubernetes client*/ , "kubernetes"))
-
-// if schema is 'kubernetes' then grpc will use kuberesolver to resolve addresses
-cc, err := grpc.Dial("kubernetes:///service.namespace:portname", opts...)
-```
-
-An url can be one of the following, [grpc naming docs](https://github.com/grpc/grpc/blob/master/doc/naming.md)
-
-```
-kubernetes:///service-name:8080
-kubernetes:///service-name:portname
-kubernetes:///service-name.namespace:8080
-kubernetes:///service-name.namespace.svc.cluster_name
-kubernetes:///service-name.namespace.svc.cluster_name:8080
-
-kubernetes://namespace/service-name:8080
-kubernetes://service-name:8080/
-kubernetes://service-name.namespace:8080/
-kubernetes://service-name.namespace.svc.cluster_name
-kubernetes://service-name.namespace.svc.cluster_name:8080
-```
-_* Please note that the cluster_name is not used in resolving the endpoints of a Service. It is only there to support fully qualified service names, e.g._ `test.default.svc.cluster.local`.
-
-### Using alternative Schema
-
-Use `RegisterInClusterWithSchema(schema)` instead of `RegisterInCluster` on start.
-
-### Client Side Load Balancing
-
-You need to pass grpc.WithBalancerName option to grpc on dial: 
-
-```go
-grpc.DialContext(ctx,  "kubernetes:///service:grpc", grpc.WithBalancerName("round_robin"), grpc.WithInsecure())
-```
-This will create subconnections for each available service endpoints.
-
-### How is this different from dialing to `service.namespace:8080`
-
-Connecting to a service by dialing to `service.namespace:8080` uses DNS and it returns service stable IP. Therefore, gRPC doesn't know the endpoint IP addresses and it fails to reconnect to target services in case of failure.  
-
-Kuberesolver uses kubernetes API to get and watch service endpoint IP addresses. 
-Since it provides and updates all available service endpoints, together with a client-side balancer you can achive zero downtime deployments.
-
-### RBAC
-
-You need give `GET` and `WATCH` access to the `endpoints` if you are using RBAC in your cluster.
-
-
-### Using With TLS
-
-You need to a certificate with name `service-name.namespace` in order to connect with TLS to your services.
diff --git a/vendor/github.com/sercand/kuberesolver/v5/builder.go b/vendor/github.com/sercand/kuberesolver/v5/builder.go
deleted file mode 100644
index da259afc60c..00000000000
--- a/vendor/github.com/sercand/kuberesolver/v5/builder.go
+++ /dev/null
@@ -1,289 +0,0 @@
-package kuberesolver
-
-import (
-	"context"
-	"fmt"
-	"io"
-	"net"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
-
-	"github.com/prometheus/client_golang/prometheus"
-	"github.com/prometheus/client_golang/prometheus/promauto"
-	"google.golang.org/grpc/grpclog"
-	"google.golang.org/grpc/resolver"
-)
-
-const (
-	kubernetesSchema = "kubernetes"
-	defaultFreq      = time.Minute * 30
-)
-
-var (
-	endpointsForTarget = promauto.NewGaugeVec(
-		prometheus.GaugeOpts{
-			Name: "kuberesolver_endpoints_total",
-			Help: "The number of endpoints for a given target",
-		},
-		[]string{"target"},
-	)
-	addressesForTarget = promauto.NewGaugeVec(
-		prometheus.GaugeOpts{
-			Name: "kuberesolver_addresses_total",
-			Help: "The number of addresses for a given target",
-		},
-		[]string{"target"},
-	)
-)
-
-type targetInfo struct {
-	serviceName       string
-	serviceNamespace  string
-	port              string
-	resolveByPortName bool
-	useFirstPort      bool
-}
-
-func (ti targetInfo) String() string {
-	return fmt.Sprintf("kubernetes://%s/%s:%s", ti.serviceNamespace, ti.serviceName, ti.port)
-}
-
-// RegisterInCluster registers the kuberesolver builder to grpc with kubernetes schema
-func RegisterInCluster() {
-	RegisterInClusterWithSchema(kubernetesSchema)
-}
-
-// RegisterInClusterWithSchema registers the kuberesolver builder to the grpc with custom schema
-func RegisterInClusterWithSchema(schema string) {
-	resolver.Register(NewBuilder(nil, schema))
-}
-
-// NewBuilder creates a kubeBuilder which is used by grpc resolver.
-func NewBuilder(client K8sClient, schema string) resolver.Builder {
-	return &kubeBuilder{
-		k8sClient: client,
-		schema:    schema,
-	}
-}
-
-type kubeBuilder struct {
-	k8sClient K8sClient
-	schema    string
-}
-
-func splitServicePortNamespace(hpn string) (service, port, namespace string) {
-	service = hpn
-
-	colon := strings.LastIndexByte(service, ':')
-	if colon != -1 {
-		service, port = service[:colon], service[colon+1:]
-	}
-
-	// we want to split into the service name, namespace, and whatever else is left
-	// this will support fully qualified service names, e.g. {service-name}.<namespace>.svc.<cluster-domain-name>.
-	// Note that since we lookup the endpoints by service name and namespace, we don't care about the
-	// cluster-domain-name, only that we can parse out the service name and namespace properly.
-	parts := strings.SplitN(service, ".", 3)
-	if len(parts) >= 2 {
-		service, namespace = parts[0], parts[1]
-	}
-
-	return
-}
-
-func parseResolverTarget(target resolver.Target) (targetInfo, error) {
-	var service, port, namespace string
-	if target.URL.Host == "" {
-		// kubernetes:///service.namespace:port
-		service, port, namespace = splitServicePortNamespace(target.Endpoint())
-	} else if target.URL.Port() == "" && target.Endpoint() != "" {
-		// kubernetes://namespace/service:port
-		service, port, _ = splitServicePortNamespace(target.Endpoint())
-		namespace = target.URL.Hostname()
-	} else {
-		// kubernetes://service.namespace:port
-		service, port, namespace = splitServicePortNamespace(target.URL.Host)
-	}
-
-	if service == "" {
-		return targetInfo{}, fmt.Errorf("target %s must specify a service", &target.URL)
-	}
-
-	resolveByPortName := false
-	useFirstPort := false
-	if port == "" {
-		useFirstPort = true
-	} else if _, err := strconv.Atoi(port); err != nil {
-		resolveByPortName = true
-	}
-
-	return targetInfo{
-		serviceName:       service,
-		serviceNamespace:  namespace,
-		port:              port,
-		resolveByPortName: resolveByPortName,
-		useFirstPort:      useFirstPort,
-	}, nil
-}
-
-// Build creates a new resolver for the given target.
-//
-// gRPC dial calls Build synchronously, and fails if the returned error is
-// not nil.
-func (b *kubeBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {
-	if b.k8sClient == nil {
-		if cl, err := NewInClusterK8sClient(); err == nil {
-			b.k8sClient = cl
-		} else {
-			return nil, err
-		}
-	}
-	ti, err := parseResolverTarget(target)
-	if err != nil {
-		return nil, err
-	}
-	if ti.serviceNamespace == "" {
-		ti.serviceNamespace = getCurrentNamespaceOrDefault()
-	}
-	ctx, cancel := context.WithCancel(context.Background())
-	r := &kResolver{
-		target:    ti,
-		ctx:       ctx,
-		cancel:    cancel,
-		cc:        cc,
-		rn:        make(chan struct{}, 1),
-		k8sClient: b.k8sClient,
-		t:         time.NewTimer(defaultFreq),
-		freq:      defaultFreq,
-
-		endpoints: endpointsForTarget.WithLabelValues(ti.String()),
-		addresses: addressesForTarget.WithLabelValues(ti.String()),
-	}
-	go until(func() {
-		r.wg.Add(1)
-		err := r.watch()
-		if err != nil && err != io.EOF {
-			grpclog.Errorf("kuberesolver: watching ended with error='%v', will reconnect again", err)
-		}
-	}, time.Second, time.Second*30, ctx.Done())
-	return r, nil
-}
-
-// Scheme returns the scheme supported by this resolver.
-// Scheme is defined at https://github.com/grpc/grpc/blob/master/doc/naming.md.
-func (b *kubeBuilder) Scheme() string {
-	return b.schema
-}
-
-type kResolver struct {
-	target targetInfo
-	ctx    context.Context
-	cancel context.CancelFunc
-	cc     resolver.ClientConn
-	// rn channel is used by ResolveNow() to force an immediate resolution of the target.
-	rn        chan struct{}
-	k8sClient K8sClient
-	// wg is used to enforce Close() to return after the watcher() goroutine has finished.
-	wg   sync.WaitGroup
-	t    *time.Timer
-	freq time.Duration
-
-	endpoints prometheus.Gauge
-	addresses prometheus.Gauge
-}
-
-// ResolveNow will be called by gRPC to try to resolve the target name again.
-// It's just a hint, resolver can ignore this if it's not necessary.
-func (k *kResolver) ResolveNow(resolver.ResolveNowOptions) {
-	select {
-	case k.rn <- struct{}{}:
-	default:
-	}
-}
-
-// Close closes the resolver.
-func (k *kResolver) Close() {
-	k.cancel()
-	k.wg.Wait()
-}
-
-func (k *kResolver) makeAddresses(e Endpoints) ([]resolver.Address, string) {
-	var newAddrs []resolver.Address
-	for _, subset := range e.Subsets {
-		port := ""
-		if k.target.useFirstPort {
-			port = strconv.Itoa(subset.Ports[0].Port)
-		} else if k.target.resolveByPortName {
-			for _, p := range subset.Ports {
-				if p.Name == k.target.port {
-					port = strconv.Itoa(p.Port)
-					break
-				}
-			}
-		} else {
-			port = k.target.port
-		}
-
-		if len(port) == 0 {
-			port = strconv.Itoa(subset.Ports[0].Port)
-		}
-
-		for _, address := range subset.Addresses {
-			newAddrs = append(newAddrs, resolver.Address{
-				Addr:       net.JoinHostPort(address.IP, port),
-				ServerName: fmt.Sprintf("%s.%s", k.target.serviceName, k.target.serviceNamespace),
-				Metadata:   nil,
-			})
-		}
-	}
-	return newAddrs, ""
-}
-
-func (k *kResolver) handle(e Endpoints) {
-	result, _ := k.makeAddresses(e)
-	//	k.cc.NewServiceConfig(sc)
-	if len(result) > 0 {
-		k.cc.NewAddress(result)
-	}
-
-	k.endpoints.Set(float64(len(e.Subsets)))
-	k.addresses.Set(float64(len(result)))
-}
-
-func (k *kResolver) resolve() {
-	e, err := getEndpoints(k.k8sClient, k.target.serviceNamespace, k.target.serviceName)
-	if err == nil {
-		k.handle(e)
-	} else {
-		grpclog.Errorf("kuberesolver: lookup endpoints failed: %v", err)
-	}
-	// Next lookup should happen after an interval defined by k.freq.
-	k.t.Reset(k.freq)
-}
-
-func (k *kResolver) watch() error {
-	defer k.wg.Done()
-	// watch endpoints lists existing endpoints at start
-	sw, err := watchEndpoints(k.ctx, k.k8sClient, k.target.serviceNamespace, k.target.serviceName)
-	if err != nil {
-		return err
-	}
-	for {
-		select {
-		case <-k.ctx.Done():
-			return nil
-		case <-k.t.C:
-			k.resolve()
-		case <-k.rn:
-			//k.resolve()
-		case up, hasMore := <-sw.ResultChan():
-			if hasMore {
-				k.handle(up.Object)
-			} else {
-				return nil
-			}
-		}
-	}
-}
diff --git a/vendor/github.com/sercand/kuberesolver/v5/kubernetes.go b/vendor/github.com/sercand/kuberesolver/v5/kubernetes.go
deleted file mode 100644
index 79b82058272..00000000000
--- a/vendor/github.com/sercand/kuberesolver/v5/kubernetes.go
+++ /dev/null
@@ -1,206 +0,0 @@
-package kuberesolver
-
-import (
-	"context"
-	"crypto/tls"
-	"crypto/x509"
-	"encoding/json"
-	"fmt"
-	"net"
-	"net/http"
-	"net/url"
-	"os"
-	"strings"
-	"sync"
-	"time"
-
-	"github.com/fsnotify/fsnotify"
-)
-
-const (
-	serviceAccountToken     = "/var/run/secrets/kubernetes.io/serviceaccount/token"
-	serviceAccountCACert    = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
-	kubernetesNamespaceFile = "/var/run/secrets/kubernetes.io/serviceaccount/namespace"
-	defaultNamespace        = "default"
-)
-
-// K8sClient is minimal kubernetes client interface
-type K8sClient interface {
-	Do(req *http.Request) (*http.Response, error)
-	GetRequest(url string) (*http.Request, error)
-	Host() string
-}
-
-type k8sClient struct {
-	host       string
-	token      string
-	tokenLck   sync.RWMutex
-	httpClient *http.Client
-}
-
-func (kc *k8sClient) GetRequest(url string) (*http.Request, error) {
-	if !strings.HasPrefix(url, kc.host) {
-		url = fmt.Sprintf("%s/%s", kc.host, url)
-	}
-	req, err := http.NewRequest("GET", url, nil)
-	if err != nil {
-		return nil, err
-	}
-	kc.tokenLck.RLock()
-	defer kc.tokenLck.RUnlock()
-	if len(kc.token) > 0 {
-		req.Header.Set("Authorization", "Bearer "+kc.token)
-	}
-	return req, nil
-}
-
-func (kc *k8sClient) Do(req *http.Request) (*http.Response, error) {
-	return kc.httpClient.Do(req)
-}
-
-func (kc *k8sClient) Host() string {
-	return kc.host
-}
-
-func (kc *k8sClient) setToken(token string) {
-	kc.tokenLck.Lock()
-	defer kc.tokenLck.Unlock()
-	kc.token = token
-}
-
-// NewInClusterK8sClient creates K8sClient if it is inside Kubernetes
-func NewInClusterK8sClient() (K8sClient, error) {
-	host, port := os.Getenv("KUBERNETES_SERVICE_HOST"), os.Getenv("KUBERNETES_SERVICE_PORT")
-	if len(host) == 0 || len(port) == 0 {
-		return nil, fmt.Errorf("unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined")
-	}
-	token, err := os.ReadFile(serviceAccountToken)
-	if err != nil {
-		return nil, err
-	}
-	ca, err := os.ReadFile(serviceAccountCACert)
-	if err != nil {
-		return nil, err
-	}
-	certPool := x509.NewCertPool()
-	certPool.AppendCertsFromPEM(ca)
-	transport := &http.Transport{TLSClientConfig: &tls.Config{
-		MinVersion: tls.VersionTLS10,
-		RootCAs:    certPool,
-	}}
-	httpClient := &http.Client{Transport: transport, Timeout: time.Nanosecond * 0}
-
-	client := &k8sClient{
-		host:       "https://" + net.JoinHostPort(host, port),
-		token:      string(token),
-		httpClient: httpClient,
-	}
-
-	// Create a new file watcher to listen for new Service Account tokens
-	watcher, err := fsnotify.NewWatcher()
-	if err != nil {
-		return nil, err
-	}
-
-	go func() {
-		for {
-			select {
-			case event, ok := <-watcher.Events:
-				if !ok {
-					return
-				}
-				// k8s configmaps uses symlinks, we need this workaround.
-				// original configmap file is removed
-				if event.Op.Has(fsnotify.Remove) || event.Op.Has(fsnotify.Chmod) {
-					// remove watcher since the file is removed
-					watcher.Remove(event.Name)
-					// add a new watcher pointing to the new symlink/file
-					watcher.Add(serviceAccountToken)
-					token, err := os.ReadFile(serviceAccountToken)
-					if err == nil {
-						client.setToken(string(token))
-					}
-				}
-				if event.Has(fsnotify.Write) {
-					token, err := os.ReadFile(serviceAccountToken)
-					if err == nil {
-						client.setToken(string(token))
-					}
-				}
-			case _, ok := <-watcher.Errors:
-				if !ok {
-					return
-				}
-			}
-		}
-	}()
-
-	err = watcher.Add(serviceAccountToken)
-	if err != nil {
-		return nil, err
-	}
-
-	return client, nil
-}
-
-// NewInsecureK8sClient creates an insecure k8s client which is suitable
-// to connect kubernetes api behind proxy
-func NewInsecureK8sClient(apiURL string) K8sClient {
-	return &k8sClient{
-		host:       apiURL,
-		httpClient: http.DefaultClient,
-	}
-}
-
-func getEndpoints(client K8sClient, namespace, targetName string) (Endpoints, error) {
-	u, err := url.Parse(fmt.Sprintf("%s/api/v1/namespaces/%s/endpoints/%s",
-		client.Host(), namespace, targetName))
-	if err != nil {
-		return Endpoints{}, err
-	}
-	req, err := client.GetRequest(u.String())
-	if err != nil {
-		return Endpoints{}, err
-	}
-	resp, err := client.Do(req)
-	if err != nil {
-		return Endpoints{}, err
-	}
-	defer resp.Body.Close()
-	if resp.StatusCode != http.StatusOK {
-		return Endpoints{}, fmt.Errorf("invalid response code %d for service %s in namespace %s", resp.StatusCode, targetName, namespace)
-	}
-	result := Endpoints{}
-	err = json.NewDecoder(resp.Body).Decode(&result)
-	return result, err
-}
-
-func watchEndpoints(ctx context.Context, client K8sClient, namespace, targetName string) (watchInterface, error) {
-	u, err := url.Parse(fmt.Sprintf("%s/api/v1/watch/namespaces/%s/endpoints/%s",
-		client.Host(), namespace, targetName))
-	if err != nil {
-		return nil, err
-	}
-	req, err := client.GetRequest(u.String())
-	if err != nil {
-		return nil, err
-	}
-	req = req.WithContext(ctx)
-	resp, err := client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	if resp.StatusCode != http.StatusOK {
-		defer resp.Body.Close()
-		return nil, fmt.Errorf("invalid response code %d for service %s in namespace %s", resp.StatusCode, targetName, namespace)
-	}
-	return newStreamWatcher(resp.Body), nil
-}
-
-func getCurrentNamespaceOrDefault() string {
-	ns, err := os.ReadFile(kubernetesNamespaceFile)
-	if err != nil {
-		return defaultNamespace
-	}
-	return string(ns)
-}
diff --git a/vendor/github.com/sercand/kuberesolver/v5/models.go b/vendor/github.com/sercand/kuberesolver/v5/models.go
deleted file mode 100644
index 167e3613e73..00000000000
--- a/vendor/github.com/sercand/kuberesolver/v5/models.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package kuberesolver
-
-type EventType string
-
-const (
-	Added    EventType = "ADDED"
-	Modified EventType = "MODIFIED"
-	Deleted  EventType = "DELETED"
-	Error    EventType = "ERROR"
-)
-
-// Event represents a single event to a watched resource.
-type Event struct {
-	Type   EventType `json:"type"`
-	Object Endpoints `json:"object"`
-}
-
-type Endpoints struct {
-	Kind       string   `json:"kind"`
-	ApiVersion string   `json:"apiVersion"`
-	Metadata   Metadata `json:"metadata"`
-	Subsets    []Subset `json:"subsets"`
-}
-
-type Metadata struct {
-	Name            string            `json:"name"`
-	Namespace       string            `json:"namespace"`
-	ResourceVersion string            `json:"resourceVersion"`
-	Labels          map[string]string `json:"labels"`
-}
-
-type Subset struct {
-	Addresses []Address `json:"addresses"`
-	Ports     []Port    `json:"ports"`
-}
-
-type Address struct {
-	IP        string           `json:"ip"`
-	TargetRef *ObjectReference `json:"targetRef,omitempty"`
-}
-
-type ObjectReference struct {
-	Kind      string `json:"kind"`
-	Name      string `json:"name"`
-	Namespace string `json:"namespace"`
-}
-type Port struct {
-	Name string `json:"name"`
-	Port int    `json:"port"`
-}
diff --git a/vendor/github.com/sercand/kuberesolver/v5/stream.go b/vendor/github.com/sercand/kuberesolver/v5/stream.go
deleted file mode 100644
index 4701aa95a08..00000000000
--- a/vendor/github.com/sercand/kuberesolver/v5/stream.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package kuberesolver
-
-import (
-	"context"
-	"encoding/json"
-	"fmt"
-	"io"
-	"sync"
-
-	"google.golang.org/grpc/grpclog"
-)
-
-// Interface can be implemented by anything that knows how to watch and report changes.
-type watchInterface interface {
-	// Stops watching. Will close the channel returned by ResultChan(). Releases
-	// any resources used by the watch.
-	Stop()
-
-	// Returns a chan which will receive all the events. If an error occurs
-	// or Stop() is called, this channel will be closed, in which case the
-	// watch should be completely cleaned up.
-	ResultChan() <-chan Event
-}
-
-// StreamWatcher turns any stream for which you can write a Decoder interface
-// into a watch.Interface.
-type streamWatcher struct {
-	result  chan Event
-	r       io.ReadCloser
-	decoder *json.Decoder
-	sync.Mutex
-	stopped bool
-}
-
-// NewStreamWatcher creates a StreamWatcher from the given io.ReadClosers.
-func newStreamWatcher(r io.ReadCloser) watchInterface {
-	sw := &streamWatcher{
-		r:       r,
-		decoder: json.NewDecoder(r),
-		result:  make(chan Event),
-	}
-	go sw.receive()
-	return sw
-}
-
-// ResultChan implements Interface.
-func (sw *streamWatcher) ResultChan() <-chan Event {
-	return sw.result
-}
-
-// Stop implements Interface.
-func (sw *streamWatcher) Stop() {
-	sw.Lock()
-	defer sw.Unlock()
-	if !sw.stopped {
-		sw.stopped = true
-		sw.r.Close()
-	}
-}
-
-// stopping returns true if Stop() was called previously.
-func (sw *streamWatcher) stopping() bool {
-	sw.Lock()
-	defer sw.Unlock()
-	return sw.stopped
-}
-
-// receive reads result from the decoder in a loop and sends down the result channel.
-func (sw *streamWatcher) receive() {
-	defer close(sw.result)
-	defer sw.Stop()
-	for {
-		obj, err := sw.Decode()
-		if err != nil {
-			// Ignore expected error.
-			if sw.stopping() {
-				return
-			}
-			switch err {
-			case io.EOF:
-				// watch closed normally
-			case context.Canceled:
-				// canceled normally
-			case io.ErrUnexpectedEOF:
-				grpclog.Infof("kuberesolver: Unexpected EOF during watch stream event decoding: %v", err)
-			default:
-				grpclog.Infof("kuberesolver: Unable to decode an event from the watch stream: %v", err)
-			}
-			return
-		}
-		sw.result <- obj
-	}
-}
-
-// Decode blocks until it can return the next object in the writer. Returns an error
-// if the writer is closed or an object can't be decoded.
-func (sw *streamWatcher) Decode() (Event, error) {
-	var got Event
-	if err := sw.decoder.Decode(&got); err != nil {
-		return Event{}, err
-	}
-	switch got.Type {
-	case Added, Modified, Deleted, Error:
-		return got, nil
-	default:
-		return Event{}, fmt.Errorf("got invalid watch event type: %v", got.Type)
-	}
-}
diff --git a/vendor/github.com/sercand/kuberesolver/v5/util.go b/vendor/github.com/sercand/kuberesolver/v5/util.go
deleted file mode 100644
index dac68ab4224..00000000000
--- a/vendor/github.com/sercand/kuberesolver/v5/util.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package kuberesolver
-
-import (
-	"runtime/debug"
-	"time"
-
-	"google.golang.org/grpc/grpclog"
-)
-
-func until(f func(), initialPeriod, maxPeriod time.Duration, stopCh <-chan struct{}) {
-	select {
-	case <-stopCh:
-		return
-	default:
-	}
-	period := initialPeriod
-	for {
-		func() {
-			defer handleCrash()
-			f()
-		}()
-		select {
-		case <-stopCh:
-			return
-		case <-time.After(period):
-			if period*2 <= maxPeriod {
-				period *= 2
-			} else {
-				period = initialPeriod
-			}
-		}
-	}
-}
-
-// HandleCrash simply catches a crash and logs an error. Meant to be called via defer.
-func handleCrash() {
-	if r := recover(); r != nil {
-		callers := string(debug.Stack())
-		grpclog.Errorf("kuberesolver: recovered from panic: %#v (%v)\n%v", r, r, callers)
-	}
-}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 17c50b58b2a..6db680f92ab 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -366,7 +366,7 @@ github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1
 github.com/cs3org/go-cs3apis/cs3/storage/registry/v1beta1
 github.com/cs3org/go-cs3apis/cs3/tx/v1beta1
 github.com/cs3org/go-cs3apis/cs3/types/v1beta1
-# github.com/cs3org/reva/v2 v2.22.1-0.20240730105121-548644c31544
+# github.com/cs3org/reva/v2 v2.22.0
 ## explicit; go 1.21
 github.com/cs3org/reva/v2/cmd/revad/internal/grace
 github.com/cs3org/reva/v2/cmd/revad/runtime
@@ -963,7 +963,7 @@ github.com/go-micro/plugins/v4/server/http
 # github.com/go-micro/plugins/v4/store/nats-js v1.2.1-0.20231129143103-d72facc652f0
 ## explicit; go 1.21
 github.com/go-micro/plugins/v4/store/nats-js
-# github.com/go-micro/plugins/v4/store/nats-js-kv v0.0.0-20231226212146-94a49ba3e06e => github.com/kobergj/plugins/v4/store/nats-js-kv v0.0.0-20240724102745-4bc93ffd7ab6
+# github.com/go-micro/plugins/v4/store/nats-js-kv v0.0.0-20231226212146-94a49ba3e06e => github.com/kobergj/plugins/v4/store/nats-js-kv v0.0.0-20240723073728-b36ea3314b73
 ## explicit; go 1.21
 github.com/go-micro/plugins/v4/store/nats-js-kv
 # github.com/go-micro/plugins/v4/store/redis v1.2.1
@@ -1785,9 +1785,6 @@ github.com/segmentio/kafka-go/sasl
 # github.com/segmentio/ksuid v1.0.4
 ## explicit; go 1.12
 github.com/segmentio/ksuid
-# github.com/sercand/kuberesolver/v5 v5.1.1
-## explicit; go 1.18
-github.com/sercand/kuberesolver/v5
 # github.com/sergi/go-diff v1.3.1
 ## explicit; go 1.12
 github.com/sergi/go-diff/diffmatchpatch
@@ -2425,4 +2422,4 @@ stash.kopano.io/kgol/rndm
 # github.com/studio-b12/gowebdav => github.com/aduffeck/gowebdav v0.0.0-20231215102054-212d4a4374f6
 # github.com/egirna/icap-client => github.com/fschade/icap-client v0.0.0-20240123094924-5af178158eaf
 # github.com/unrolled/secure => github.com/DeepDiver1975/secure v0.0.0-20240611112133-abc838fb797c
-# github.com/go-micro/plugins/v4/store/nats-js-kv => github.com/kobergj/plugins/v4/store/nats-js-kv v0.0.0-20240724102745-4bc93ffd7ab6
+# github.com/go-micro/plugins/v4/store/nats-js-kv => github.com/kobergj/plugins/v4/store/nats-js-kv v0.0.0-20240723073728-b36ea3314b73


Test patch:
diff --git a/services/graph/pkg/service/v0/graph_suite_test.go b/services/graph/pkg/service/v0/graph_suite_test.go
index 8446bc9b690..70dfcce1450 100644
--- a/services/graph/pkg/service/v0/graph_suite_test.go
+++ b/services/graph/pkg/service/v0/graph_suite_test.go
@@ -12,7 +12,7 @@ import (
 
 func init() {
 	r := registry.GetRegistry(registry.Inmemory())
-	service := registry.BuildGRPCService("com.owncloud.api.gateway", "", "")
+	service := registry.BuildGRPCService("com.owncloud.api.gateway", "", "", "")
 	service.Nodes = []*mRegistry.Node{{
 		Address: "any",
 	}}
diff --git a/services/notifications/pkg/service/notification_suite_test.go b/services/notifications/pkg/service/notification_suite_test.go
index e045e439814..7f282054fb6 100644
--- a/services/notifications/pkg/service/notification_suite_test.go
+++ b/services/notifications/pkg/service/notification_suite_test.go
@@ -12,7 +12,7 @@ import (
 
 func init() {
 	r := registry.GetRegistry(registry.Inmemory())
-	service := registry.BuildGRPCService("com.owncloud.api.gateway", "", "")
+	service := registry.BuildGRPCService("com.owncloud.api.gateway", "", "", "")
 	service.Nodes = []*mRegistry.Node{{
 		Address: "any",
 	}}
diff --git a/services/search/pkg/search/search_suite_test.go b/services/search/pkg/search/search_suite_test.go
index ace85d9294c..9422179fc53 100644
--- a/services/search/pkg/search/search_suite_test.go
+++ b/services/search/pkg/search/search_suite_test.go
@@ -12,7 +12,7 @@ import (
 
 func init() {
 	r := registry.GetRegistry(registry.Inmemory())
-	service := registry.BuildGRPCService("com.owncloud.api.gateway", "", "")
+	service := registry.BuildGRPCService("com.owncloud.api.gateway", "", "", "")
 	service.Nodes = []*mRegistry.Node{{
 		Address: "any",
 	}}
diff --git a/services/storage-users/pkg/task/task_suite_test.go b/services/storage-users/pkg/task/task_suite_test.go
index 38372778085..ac0c8a44b9d 100644
--- a/services/storage-users/pkg/task/task_suite_test.go
+++ b/services/storage-users/pkg/task/task_suite_test.go
@@ -12,7 +12,7 @@ import (
 
 func init() {
 	r := registry.GetRegistry(registry.Inmemory())
-	service := registry.BuildGRPCService("com.owncloud.api.gateway", "", "")
+	service := registry.BuildGRPCService("com.owncloud.api.gateway", "", "", "")
 	service.Nodes = []*mRegistry.Node{{
 		Address: "any",
 	}}
diff --git a/services/userlog/pkg/service/service_suit_test.go b/services/userlog/pkg/service/service_suit_test.go
index d049672b76a..9da9654d4e9 100644
--- a/services/userlog/pkg/service/service_suit_test.go
+++ b/services/userlog/pkg/service/service_suit_test.go
@@ -12,7 +12,7 @@ import (
 
 func init() {
 	r := registry.GetRegistry(registry.Inmemory())
-	service := registry.BuildGRPCService("com.owncloud.api.gateway", "", "")
+	service := registry.BuildGRPCService("com.owncloud.api.gateway", "", "", "")
 	service.Nodes = []*mRegistry.Node{{
 		Address: "any",
 	}}
diff --git a/tests/acceptance/features/apiSharingNgLinkSharePermission/createLinkShare.feature b/tests/acceptance/features/apiSharingNgLinkSharePermission/createLinkShare.feature
index 85f533817d7..9e24619e7ce 100644
--- a/tests/acceptance/features/apiSharingNgLinkSharePermission/createLinkShare.feature
+++ b/tests/acceptance/features/apiSharingNgLinkSharePermission/createLinkShare.feature
@@ -2382,385 +2382,3 @@ Feature: Create a link share for a resource
         }
       }
       """
-
-  @issue-8960
-  Scenario Outline: create an internal link share by a member of a project space drive using root endpoint
-    Given using spaces DAV path
-    And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
-    And user "Alice" has created a space "projectSpace" with the default quota using the Graph API
-    And user "Alice" has uploaded a file inside space "projectSpace" with content "to share" to "textfile.txt"
-    And user "Brian" has been created with default attributes and without skeleton files
-    And user "Alice" has sent the following space share invitation:
-      | space           | projectSpace       |
-      | sharee          | Brian              |
-      | shareType       | user               |
-      | permissionsRole | <permissions-role> |
-    When user "Brian" creates the following space link share using root endpoint of the Graph API:
-      | space           | projectSpace |
-      | permissionsRole | internal     |
-    Then the HTTP status code should be "200"
-    And the JSON data of the response should match
-      """
-      {
-        "type": "object",
-        "required": [
-          "hasPassword",
-          "id",
-          "link"
-        ],
-        "properties": {
-          "hasPassword": {
-            "const": false
-          },
-          "id": {
-            "pattern": "^[a-zA-Z]{15}$"
-          },
-          "link": {
-            "type": "object",
-            "required": [
-              "@libre.graph.displayName",
-              "@libre.graph.quickLink",
-              "preventsDownload",
-              "type",
-              "webUrl"
-            ],
-            "properties": {
-              "@libre.graph.displayName": {
-                "const": ""
-              },
-              "@libre.graph.quickLink": {
-                "const": false
-              },
-              "preventsDownload": {
-                "const": false
-              },
-              "type": {
-                "const": "internal"
-              },
-              "webUrl": {
-                "type": "string",
-                "pattern": "^%base_url%/s/[a-zA-Z]{15}$"
-              }
-            }
-          }
-        }
-      }
-      """
-    Examples:
-      | permissions-role |
-      | Space Viewer     |
-      | Space Editor     |
-      | Manager          |
-
-  @issue-8960
-  Scenario Outline: create an internal link share by a member of a project space drive using permissions endpoint
-    Given using spaces DAV path
-    And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
-    And user "Alice" has created a space "projectSpace" with the default quota using the Graph API
-    And user "Alice" has uploaded a file inside space "projectSpace" with content "to share" to "textfile.txt"
-    And user "Brian" has been created with default attributes and without skeleton files
-    And user "Alice" has sent the following space share invitation:
-      | space           | projectSpace       |
-      | sharee          | Brian              |
-      | shareType       | user               |
-      | permissionsRole | <permissions-role> |
-    When user "Brian" creates the following space link share using permissions endpoint of the Graph API:
-      | space           | projectSpace |
-      | permissionsRole | internal     |
-    Then the HTTP status code should be "200"
-    And the JSON data of the response should match
-      """
-      {
-        "type": "object",
-        "required": [
-          "hasPassword",
-          "id",
-          "link"
-        ],
-        "properties": {
-          "hasPassword": {
-            "const": false
-          },
-          "id": {
-            "pattern": "^[a-zA-Z]{15}$"
-          },
-          "link": {
-            "type": "object",
-            "required": [
-              "@libre.graph.displayName",
-              "@libre.graph.quickLink",
-              "preventsDownload",
-              "type",
-              "webUrl"
-            ],
-            "properties": {
-              "@libre.graph.displayName": {
-                "const": ""
-              },
-              "@libre.graph.quickLink": {
-                "const": false
-              },
-              "preventsDownload": {
-                "const": false
-              },
-              "type": {
-                "const": "internal"
-              },
-              "webUrl": {
-                "type": "string",
-                "pattern": "^%base_url%/s/[a-zA-Z]{15}$"
-              }
-            }
-          }
-        }
-      }
-      """
-    Examples:
-      | permissions-role |
-      | Space Viewer     |
-      | Space Editor     |
-      | Manager          |
-
-  @issue-8960
-  Scenario Outline: create an internal quick link share by a member of a project space drive using root endpoint
-    Given using spaces DAV path
-    And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
-    And user "Alice" has created a space "projectSpace" with the default quota using the Graph API
-    And user "Alice" has uploaded a file inside space "projectSpace" with content "to share" to "textfile.txt"
-    And user "Brian" has been created with default attributes and without skeleton files
-    And user "Alice" has sent the following space share invitation:
-      | space           | projectSpace       |
-      | sharee          | Brian              |
-      | shareType       | user               |
-      | permissionsRole | <permissions-role> |
-      | quickLink       | true               |
-    When user "Brian" creates the following space link share using root endpoint of the Graph API:
-      | space           | projectSpace |
-      | permissionsRole | internal     |
-      | quickLink       | true         |
-    Then the HTTP status code should be "200"
-    And the JSON data of the response should match
-      """
-      {
-        "type": "object",
-        "required": [
-          "hasPassword",
-          "id",
-          "link"
-        ],
-        "properties": {
-          "hasPassword": {
-            "const": false
-          },
-          "id": {
-            "pattern": "^[a-zA-Z]{15}$"
-          },
-          "link": {
-            "type": "object",
-            "required": [
-              "@libre.graph.displayName",
-              "@libre.graph.quickLink",
-              "preventsDownload",
-              "type",
-              "webUrl"
-            ],
-            "properties": {
-              "@libre.graph.displayName": {
-                "const": ""
-              },
-              "@libre.graph.quickLink": {
-                "const": true
-              },
-              "preventsDownload": {
-                "const": false
-              },
-              "type": {
-                "const": "internal"
-              },
-              "webUrl": {
-                "type": "string",
-                "pattern": "^%base_url%/s/[a-zA-Z]{15}$"
-              }
-            }
-          }
-        }
-      }
-      """
-    Examples:
-      | permissions-role |
-      | Space Viewer     |
-      | Space Editor     |
-      | Manager          |
-
-  @issue-8960
-  Scenario Outline: create an internal quick link share by a member of a project space drive using permissions endpoint
-    Given using spaces DAV path
-    And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
-    And user "Alice" has created a space "projectSpace" with the default quota using the Graph API
-    And user "Alice" has uploaded a file inside space "projectSpace" with content "to share" to "textfile.txt"
-    And user "Brian" has been created with default attributes and without skeleton files
-    And user "Alice" has sent the following space share invitation:
-      | space           | projectSpace       |
-      | sharee          | Brian              |
-      | shareType       | user               |
-      | permissionsRole | <permissions-role> |
-      | quickLink       | true               |
-    When user "Brian" creates the following space link share using permissions endpoint of the Graph API:
-      | space           | projectSpace |
-      | permissionsRole | internal     |
-      | quickLink       | true         |
-    Then the HTTP status code should be "200"
-    And the JSON data of the response should match
-      """
-      {
-        "type": "object",
-        "required": [
-          "hasPassword",
-          "id",
-          "link"
-        ],
-        "properties": {
-          "hasPassword": {
-            "const": false
-          },
-          "id": {
-            "pattern": "^[a-zA-Z]{15}$"
-          },
-          "link": {
-            "type": "object",
-            "required": [
-              "@libre.graph.displayName",
-              "@libre.graph.quickLink",
-              "preventsDownload",
-              "type",
-              "webUrl"
-            ],
-            "properties": {
-              "@libre.graph.displayName": {
-                "const": ""
-              },
-              "@libre.graph.quickLink": {
-                "const": true
-              },
-              "preventsDownload": {
-                "const": false
-              },
-              "type": {
-                "const": "internal"
-              },
-              "webUrl": {
-                "type": "string",
-                "pattern": "^%base_url%/s/[a-zA-Z]{15}$"
-              }
-            }
-          }
-        }
-      }
-      """
-    Examples:
-      | permissions-role |
-      | Space Viewer     |
-      | Space Editor     |
-      | Manager          |
-
-  @issue-8960
-  Scenario Outline: try to create an internal link share by a member of a project space drive with password using root endpoint
-    Given using spaces DAV path
-    And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
-    And user "Alice" has created a space "projectSpace" with the default quota using the Graph API
-    And user "Alice" has uploaded a file inside space "projectSpace" with content "to share" to "textfile.txt"
-    And user "Brian" has been created with default attributes and without skeleton files
-    And user "Alice" has sent the following space share invitation:
-      | space           | projectSpace       |
-      | sharee          | Brian              |
-      | shareType       | user               |
-      | permissionsRole | <permissions-role> |
-    When user "Brian" creates the following space link share using root endpoint of the Graph API:
-      | space           | projectSpace |
-      | permissionsRole | internal     |
-      | quickLink       | true         |
-      | password        | %public%     |
-    Then the HTTP status code should be "400"
-    And the JSON data of the response should match
-      """
-      {
-        "type": "object",
-        "required": [
-          "error"
-        ],
-        "properties": {
-          "error": {
-            "type": "object",
-            "required": [
-              "code",
-              "message"
-            ],
-            "properties": {
-              "code": {
-                "type": "string",
-                "pattern": "invalidRequest"
-              },
-              "message": {
-                "const": "password is redundant for the internal link"
-              }
-            }
-          }
-        }
-      }
-      """
-    Examples:
-      | permissions-role |
-      | Space Viewer     |
-      | Space Editor     |
-      | Manager          |
-
-  @issue-8960
-  Scenario Outline: try to create an internal link share by a member of a project space drive with password using permissions endpoint
-    Given using spaces DAV path
-    And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
-    And user "Alice" has created a space "projectSpace" with the default quota using the Graph API
-    And user "Alice" has uploaded a file inside space "projectSpace" with content "to share" to "textfile.txt"
-    And user "Brian" has been created with default attributes and without skeleton files
-    And user "Alice" has sent the following space share invitation:
-      | space           | projectSpace       |
-      | sharee          | Brian              |
-      | shareType       | user               |
-      | permissionsRole | <permissions-role> |
-    When user "Brian" creates the following space link share using permissions endpoint of the Graph API:
-      | space           | projectSpace |
-      | permissionsRole | internal     |
-      | quickLink       | true         |
-      | password        | %public%     |
-    Then the HTTP status code should be "400"
-    And the JSON data of the response should match
-      """
-      {
-        "type": "object",
-        "required": [
-          "error"
-        ],
-        "properties": {
-          "error": {
-            "type": "object",
-            "required": [
-              "code",
-              "message"
-            ],
-            "properties": {
-              "code": {
-                "type": "string",
-                "pattern": "invalidRequest"
-              },
-              "message": {
-                "const": "password is redundant for the internal link"
-              }
-            }
-          }
-        }
-      }
-      """
-    Examples:
-      | permissions-role |
-      | Space Viewer     |
-      | Space Editor     |
-      | Manager          |
\ No newline at end of file