Repository: owncloud/ocis
Pull request #2465 (2021-09-02 12:01:59)

Set english as default language
<!--
Thanks for submitting a change to ownCloud!

This is the bug tracker for the oCIS component. Find other components at https://github.com/owncloud/core/blob/master/.github/CONTRIBUTING.md#guidelines

For fixing potential security issues please see https://owncloud.org/security/

To make it possible for us to get your change reviewed and merged please carefully fill out the requested information below.

Please note that any kind of change needs first be submitted to the master branch which holds the next version of oCIS.

Please set the following labels:

- Set label "Status:Needs-Review" for review or "Status:In-Progress" if the PR still has open tasks.
- Assignment: assign to self
- Reviewers: pick at least one
-->

## Description
Show English as default language in the settings

## Related Issue
https://github.com/owncloud/ocis/issues/2126

## Motivation and Context
<!--- Why is this change required? What problem does it solve? -->

## How Has This Been Tested?
Manually tested in a fresh environment

1. Login with a user
2. Check the settings page

English is selected a language

## Screenshots (if appropriate):

## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
- [ ] Technical debt
- [ ] Tests only (no source changes)

## Checklist:
<!-- Tick the checkboxes when done. -->
<!-- Raise documentation ticket in owncloud.github.io/ -->
- [x] Code changes
- [ ] Unit tests added
- [ ] Acceptance tests added
- [ ] Documentation ticket raised: <link> 



Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e83957daa27..359f6857227 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@ The following sections list the changes for unreleased.
 ## Summary
 
 * Change - Remove OnlyOffice extension: [#2433](https://github.com/owncloud/ocis/pull/2433)
+* Enhancement - Add app provider and app provider registry: [#2204](https://github.com/owncloud/ocis/pull/2204)
 * Enhancement - Add the create space permission: [#2461](https://github.com/owncloud/ocis/pull/2461)
 * Enhancement - Add set space quota permission: [#2459](https://github.com/owncloud/ocis/pull/2459)
 * Enhancement - Update go-chi/chi to version 5.0.3: [#2429](https://github.com/owncloud/ocis/pull/2429)
@@ -25,6 +26,14 @@ The following sections list the changes for unreleased.
 
    https://github.com/owncloud/ocis/pull/2433
 
+* Enhancement - Add app provider and app provider registry: [#2204](https://github.com/owncloud/ocis/pull/2204)
+
+   We added the app provider and app provider registry. Now the CS3org WOPI server can be
+   registered and OpenInApp requests can be done.
+
+   https://github.com/owncloud/ocis/pull/2204
+   https://github.com/cs3org/reva/pull/1785
+
 * Enhancement - Add the create space permission: [#2461](https://github.com/owncloud/ocis/pull/2461)
 
    In preparation for the upcoming spaces features a `Create Space` permission was added.
diff --git a/accounts/pkg/tracing/tracing.go b/accounts/pkg/tracing/tracing.go
index 2a8263a85e0..4da38009fe9 100644
--- a/accounts/pkg/tracing/tracing.go
+++ b/accounts/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "accounts"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "accounts", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil
diff --git a/changelog/unreleased/app-provider.md b/changelog/unreleased/app-provider.md
new file mode 100644
index 00000000000..df68eb76973
--- /dev/null
+++ b/changelog/unreleased/app-provider.md
@@ -0,0 +1,6 @@
+Enhancement: Add app provider and app provider registry
+
+We added the app provider and app provider registry. Now the CS3org WOPI server can be registered and OpenInApp requests can be done.
+
+https://github.com/owncloud/ocis/pull/2204
+https://github.com/cs3org/reva/pull/1785
diff --git a/changelog/unreleased/set-english-default-dropdown.md b/changelog/unreleased/set-english-default-dropdown.md
new file mode 100644
index 00000000000..d2dadd412ea
--- /dev/null
+++ b/changelog/unreleased/set-english-default-dropdown.md
@@ -0,0 +1,5 @@
+Bugfix: Set English as default language in the dropdown in the settings page
+
+The language dropdown didn't have a default language selected, and it was showing an empty value. Now it shows English instead.
+
+https://github.com/owncloud/ocis/pull/2465
diff --git a/deployments/examples/ocis_wopi/config/ocis/proxy-config.json b/deployments/examples/ocis_wopi/config/ocis/proxy-config.json
index bccf196997c..59b0fa28b34 100644
--- a/deployments/examples/ocis_wopi/config/ocis/proxy-config.json
+++ b/deployments/examples/ocis_wopi/config/ocis/proxy-config.json
@@ -32,6 +32,10 @@
           "endpoint": "/ocs/v[12].php/cloud/(users?|groups)",
           "backend": "http://localhost:9110"
         },
+        {
+          "endpoint": "/app/",
+          "backend": "http://localhost:9140"
+        },
         {
           "endpoint": "/ocs/",
           "backend": "http://localhost:9140"
diff --git a/deployments/examples/ocis_wopi/docker-compose.yml b/deployments/examples/ocis_wopi/docker-compose.yml
index b595ce9c28b..a0f5488b4eb 100644
--- a/deployments/examples/ocis_wopi/docker-compose.yml
+++ b/deployments/examples/ocis_wopi/docker-compose.yml
@@ -66,6 +66,13 @@ services:
       WEB_UI_CONFIG: "/var/tmp/ocis/.config/web-config.json"
       # proxy
       PROXY_CONFIG_FILE: "/var/tmp/ocis/.config/proxy-config.json"
+      # app provider
+      APP_PROVIDER_DRIVER: wopi
+      APP_PROVIDER_WOPI_DRIVER_APP_NAME: Collabora
+      APP_PROVIDER_WOPI_DRIVER_APP_URL: https://${COLLABORA_DOMAIN:-collabora.owncloud.test}
+      APP_PROVIDER_WOPI_DRIVER_INSECURE: "${INSECURE:-false}"
+      APP_PROVIDER_WOPI_DRIVER_IOP_SECRET: ${WOPI_IOP_SECRET:-LoremIpsum123}
+      APP_PROVIDER_WOPI_DRIVER_WOPI_URL: https://${WOPISERVER_DOMAIN:-wopiserver.owncloud.test}
     volumes:
       - ./config/ocis/entrypoint-override.sh:/entrypoint-override.sh
       - ./config/ocis/web-config.dist.json:/config/web-config.dist.json
@@ -90,9 +97,6 @@ services:
       OCIS_LOG_LEVEL: ${OCIS_LOG_LEVEL:-error} # make oCIS less verbose
       WOPISERVER_REVA_GATEWAY_ADDR: ocis:9142
       OCIS_JWT_SECRET: ${OCIS_JWT_SECRET:-Pive-Fumkiu4}
-      WOPISERVER_WOPI_SERVER_HOST: https://${WOPISERVER_DOMAIN:-wopiserver.owncloud.test}
-      WOPISERVER_WOPI_SERVER_IOP_SECRET: ${WOPI_IOP_SECRET:-LoremIpsum123}
-      WOPISERVER_WOPI_SERVER_INSECURE: "${INSECURE:-false}"
     logging:
       driver: "local"
     restart: always
diff --git a/docs/extensions/storage/ports.md b/docs/extensions/storage/ports.md
index 83ef871b860..2ab34f5dd92 100644
--- a/docs/extensions/storage/ports.md
+++ b/docs/extensions/storage/ports.md
@@ -34,6 +34,8 @@ For now, the storage service uses these ports to preconfigure those services:
 | 9159      | storage users debug                           |
 | 9160      | groups                                        |
 | 9161      | groups debug                                  |
+| 9164      | storage appprovider                                   |
+| 9165      | storage appprovider debug                             |
 | 9178      | storage public link                           |
 | 9179      | storage public link data                      |
 | 9215      | storage meta grpc                             |
diff --git a/glauth/pkg/tracing/tracing.go b/glauth/pkg/tracing/tracing.go
index 1ea50a2d6de..a02161687bf 100644
--- a/glauth/pkg/tracing/tracing.go
+++ b/glauth/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "glauth"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "glauth", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil
diff --git a/go.mod b/go.mod
index b688407f824..f96e0f1088b 100644
--- a/go.mod
+++ b/go.mod
@@ -3,6 +3,7 @@ module github.com/owncloud/ocis
 go 1.16
 
 require (
+	contrib.go.opencensus.io/exporter/jaeger v0.2.1 // indirect
 	github.com/CiscoM31/godata v1.0.4
 	github.com/GeertJohan/yubigo v0.0.0-20190917122436-175bc097e60e
 	github.com/asim/go-micro/plugins/client/grpc/v3 v3.0.0-20210812172626-c7195aae9817
@@ -19,12 +20,13 @@ require (
 	github.com/asim/go-micro/v3 v3.6.0
 	github.com/blevesearch/bleve/v2 v2.1.0
 	github.com/coreos/go-oidc/v3 v3.0.0
-	github.com/cs3org/go-cs3apis v0.0.0-20210802070913-970eec344e59
-	github.com/cs3org/reva v1.12.0
+	github.com/cs3org/go-cs3apis v0.0.0-20210812121411-f18cf19614e8
+	github.com/cs3org/reva v1.12.1-0.20210903075054-73f10ed5ab21
 	github.com/disintegration/imaging v1.6.2
 	github.com/glauth/glauth v1.1.3-0.20210729125545-b9aecdfcac31
 	github.com/go-chi/chi/v5 v5.0.3
 	github.com/go-chi/render v1.0.1
+	github.com/go-kit/kit v0.10.0 // indirect
 	github.com/go-logr/logr v0.4.0
 	github.com/go-ozzo/ozzo-validation/v4 v4.3.0
 	github.com/gofrs/uuid v4.0.0+incompatible
@@ -34,6 +36,7 @@ require (
 	github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect
 	github.com/gorilla/mux v1.8.0
 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.5.0
+	github.com/hashicorp/golang-lru v0.5.4 // indirect
 	github.com/iancoleman/strcase v0.2.0
 	github.com/justinas/alice v1.2.0
 	github.com/libregraph/lico v0.34.1-0.20210803054646-b584e0372224
@@ -60,6 +63,7 @@ require (
 	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.22.0
 	go.opentelemetry.io/otel v1.0.0-RC2
 	go.opentelemetry.io/otel/exporters/jaeger v1.0.0-RC2
+	go.opentelemetry.io/otel/metric v0.20.0 // indirect
 	go.opentelemetry.io/otel/sdk v1.0.0-RC2
 	go.opentelemetry.io/otel/trace v1.0.0-RC2
 	golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
diff --git a/go.sum b/go.sum
index 8cddf2227e4..bf987436cb9 100644
--- a/go.sum
+++ b/go.sum
@@ -45,6 +45,8 @@ contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXV
 contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA=
 contrib.go.opencensus.io/exporter/prometheus v0.3.0 h1:08FMdJYpItzsknogU6PiiNo7XQZg/25GjH236+YCwD0=
 contrib.go.opencensus.io/exporter/prometheus v0.3.0/go.mod h1:rpCPVQKhiyH8oomWgm34ZmgIdZa8OVYO5WAIygPbBBE=
+contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs=
+contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 github.com/Azure/azure-sdk-for-go v32.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
 github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
@@ -309,8 +311,14 @@ github.com/crewjam/saml v0.4.5/go.mod h1:qCJQpUtZte9R1ZjUBcW8qtCNlinbO363ooNl02S
 github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4=
 github.com/cs3org/go-cs3apis v0.0.0-20210802070913-970eec344e59 h1:cj9HxIbmbGn+HPpFP8nZ8oaNUsoFa0+cheCO8FUNoMc=
 github.com/cs3org/go-cs3apis v0.0.0-20210802070913-970eec344e59/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY=
+github.com/cs3org/go-cs3apis v0.0.0-20210812121411-f18cf19614e8 h1:bqUkE0l5wD62TKH6HkbSVYwyYzZ0PIeak/hnW7ggUdU=
+github.com/cs3org/go-cs3apis v0.0.0-20210812121411-f18cf19614e8/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY=
 github.com/cs3org/reva v1.12.0 h1:31Z+9+rLXUHRP3K6U3LK2wWLJUuicFjeFc2iZGg7rWE=
 github.com/cs3org/reva v1.12.0/go.mod h1:Fx2PHTX2Y3s/aNG/APpCbmttg5STWnxjD4DpnqdwjQc=
+github.com/cs3org/reva v1.12.1-0.20210903075054-73f10ed5ab21 h1:noPCV/0p9EkjpNUQs1K+/U3f+twBefGJSRaPunhI2TA=
+github.com/cs3org/reva v1.12.1-0.20210903075054-73f10ed5ab21/go.mod h1:5dEcJZiu8FoxUYR+apy7lkBl5AGiXWwqBzmm/6zCRuE=
+github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8 h1:Z9lwXumT5ACSmJ7WGnFl+OMLLjpz5uR2fyz7dC255FI=
+github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8/go.mod h1:4abs/jPXcmJzYoYGF91JF9Uq9s/KL5n1jvFDix8KcqY=
 github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -423,12 +431,14 @@ github.com/go-ini/ini v1.44.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3I
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
+github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ=
 github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
 github.com/go-ldap/ldap/v3 v3.1.7/go.mod h1:5Zun81jBTabRaI8lzN7E1JjyEl1g6zI6u9pd8luAK4Q=
 github.com/go-ldap/ldap/v3 v3.3.0 h1:lwx+SJpgOHd8tG6SumBQZXCmNX51zM8B1cfxJ5gv4tQ=
 github.com/go-ldap/ldap/v3 v3.3.0/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4=
 github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
 github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc=
 github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
@@ -505,6 +515,8 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er
 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
@@ -812,6 +824,8 @@ github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7
 github.com/miekg/dns v1.1.40/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
 github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg=
 github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
+github.com/mileusna/useragent v1.0.2 h1:DgVKtiPnjxlb73z9bCwgdUvU2nQNQ97uhgfO8l9uz/w=
+github.com/mileusna/useragent v1.0.2/go.mod h1:3d8TOmwL/5I8pJjyVDteHtgDGcefrFUX4ccGOMKNYYc=
 github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4=
 github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw=
 github.com/minio/minio-go/v7 v7.0.12 h1:/4pxUdwn9w0QEryNkrrWaodIESPRX+NxpO0Q6hVdaAA=
@@ -1004,6 +1018,8 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8
 github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
 github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=
 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.28.0 h1:vGVfV9KrDTvWt5boZO0I19g2E3CsWfpPPKZM9dt3mEw=
+github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
 github.com/prometheus/procfs v0.0.0-20170703101242-e645f4e5aaa8/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
@@ -1020,6 +1036,8 @@ github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3x
 github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 github.com/prometheus/statsd_exporter v0.20.0 h1:M0hQphnq2WyWKS5CefQL8PqWwBOBPhiAkyLo5l4ZYvE=
 github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZYu22bS84XM89ZQXXTWmQ=
+github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8=
+github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2/go.mod h1:7tZKcyumwBO6qip7RNQ5r77yrssm9bfCowcLEBcU5IA=
 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
@@ -1386,6 +1404,7 @@ golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5o
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
 golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
 golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1400,6 +1419,7 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ
 golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1 h1:x622Z2o4hgCr/4CiKWc51jHVKaWdtVpBNmEI8wI9Qns=
 golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
diff --git a/graph-explorer/pkg/tracing/tracing.go b/graph-explorer/pkg/tracing/tracing.go
index d76a0c3e820..b7fe7a3f631 100644
--- a/graph-explorer/pkg/tracing/tracing.go
+++ b/graph-explorer/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "graph-explorer"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "graph-explorer", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil
diff --git a/graph/pkg/tracing/tracing.go b/graph/pkg/tracing/tracing.go
index e0ee16cefd8..5e67b08eb4c 100644
--- a/graph/pkg/tracing/tracing.go
+++ b/graph/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "graph"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "graph", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil
diff --git a/idp/pkg/tracing/tracing.go b/idp/pkg/tracing/tracing.go
index 4426d67625b..eb116d6ce35 100644
--- a/idp/pkg/tracing/tracing.go
+++ b/idp/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "idp"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "idp", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil
diff --git a/ocis-pkg/tracing/tracing.go b/ocis-pkg/tracing/tracing.go
index 4ca4c8581f1..f12664b9dd4 100644
--- a/ocis-pkg/tracing/tracing.go
+++ b/ocis-pkg/tracing/tracing.go
@@ -2,6 +2,8 @@ package tracing
 
 import (
 	"fmt"
+	"net/url"
+	"strings"
 
 	"go.opentelemetry.io/otel/exporters/jaeger"
 	"go.opentelemetry.io/otel/propagation"
@@ -17,18 +19,36 @@ var Propagator = propagation.NewCompositeTextMapPropagator(
 )
 
 // GetTraceProvider returns a configured open-telemetry trace provider.
-func GetTraceProvider(collectorEndpoint, traceType, serviceName string) (*sdktrace.TracerProvider, error) {
+func GetTraceProvider(agentEndpoint, collectorEndpoint, serviceName, traceType string) (*sdktrace.TracerProvider, error) {
 	switch t := traceType; t {
 	case "jaeger":
-		if collectorEndpoint == "" {
-			return sdktrace.NewTracerProvider(), nil
-		}
-
-		exp, err := jaeger.New(
-			jaeger.WithCollectorEndpoint(
-				jaeger.WithEndpoint(collectorEndpoint),
-			),
+		var (
+			exp *jaeger.Exporter
+			err error
 		)
+
+		if agentEndpoint != "" {
+			var agentHost string
+			var agentPort string
+
+			agentHost, agentPort, err = parseAgentConfig(agentEndpoint)
+			if err != nil {
+				return nil, err
+			}
+
+			exp, err = jaeger.New(
+				jaeger.WithAgentEndpoint(
+					jaeger.WithAgentHost(agentHost),
+					jaeger.WithAgentPort(agentPort),
+				),
+			)
+		} else if collectorEndpoint != "" {
+			exp, err = jaeger.New(
+				jaeger.WithCollectorEndpoint(
+					jaeger.WithEndpoint(collectorEndpoint),
+				),
+			)
+		}
 		if err != nil {
 			return nil, err
 		}
@@ -49,3 +69,27 @@ func GetTraceProvider(collectorEndpoint, traceType, serviceName string) (*sdktra
 		return nil, fmt.Errorf("invalid trace configuration")
 	}
 }
+
+func parseAgentConfig(ae string) (string, string, error) {
+	u, err := url.Parse(ae)
+	// as per url.go:
+	// [...] Trying to parse a hostname and path
+	// without a scheme is invalid but may not necessarily return an
+	// error, due to parsing ambiguities.
+	if err == nil && u.Hostname() != "" && u.Port() != "" {
+		return u.Hostname(), u.Port(), nil
+	}
+
+	p := strings.Split(ae, ":")
+	if len(p) != 2 {
+		return "", "", fmt.Errorf(fmt.Sprintf("invalid agent endpoint `%s`. expected format: `hostname:port`", ae))
+	}
+
+	switch {
+	case p[0] == "" && p[1] == "": // case ae = ":"
+		return "", "", fmt.Errorf(fmt.Sprintf("invalid agent endpoint `%s`. expected format: `hostname:port`", ae))
+	case p[0] == "":
+		return "", "", fmt.Errorf(fmt.Sprintf("invalid agent endpoint `%s`. expected format: `hostname:port`", ae))
+	}
+	return p[0], p[1], nil
+}
diff --git a/ocis/pkg/command/storageappprovider.go b/ocis/pkg/command/storageappprovider.go
new file mode 100644
index 00000000000..883069ab747
--- /dev/null
+++ b/ocis/pkg/command/storageappprovider.go
@@ -0,0 +1,45 @@
+// +build !simple
+
+package command
+
+import (
+	"github.com/micro/cli/v2"
+	"github.com/owncloud/ocis/ocis-pkg/config"
+	"github.com/owncloud/ocis/ocis/pkg/register"
+	"github.com/owncloud/ocis/storage/pkg/command"
+	svcconfig "github.com/owncloud/ocis/storage/pkg/config"
+	"github.com/owncloud/ocis/storage/pkg/flagset"
+)
+
+// StorageAppProviderCommand is the entrypoint for the reva-app-provider command.
+func StorageAppProviderCommand(cfg *config.Config) *cli.Command {
+	return &cli.Command{
+		Name:     "storage-app-provider",
+		Usage:    "Start storage app-provider service",
+		Category: "Extensions",
+		Flags:    flagset.AppProviderWithConfig(cfg.Storage),
+		Action: func(c *cli.Context) error {
+			origCmd := command.AppProvider(configureStorageAppProvider(cfg))
+			return handleOriginalAction(c, origCmd)
+		},
+	}
+}
+
+func configureStorageAppProvider(cfg *config.Config) *svcconfig.Config {
+	cfg.Storage.Log.Level = cfg.Log.Level
+	cfg.Storage.Log.Pretty = cfg.Log.Pretty
+	cfg.Storage.Log.Color = cfg.Log.Color
+
+	if cfg.Tracing.Enabled {
+		cfg.Storage.Tracing.Enabled = cfg.Tracing.Enabled
+		cfg.Storage.Tracing.Type = cfg.Tracing.Type
+		cfg.Storage.Tracing.Endpoint = cfg.Tracing.Endpoint
+		cfg.Storage.Tracing.Collector = cfg.Tracing.Collector
+	}
+
+	return cfg.Storage
+}
+
+func init() {
+	register.AddCommand(StorageAppProviderCommand)
+}
diff --git a/ocis/pkg/runtime/service/service.go b/ocis/pkg/runtime/service/service.go
index ab4229f65f2..6ff29a15869 100644
--- a/ocis/pkg/runtime/service/service.go
+++ b/ocis/pkg/runtime/service/service.go
@@ -108,6 +108,7 @@ func NewService(options ...Option) (*Service, error) {
 	s.ServicesRegistry["storage-home"] = storage.NewStorageHome
 	s.ServicesRegistry["storage-users"] = storage.NewStorageUsers
 	s.ServicesRegistry["storage-public-link"] = storage.NewStoragePublicLink
+	s.ServicesRegistry["storage-appprovider"] = storage.NewAppProvider
 
 	// populate delayed services
 	s.Delayed["storage-sharing"] = storage.NewSharing
diff --git a/ocs/pkg/tracing/tracing.go b/ocs/pkg/tracing/tracing.go
index e8c6f101e86..d79ef622fe0 100644
--- a/ocs/pkg/tracing/tracing.go
+++ b/ocs/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "ocs"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "ocs", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil
diff --git a/proxy/pkg/proxy/proxy.go b/proxy/pkg/proxy/proxy.go
index b066e963115..0bd61b76154 100644
--- a/proxy/pkg/proxy/proxy.go
+++ b/proxy/pkg/proxy/proxy.go
@@ -295,6 +295,10 @@ func defaultPolicies() []config.Policy {
 					Endpoint: "/ocs/v[12].php/cloud/(users?|groups)", // we have `user`, `users` and `groups` in ocis-ocs
 					Backend:  "http://localhost:9110",
 				},
+				{
+					Endpoint: "/app/",
+					Backend:  "http://localhost:9140",
+				},
 				{
 					Endpoint: "/ocs/",
 					Backend:  "http://localhost:9140",
diff --git a/proxy/pkg/tracing/tracing.go b/proxy/pkg/tracing/tracing.go
index ffe29a220ec..e3b3aa50c03 100644
--- a/proxy/pkg/tracing/tracing.go
+++ b/proxy/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "proxy"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "proxy", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil
diff --git a/settings/pkg/service/v0/settings.go b/settings/pkg/service/v0/settings.go
index f858395f67f..b96819f000f 100644
--- a/settings/pkg/service/v0/settings.go
+++ b/settings/pkg/service/v0/settings.go
@@ -128,6 +128,7 @@ var languageSetting = settings.Setting_SingleChoiceValue{
 					},
 				},
 				DisplayValue: "English",
+				Default:      true,
 			},
 			{
 				Value: &settings.ListOptionValue{
diff --git a/settings/pkg/tracing/tracing.go b/settings/pkg/tracing/tracing.go
index 678ee7f55f6..09d85008bdb 100644
--- a/settings/pkg/tracing/tracing.go
+++ b/settings/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "settings"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "settings", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil
diff --git a/storage/pkg/command/appprovider.go b/storage/pkg/command/appprovider.go
new file mode 100644
index 00000000000..b45e4a39f4d
--- /dev/null
+++ b/storage/pkg/command/appprovider.go
@@ -0,0 +1,160 @@
+package command
+
+import (
+	"context"
+	"flag"
+	"os"
+	"path"
+
+	"github.com/cs3org/reva/cmd/revad/runtime"
+	"github.com/gofrs/uuid"
+	"github.com/micro/cli/v2"
+	"github.com/oklog/run"
+	ociscfg "github.com/owncloud/ocis/ocis-pkg/config"
+	"github.com/owncloud/ocis/ocis-pkg/sync"
+	"github.com/owncloud/ocis/storage/pkg/config"
+	"github.com/owncloud/ocis/storage/pkg/flagset"
+	"github.com/owncloud/ocis/storage/pkg/server/debug"
+	"github.com/owncloud/ocis/storage/pkg/tracing"
+	"github.com/thejerf/suture/v4"
+)
+
+// AppProvider is the entrypoint for the app provider command.
+func AppProvider(cfg *config.Config) *cli.Command {
+	return &cli.Command{
+		Name:  "app-provider",
+		Usage: "Start appprovider for providing apps",
+		Flags: flagset.AppProviderWithConfig(cfg),
+		Before: func(c *cli.Context) error {
+			cfg.Reva.AppProvider.Services = c.StringSlice("service")
+
+			return nil
+		},
+		Action: func(c *cli.Context) error {
+			logger := NewLogger(cfg)
+			tracing.Configure(cfg, logger)
+			gr := run.Group{}
+			ctx, cancel := context.WithCancel(context.Background())
+			defer cancel()
+
+			uuid := uuid.Must(uuid.NewV4())
+			pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid")
+
+			rcfg := appProviderConfigFromStruct(c, cfg)
+
+			gr.Add(func() error {
+				runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger))
+				return nil
+			}, func(_ error) {
+				logger.Info().
+					Str("server", c.Command.Name).
+					Msg("Shutting down server")
+
+				cancel()
+			})
+
+			debugServer, err := debug.Server(
+				debug.Name(c.Command.Name+"-debug"),
+				debug.Addr(cfg.Reva.AppProvider.DebugAddr),
+				debug.Logger(logger),
+				debug.Context(ctx),
+				debug.Config(cfg),
+			)
+
+			if err != nil {
+				logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server")
+				return err
+			}
+
+			gr.Add(debugServer.ListenAndServe, func(_ error) {
+				cancel()
+			})
+
+			if !cfg.Reva.AppProvider.Supervised {
+				sync.Trap(&gr, cancel)
+			}
+
+			return gr.Run()
+		},
+	}
+}
+
+// appProviderConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service.
+func appProviderConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} {
+
+	rcfg := map[string]interface{}{
+		"core": map[string]interface{}{
+			"max_cpus":             cfg.Reva.AppProvider.MaxCPUs,
+			"tracing_enabled":      cfg.Tracing.Enabled,
+			"tracing_endpoint":     cfg.Tracing.Endpoint,
+			"tracing_collector":    cfg.Tracing.Collector,
+			"tracing_service_name": c.Command.Name,
+		},
+		"shared": map[string]interface{}{
+			"jwt_secret": cfg.Reva.JWTSecret,
+		},
+		"grpc": map[string]interface{}{
+			"network": cfg.Reva.AppProvider.GRPCNetwork,
+			"address": cfg.Reva.AppProvider.GRPCAddr,
+			// TODO build services dynamically
+			"services": map[string]interface{}{
+				"appprovider": map[string]interface{}{
+					"gatewaysvc":       cfg.Reva.Gateway.Endpoint,
+					"app_provider_url": cfg.Reva.AppProvider.ExternalAddr,
+					"driver":           cfg.Reva.AppProvider.Driver,
+					"drivers": map[string]interface{}{
+						"wopi": map[string]interface{}{
+							"app_api_key":          cfg.Reva.AppProvider.WopiDriver.AppAPIKey,
+							"app_desktop_only":     cfg.Reva.AppProvider.WopiDriver.AppDesktopOnly,
+							"app_icon_uri":         cfg.Reva.AppProvider.WopiDriver.AppIconURI,
+							"app_int_url":          cfg.Reva.AppProvider.WopiDriver.AppInternalURL,
+							"app_name":             cfg.Reva.AppProvider.WopiDriver.AppName,
+							"app_url":              cfg.Reva.AppProvider.WopiDriver.AppURL,
+							"insecure_connections": cfg.Reva.AppProvider.WopiDriver.Insecure,
+							"iop_secret":           cfg.Reva.AppProvider.WopiDriver.IopSecret,
+							"jwt_secret":           cfg.Reva.AppProvider.WopiDriver.JWTSecret,
+							"wopi_url":             cfg.Reva.AppProvider.WopiDriver.WopiURL,
+						},
+					},
+				},
+			},
+		},
+	}
+	return rcfg
+}
+
+// AppProviderSutureService allows for the app-provider command to be embedded and supervised by a suture supervisor tree.
+type AppProviderSutureService struct {
+	cfg *config.Config
+}
+
+// NewAppProvider creates a new store.AppProviderSutureService
+func NewAppProvider(cfg *ociscfg.Config) suture.Service {
+	if cfg.Mode == 0 {
+		cfg.Storage.Reva.AppProvider.Supervised = true
+	}
+	return AppProviderSutureService{
+		cfg: cfg.Storage,
+	}
+}
+
+func (s AppProviderSutureService) Serve(ctx context.Context) error {
+	s.cfg.Reva.AppProvider.Context = ctx
+	f := &flag.FlagSet{}
+	for k := range AppProvider(s.cfg).Flags {
+		if err := AppProvider(s.cfg).Flags[k].Apply(f); err != nil {
+			return err
+		}
+	}
+	cliCtx := cli.NewContext(nil, f, nil)
+	if AppProvider(s.cfg).Before != nil {
+		if err := AppProvider(s.cfg).Before(cliCtx); err != nil {
+			return err
+		}
+	}
+	if err := AppProvider(s.cfg).Action(cliCtx); err != nil {
+		return err
+	}
+
+	return nil
+}
diff --git a/storage/pkg/command/frontend.go b/storage/pkg/command/frontend.go
index 32a2904d203..ef686698b8f 100644
--- a/storage/pkg/command/frontend.go
+++ b/storage/pkg/command/frontend.go
@@ -141,6 +141,12 @@ func frontendConfigFromStruct(c *cli.Context, cfg *config.Config, filesCfg map[s
 			},
 			// TODO build services dynamically
 			"services": map[string]interface{}{
+				"appprovider": map[string]interface{}{
+					"prefix":                 cfg.Reva.Frontend.AppProviderPrefix,
+					"transfer_shared_secret": cfg.Reva.TransferSecret,
+					"timeout":                86400,
+					"insecure":               true,
+				},
 				"datagateway": map[string]interface{}{
 					"prefix":                 cfg.Reva.Frontend.DatagatewayPrefix,
 					"transfer_shared_secret": cfg.Reva.TransferSecret,
diff --git a/storage/pkg/command/gateway.go b/storage/pkg/command/gateway.go
index 50032f2e700..37b7dcdaad0 100644
--- a/storage/pkg/command/gateway.go
+++ b/storage/pkg/command/gateway.go
@@ -160,6 +160,9 @@ func gatewayConfigFromStruct(c *cli.Context, cfg *config.Config, logger log.Logg
 						},
 					},
 				},
+				"appregistry": map[string]interface{}{
+					"driver": "static",
+				},
 				"storageregistry": map[string]interface{}{
 					"driver": cfg.Reva.StorageRegistry.Driver,
 					"drivers": map[string]interface{}{
diff --git a/storage/pkg/command/root.go b/storage/pkg/command/root.go
index eb20e0f8df6..1c99f2aad0d 100644
--- a/storage/pkg/command/root.go
+++ b/storage/pkg/command/root.go
@@ -76,6 +76,7 @@ func Execute(cfg *config.Config) error {
 			Gateway(cfg),
 			Users(cfg),
 			Groups(cfg),
+			AppProvider(cfg),
 			AuthBasic(cfg),
 			AuthBearer(cfg),
 			Sharing(cfg),
diff --git a/storage/pkg/command/sharing.go b/storage/pkg/command/sharing.go
index 08958b05868..c3e3001a503 100644
--- a/storage/pkg/command/sharing.go
+++ b/storage/pkg/command/sharing.go
@@ -113,6 +113,7 @@ func sharingConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]inte
 		},
 		"shared": map[string]interface{}{
 			"jwt_secret": cfg.Reva.JWTSecret,
+			"gatewaysvc": cfg.Reva.Gateway.Endpoint,
 		},
 		"grpc": map[string]interface{}{
 			"network": cfg.Reva.Sharing.GRPCNetwork,
@@ -125,7 +126,7 @@ func sharingConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]inte
 						"json": map[string]interface{}{
 							"file": cfg.Reva.Sharing.UserJSONFile,
 						},
-						"sql": map[string]interface{}{
+						"sql": map[string]interface{}{ // cernbox sql
 							"db_username":                   cfg.Reva.Sharing.UserSQLUsername,
 							"db_password":                   cfg.Reva.Sharing.UserSQLPassword,
 							"db_host":                       cfg.Reva.Sharing.UserSQLHost,
@@ -135,6 +136,15 @@ func sharingConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]inte
 							"enable_expired_shares_cleanup": cfg.Reva.Sharing.PublicEnableExpiredSharesCleanup,
 							"janitor_run_interval":          cfg.Reva.Sharing.PublicJanitorRunInterval,
 						},
+						"oc10-sql": map[string]interface{}{
+							"gateway_addr":     cfg.Reva.Gateway.Endpoint,
+							"storage_mount_id": cfg.Reva.Sharing.UserStorageMountID,
+							"db_username":      cfg.Reva.Sharing.UserSQLUsername,
+							"db_password":      cfg.Reva.Sharing.UserSQLPassword,
+							"db_host":          cfg.Reva.Sharing.UserSQLHost,
+							"db_port":          cfg.Reva.Sharing.UserSQLPort,
+							"db_name":          cfg.Reva.Sharing.UserSQLName,
+						},
 					},
 				},
 				"publicshareprovider": map[string]interface{}{
@@ -153,6 +163,18 @@ func sharingConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]inte
 							"enable_expired_shares_cleanup": cfg.Reva.Sharing.PublicEnableExpiredSharesCleanup,
 							"janitor_run_interval":          cfg.Reva.Sharing.PublicJanitorRunInterval,
 						},
+						"oc10-sql": map[string]interface{}{
+							"gateway_addr":                  cfg.Reva.Gateway.Endpoint,
+							"storage_mount_id":              cfg.Reva.Sharing.UserStorageMountID,
+							"db_username":                   cfg.Reva.Sharing.UserSQLUsername,
+							"db_password":                   cfg.Reva.Sharing.UserSQLPassword,
+							"db_host":                       cfg.Reva.Sharing.UserSQLHost,
+							"db_port":                       cfg.Reva.Sharing.UserSQLPort,
+							"db_name":                       cfg.Reva.Sharing.UserSQLName,
+							"password_hash_cost":            cfg.Reva.Sharing.PublicPasswordHashCost,
+							"enable_expired_shares_cleanup": cfg.Reva.Sharing.PublicEnableExpiredSharesCleanup,
+							"janitor_run_interval":          cfg.Reva.Sharing.PublicJanitorRunInterval,
+						},
 					},
 				},
 			},
diff --git a/storage/pkg/command/users.go b/storage/pkg/command/users.go
index f93171e1eb7..4836afe6d49 100644
--- a/storage/pkg/command/users.go
+++ b/storage/pkg/command/users.go
@@ -151,6 +151,18 @@ func usersConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interf
 							"oidc_token_endpoint":          cfg.Reva.UserGroupRest.OIDCTokenEndpoint,
 							"target_api":                   cfg.Reva.UserGroupRest.TargetAPI,
 						},
+						"owncloudsql": map[string]interface{}{
+							"dbusername":           cfg.Reva.UserOwnCloudSQL.DBUsername,
+							"dbpassword":           cfg.Reva.UserOwnCloudSQL.DBPassword,
+							"dbhost":               cfg.Reva.UserOwnCloudSQL.DBHost,
+							"dbport":               cfg.Reva.UserOwnCloudSQL.DBPort,
+							"dbname":               cfg.Reva.UserOwnCloudSQL.DBName,
+							"idp":                  cfg.Reva.UserOwnCloudSQL.Idp,
+							"nobody":               cfg.Reva.UserOwnCloudSQL.Nobody,
+							"join_username":        cfg.Reva.UserOwnCloudSQL.JoinUsername,
+							"join_ownclouduuid":    cfg.Reva.UserOwnCloudSQL.JoinOwnCloudUUID,
+							"enable_medial_search": cfg.Reva.UserOwnCloudSQL.EnableMedialSearch,
+						},
 					},
 				},
 			},
diff --git a/storage/pkg/config/config.go b/storage/pkg/config/config.go
index e24b21c9106..4d73c02c762 100644
--- a/storage/pkg/config/config.go
+++ b/storage/pkg/config/config.go
@@ -39,6 +39,27 @@ type StorageRegistry struct {
 	JSON         string
 }
 
+// AppProvider defines the available app provider configuration
+type AppProvider struct {
+	Port
+	ExternalAddr string
+	Driver       string
+	WopiDriver   WopiDriver
+}
+
+type WopiDriver struct {
+	AppAPIKey      string
+	AppDesktopOnly bool
+	AppIconURI     string
+	AppInternalURL string
+	AppName        string
+	AppURL         string
+	Insecure       bool
+	IopSecret      string
+	JWTSecret      string
+	WopiURL        string
+}
+
 // Sharing defines the available sharing configuration.
 type Sharing struct {
 	Port
@@ -54,6 +75,7 @@ type Sharing struct {
 	PublicPasswordHashCost           int
 	PublicEnableExpiredSharesCleanup bool
 	PublicJanitorRunInterval         int
+	UserStorageMountID               string
 }
 
 // Port defines the available port configuration.
@@ -109,6 +131,7 @@ type Groups struct {
 type FrontendPort struct {
 	Port
 
+	AppProviderPrefix       string
 	DatagatewayPrefix       string
 	OCDavPrefix             string
 	OCSPrefix               string
@@ -339,6 +362,20 @@ type UserGroupRest struct {
 	TargetAPI         string
 }
 
+// UserOwnCloudSQL defines the available ownCloudSQL user provider configuration.
+type UserOwnCloudSQL struct {
+	DBUsername         string
+	DBPassword         string
+	DBHost             string
+	DBPort             int
+	DBName             string
+	Idp                string
+	Nobody             int64
+	JoinUsername       bool
+	JoinOwnCloudUUID   bool
+	EnableMedialSearch bool
+}
+
 // LDAPUserSchema defines the available ldap user schema configuration.
 type LDAPUserSchema struct {
 	UID         string
@@ -373,6 +410,7 @@ type Reva struct {
 	OIDC            OIDC
 	LDAP            LDAP
 	UserGroupRest   UserGroupRest
+	UserOwnCloudSQL UserOwnCloudSQL
 	OCDav           OCDav
 	Storages        StorageConfig
 	// Ports are used to configure which services to start on which port
@@ -390,6 +428,7 @@ type Reva struct {
 	StorageUsers      StoragePort
 	StoragePublicLink PublicStorage
 	StorageMetadata   StoragePort
+	AppProvider       AppProvider
 	// Configs can be used to configure the reva instance.
 	// Services and Ports will be ignored if this is used
 	Configs map[string]interface{}
diff --git a/storage/pkg/flagset/appprovider.go b/storage/pkg/flagset/appprovider.go
new file mode 100644
index 00000000000..1a8b6e694eb
--- /dev/null
+++ b/storage/pkg/flagset/appprovider.go
@@ -0,0 +1,144 @@
+package flagset
+
+import (
+	"github.com/micro/cli/v2"
+	"github.com/owncloud/ocis/ocis-pkg/flags"
+	"github.com/owncloud/ocis/storage/pkg/config"
+)
+
+// AppProviderWithConfig applies cfg to the root flagset
+func AppProviderWithConfig(cfg *config.Config) []cli.Flag {
+	flags := []cli.Flag{
+
+		// debug ports are the odd ports
+		&cli.StringFlag{
+			Name:        "debug-addr",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.DebugAddr, "0.0.0.0:9165"),
+			Usage:       "Address to bind debug server",
+			EnvVars:     []string{"APP_PROVIDER_BASIC_DEBUG_ADDR"},
+			Destination: &cfg.Reva.AppProvider.DebugAddr,
+		},
+
+		// Auth
+
+		// Services
+
+		// AppProvider
+
+		&cli.StringFlag{
+			Name:        "network",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.GRPCNetwork, "tcp"),
+			Usage:       "Network to use for the storage auth-basic service, can be 'tcp', 'udp' or 'unix'",
+			EnvVars:     []string{"APP_PROVIDER_BASIC_GRPC_NETWORK"},
+			Destination: &cfg.Reva.AppProvider.GRPCNetwork,
+		},
+		&cli.StringFlag{
+			Name:        "addr",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.GRPCAddr, "0.0.0.0:9164"),
+			Usage:       "Address to bind storage service",
+			EnvVars:     []string{"APP_PROVIDER_BASIC_GRPC_ADDR"},
+			Destination: &cfg.Reva.AppProvider.GRPCAddr,
+		},
+		&cli.StringFlag{
+			Name:        "external-addr",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.ExternalAddr, "127.0.0.1:9164"),
+			Usage:       "Address to connect to the storage service for other services",
+			EnvVars:     []string{"APP_PROVIDER_BASIC_EXTERNAL_ADDR"},
+			Destination: &cfg.Reva.AppProvider.ExternalAddr,
+		},
+		&cli.StringSliceFlag{
+			Name:    "service",
+			Value:   cli.NewStringSlice("appprovider"),
+			Usage:   "--service appprovider [--service otherservice]",
+			EnvVars: []string{"APP_PROVIDER_BASIC_SERVICES"},
+		},
+
+		&cli.StringFlag{
+			Name:        "driver",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.Driver, ""),
+			Usage:       "Driver to use for app provider",
+			EnvVars:     []string{"APP_PROVIDER_DRIVER"},
+			Destination: &cfg.Reva.AppProvider.Driver,
+		},
+
+		// WOPI driver
+		&cli.StringFlag{
+			Name:        "wopi-driver-app-apikey",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.WopiDriver.AppAPIKey, ""),
+			Usage:       "The API key used by the app, if applicable.",
+			EnvVars:     []string{"APP_PROVIDER_WOPI_DRIVER_APP_API_KEY"},
+			Destination: &cfg.Reva.AppProvider.WopiDriver.AppAPIKey,
+		},
+		&cli.BoolFlag{
+			Name:        "wopi-driver-app-desktop-only",
+			Value:       flags.OverrideDefaultBool(cfg.Reva.AppProvider.WopiDriver.AppDesktopOnly, false),
+			Usage:       "Whether the app can be opened only on desktop",
+			EnvVars:     []string{"APP_PROVIDER_WOPI_DRIVER_APP_DESKTOP_ONLY"},
+			Destination: &cfg.Reva.AppProvider.WopiDriver.AppDesktopOnly,
+		},
+		&cli.StringFlag{
+			Name:        "wopi-driver-app-icon-uri",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.WopiDriver.AppIconURI, ""),
+			Usage:       "IOP Secret (Shared with WOPI server)",
+			EnvVars:     []string{"APP_PROVIDER_WOPI_DRIVER_APP_ICON_URI"},
+			Destination: &cfg.Reva.AppProvider.WopiDriver.AppIconURI,
+		},
+		&cli.StringFlag{
+			Name:        "wopi-driver-app-internal-url",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.WopiDriver.AppInternalURL, ""),
+			Usage:       "The internal app URL in case of dockerized deployments. Defaults to AppURL",
+			EnvVars:     []string{"APP_PROVIDER_WOPI_DRIVER_APP_INTERNAL_URL"},
+			Destination: &cfg.Reva.AppProvider.WopiDriver.AppInternalURL,
+		},
+		&cli.StringFlag{
+			Name:        "wopi-driver-app-name",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.WopiDriver.AppName, ""),
+			Usage:       "The App user-friendly name.",
+			EnvVars:     []string{"APP_PROVIDER_WOPI_DRIVER_APP_NAME"},
+			Destination: &cfg.Reva.AppProvider.WopiDriver.AppName,
+		},
+		&cli.StringFlag{
+			Name:        "wopi-driver-app-url",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.WopiDriver.AppURL, ""),
+			Usage:       "App server URL",
+			EnvVars:     []string{"APP_PROVIDER_WOPI_DRIVER_APP_URL"},
+			Destination: &cfg.Reva.AppProvider.WopiDriver.AppURL,
+		},
+		&cli.BoolFlag{
+			Name:        "wopi-driver-insecure",
+			Value:       flags.OverrideDefaultBool(cfg.Reva.AppProvider.WopiDriver.Insecure, false),
+			Usage:       "Disable SSL certificate verification of WOPI server and WOPI bridge",
+			EnvVars:     []string{"APP_PROVIDER_WOPI_DRIVER_INSECURE"},
+			Destination: &cfg.Reva.AppProvider.WopiDriver.Insecure,
+		},
+		&cli.StringFlag{
+			Name:        "wopi-driver-iopsecret",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.WopiDriver.IopSecret, ""),
+			Usage:       "IOP Secret (Shared with WOPI server)",
+			EnvVars:     []string{"APP_PROVIDER_WOPI_DRIVER_IOP_SECRET"},
+			Destination: &cfg.Reva.AppProvider.WopiDriver.IopSecret,
+		},
+		&cli.StringFlag{
+			Name:        "wopi-driver-wopiurl",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.WopiDriver.WopiURL, ""),
+			Usage:       "WOPI server URL",
+			EnvVars:     []string{"APP_PROVIDER_WOPI_DRIVER_WOPI_URL"},
+			Destination: &cfg.Reva.AppProvider.WopiDriver.WopiURL,
+		},
+
+		// Gateway
+		&cli.StringFlag{
+			Name:        "gateway-url",
+			Value:       flags.OverrideDefaultString(cfg.Reva.Gateway.Endpoint, "localhost:9142"),
+			Usage:       "URL to use for the storage gateway service",
+			EnvVars:     []string{"STORAGE_GATEWAY_ENDPOINT"},
+			Destination: &cfg.Reva.Gateway.Endpoint,
+		},
+	}
+
+	flags = append(flags, TracingWithConfig(cfg)...)
+	flags = append(flags, DebugWithConfig(cfg)...)
+	flags = append(flags, SecretWithConfig(cfg)...)
+
+	return flags
+}
diff --git a/storage/pkg/flagset/frontend.go b/storage/pkg/flagset/frontend.go
index 335ecfed6ce..2f7ec6fb151 100644
--- a/storage/pkg/flagset/frontend.go
+++ b/storage/pkg/flagset/frontend.go
@@ -87,10 +87,17 @@ func FrontendWithConfig(cfg *config.Config) []cli.Flag {
 		},
 		&cli.StringSliceFlag{
 			Name:    "service",
-			Value:   cli.NewStringSlice("datagateway", "ocdav", "ocs"),
+			Value:   cli.NewStringSlice("datagateway", "ocdav", "ocs", "appprovider"),
 			Usage:   "--service ocdav [--service ocs]",
 			EnvVars: []string{"STORAGE_FRONTEND_SERVICES"},
 		},
+		&cli.StringFlag{
+			Name:        "approvider-prefix",
+			Value:       flags.OverrideDefaultString(cfg.Reva.Frontend.AppProviderPrefix, ""),
+			Usage:       "approvider prefix",
+			EnvVars:     []string{"STORAGE_FRONTEND_APPPROVIDER_PREFIX"},
+			Destination: &cfg.Reva.Frontend.AppProviderPrefix,
+		},
 		&cli.StringFlag{
 			Name:        "datagateway-prefix",
 			Value:       flags.OverrideDefaultString(cfg.Reva.Frontend.DatagatewayPrefix, "data"),
diff --git a/storage/pkg/flagset/gateway.go b/storage/pkg/flagset/gateway.go
index af603478feb..ba0585996b7 100644
--- a/storage/pkg/flagset/gateway.go
+++ b/storage/pkg/flagset/gateway.go
@@ -62,7 +62,7 @@ func GatewayWithConfig(cfg *config.Config) []cli.Flag {
 		},
 		&cli.StringSliceFlag{
 			Name:    "service",
-			Value:   cli.NewStringSlice("gateway", "authregistry", "storageregistry"), // TODO appregistry
+			Value:   cli.NewStringSlice("gateway", "authregistry", "storageregistry", "appregistry"),
 			Usage:   "--service gateway [--service authregistry]",
 			EnvVars: []string{"STORAGE_GATEWAY_SERVICES"},
 		},
@@ -193,6 +193,13 @@ func GatewayWithConfig(cfg *config.Config) []cli.Flag {
 			EnvVars:     []string{"STORAGE_SHARING_ENDPOINT"},
 			Destination: &cfg.Reva.Sharing.Endpoint,
 		},
+		&cli.StringFlag{
+			Name:        "appprovider-endpoint",
+			Value:       flags.OverrideDefaultString(cfg.Reva.AppProvider.Endpoint, "localhost:9164"),
+			Usage:       "endpoint to use for the app provider",
+			EnvVars:     []string{"STORAGE_APPPROVIDER_ENDPOINT"},
+			Destination: &cfg.Reva.AppProvider.Endpoint,
+		},
 
 		// register home storage
 
diff --git a/storage/pkg/flagset/users.go b/storage/pkg/flagset/users.go
index b9e6ba127e2..f74796dbda0 100644
--- a/storage/pkg/flagset/users.go
+++ b/storage/pkg/flagset/users.go
@@ -54,7 +54,7 @@ func UsersWithConfig(cfg *config.Config) []cli.Flag {
 		&cli.StringFlag{
 			Name:        "driver",
 			Value:       flags.OverrideDefaultString(cfg.Reva.Users.Driver, "ldap"),
-			Usage:       "user driver: 'demo', 'json', 'ldap', or 'rest'",
+			Usage:       "user driver: 'demo', 'json', 'ldap', 'owncloudsql' or 'rest'",
 			EnvVars:     []string{"STORAGE_USERPROVIDER_DRIVER"},
 			Destination: &cfg.Reva.Users.Driver,
 		},
@@ -72,6 +72,79 @@ func UsersWithConfig(cfg *config.Config) []cli.Flag {
 			EnvVars:     []string{"STORAGE_USER_CACHE_EXPIRATION"},
 			Destination: &cfg.Reva.Users.UserGroupsCacheExpiration,
 		},
+
+		// user owncloudsql
+
+		&cli.StringFlag{
+			Name:        "owncloudsql-dbhost",
+			Value:       flags.OverrideDefaultString(cfg.Reva.UserOwnCloudSQL.DBHost, "mysql"),
+			Usage:       "hostname of the mysql db",
+			EnvVars:     []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_DBHOST"},
+			Destination: &cfg.Reva.UserOwnCloudSQL.DBHost,
+		},
+		&cli.IntFlag{
+			Name:        "owncloudsql-dbport",
+			Value:       flags.OverrideDefaultInt(cfg.Reva.UserOwnCloudSQL.DBPort, 3306),
+			Usage:       "port of the mysql db",
+			EnvVars:     []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_DBPORT"},
+			Destination: &cfg.Reva.UserOwnCloudSQL.DBPort,
+		},
+		&cli.StringFlag{
+			Name:        "owncloudsql-dbname",
+			Value:       flags.OverrideDefaultString(cfg.Reva.UserOwnCloudSQL.DBName, "owncloud"),
+			Usage:       "database name of the owncloud db",
+			EnvVars:     []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_DBNAME"},
+			Destination: &cfg.Reva.UserOwnCloudSQL.DBName,
+		},
+		&cli.StringFlag{
+			Name:        "owncloudsql-dbuser",
+			Value:       flags.OverrideDefaultString(cfg.Reva.UserOwnCloudSQL.DBUsername, "owncloud"),
+			Usage:       "user name to use when connecting to the mysql owncloud db",
+			EnvVars:     []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_DBUSER"},
+			Destination: &cfg.Reva.UserOwnCloudSQL.DBUsername,
+		},
+		&cli.StringFlag{
+			Name:        "owncloudsql-dbpass",
+			Value:       flags.OverrideDefaultString(cfg.Reva.UserOwnCloudSQL.DBPassword, "secret"),
+			Usage:       "password to use when connecting to the mysql owncloud db",
+			EnvVars:     []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_DBPASS"},
+			Destination: &cfg.Reva.UserOwnCloudSQL.DBPassword,
+		},
+		&cli.StringFlag{
+			Name:        "owncloudsql-idp",
+			Value:       flags.OverrideDefaultString(cfg.Reva.UserOwnCloudSQL.Idp, "https://localhost:9200"),
+			Usage:       "Identity provider to use for users",
+			EnvVars:     []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_IDP", "OCIS_URL"},
+			Destination: &cfg.Reva.UserOwnCloudSQL.Idp,
+		},
+		&cli.Int64Flag{
+			Name:        "owncloudsql-nobody",
+			Value:       flags.OverrideDefaultInt64(cfg.Reva.UserOwnCloudSQL.Nobody, 99),
+			Usage:       "fallback user id to use when user has no id",
+			EnvVars:     []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_NOBODY"},
+			Destination: &cfg.Reva.UserOwnCloudSQL.Nobody,
+		},
+		&cli.BoolFlag{
+			Name:        "owncloudsql-join-username",
+			Value:       flags.OverrideDefaultBool(cfg.Reva.UserOwnCloudSQL.JoinUsername, false),
+			Usage:       "join the username from the oc_preferences table",
+			EnvVars:     []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_JOIN_USERNAME"},
+			Destination: &cfg.Reva.UserOwnCloudSQL.JoinUsername,
+		},
+		&cli.BoolFlag{
+			Name:        "owncloudsql-join-ownclouduuid",
+			Value:       flags.OverrideDefaultBool(cfg.Reva.UserOwnCloudSQL.JoinOwnCloudUUID, false),
+			Usage:       "join the ownclouduuid from the oc_preferences table",
+			EnvVars:     []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_JOIN_OWNCLOUDUUID"},
+			Destination: &cfg.Reva.UserOwnCloudSQL.JoinOwnCloudUUID,
+		},
+		&cli.BoolFlag{
+			Name:        "owncloudsql-enable-medial-search",
+			Value:       flags.OverrideDefaultBool(cfg.Reva.UserOwnCloudSQL.EnableMedialSearch, false),
+			Usage:       "enable medial search when finding users",
+			EnvVars:     []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_ENABLE_MEDIAL_SEARCH"},
+			Destination: &cfg.Reva.UserOwnCloudSQL.EnableMedialSearch,
+		},
 	}
 
 	flags = append(flags, TracingWithConfig(cfg)...)
diff --git a/store/pkg/tracing/tracing.go b/store/pkg/tracing/tracing.go
index 6f91bb967e7..b6f66479ff7 100644
--- a/store/pkg/tracing/tracing.go
+++ b/store/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "store"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "store", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil
diff --git a/thumbnails/pkg/tracing/tracing.go b/thumbnails/pkg/tracing/tracing.go
index e5ca712bc49..6bbd7afc844 100644
--- a/thumbnails/pkg/tracing/tracing.go
+++ b/thumbnails/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "thumbnails"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "thumbnails", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil
diff --git a/web/pkg/tracing/tracing.go b/web/pkg/tracing/tracing.go
index d3e2a93659e..1bd7caf66ab 100644
--- a/web/pkg/tracing/tracing.go
+++ b/web/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "web"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "web", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil
diff --git a/webdav/pkg/tracing/tracing.go b/webdav/pkg/tracing/tracing.go
index ebc16f2f855..f3efeecd004 100644
--- a/webdav/pkg/tracing/tracing.go
+++ b/webdav/pkg/tracing/tracing.go
@@ -13,8 +13,10 @@ var (
 
 func Configure(cfg *config.Config) error {
 	var err error
-	if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Collector, cfg.Tracing.Type, "webdav"); err != nil {
-		return err
+	if cfg.Tracing.Enabled {
+		if TraceProvider, err = pkgtrace.GetTraceProvider(cfg.Tracing.Endpoint, cfg.Tracing.Collector, "webdav", cfg.Tracing.Type); err != nil {
+			return err
+		}
 	}
 
 	return nil


Test patch:
diff --git a/ocis-pkg/tracing/tracing_test.go b/ocis-pkg/tracing/tracing_test.go
new file mode 100644
index 00000000000..a2509bfe37f
--- /dev/null
+++ b/ocis-pkg/tracing/tracing_test.go
@@ -0,0 +1,77 @@
+package tracing
+
+import "testing"
+
+func Test_parseAgentConfig(t *testing.T) {
+	type args struct {
+		ae string
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    string
+		want1   string
+		wantErr bool
+	}{
+		{
+			name: "docker-style config",
+			args: args{
+				ae: "docker-jaeger:6666",
+			},
+			want:    "docker-jaeger",
+			want1:   "6666",
+			wantErr: false,
+		},
+		{
+			name: "agent in an url config",
+			args: args{
+				ae: "https://example-agent.com:6666",
+			},
+			want:    "example-agent.com",
+			want1:   "6666",
+			wantErr: false,
+		},
+		{
+			name: "agent as ipv4",
+			args: args{
+				ae: "127.0.0.1:6666",
+			},
+			want:    "127.0.0.1",
+			want1:   "6666",
+			wantErr: false,
+		},
+		{
+			name: "no hostname config should error",
+			args: args{
+				ae: ":6666",
+			},
+			want:    "",
+			want1:   "",
+			wantErr: true,
+		},
+		{
+			name: "no hostname nor port but separator should error",
+			args: args{
+				ae: ":",
+			},
+			want:    "",
+			want1:   "",
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, got1, err := parseAgentConfig(tt.args.ae)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("parseAgentConfig() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if got != tt.want {
+				t.Errorf("parseAgentConfig() got = %v, want %v", got, tt.want)
+			}
+			if got1 != tt.want1 {
+				t.Errorf("parseAgentConfig() got1 = %v, want %v", got1, tt.want1)
+			}
+		})
+	}
+}
diff --git a/settings/ui/tests/acceptance/features/settings.feature b/settings/ui/tests/acceptance/features/settings.feature
index b59894357fe..9b61ca5a8bd 100644
--- a/settings/ui/tests/acceptance/features/settings.feature
+++ b/settings/ui/tests/acceptance/features/settings.feature
@@ -13,7 +13,7 @@ Feature: Set user specific settings
 	Scenario: Check the default settings
 		Given user "user1" has logged in using the webUI
 		And the user browses to the settings page
-		Then the setting "Language" should not have any value
+		Then the setting "Language" should have value "English"
 		When the user browses to the files page
 		Then the files menu should be listed in language "English"