diff --git a/.env.unix.example b/.env.unix.example
index b0ad6ff0532fd9d5d74c99b95cee0ea66122cfcd..9f087cb8e2d40cb0db81f208e98eedfce68ab9c9 100644
--- a/.env.unix.example
+++ b/.env.unix.example
@@ -12,6 +12,7 @@ METADATA_PASSWORD=dbrepo
 AUTH_DB=keycloak
 AUTH_USERNAME=root
 AUTH_PASSWORD=dbrepo
+BROKER_ENDPOINT=http://broker-service:15672/api/broker
 BROKER_USERNAME=fda
 BROKER_PASSWORD=fda
 KEYCLOAK_ADMIN=fda
diff --git a/Makefile b/Makefile
index b6a203169d6e3e44903d5178e4ce8e49a2354fa3..1a9b8773511c017bdce71d269443dfc6950a723e 100644
--- a/Makefile
+++ b/Makefile
@@ -163,6 +163,8 @@ coverage-frontend: build-frontend
 test-frontend: build-frontend
 	yarn --cwd ./dbrepo-ui install
 	yarn --cwd ./dbrepo-ui run test:unit || true
+	yarn --cwd ./dbrepo-ui playwright install
+	yarn --cwd ./dbrepo-ui run test:e2e || true
 	yarn --cwd ./dbrepo-ui run coverage || true
 
 test-clients:
diff --git a/dbrepo-broker-service/Dockerfile b/dbrepo-broker-service/Dockerfile
index caef7401ec51119dd66b94c4ae0a3cf184021fed..78bc9bb462d61dda0def30fbd5ac70b45cde95f1 100644
--- a/dbrepo-broker-service/Dockerfile
+++ b/dbrepo-broker-service/Dockerfile
@@ -13,5 +13,3 @@ RUN rabbitmq-plugins enable --offline rabbitmq_prometheus rabbitmq_mqtt rabbitmq
 
 EXPOSE 5672
 EXPOSE 15672
-
-HEALTHCHECK --interval=10s --timeout=5s --retries=12 CMD wget --spider http://localhost:15672/broker/
diff --git a/dbrepo-broker-service/rabbitmq.conf b/dbrepo-broker-service/rabbitmq.conf
index 23942bcede8a6ab13812d91beea5aac8583c956b..a2b3bf521b37b6a880d4e86dfc5932f6ee4614d8 100644
--- a/dbrepo-broker-service/rabbitmq.conf
+++ b/dbrepo-broker-service/rabbitmq.conf
@@ -11,7 +11,7 @@ default_permissions.write = .*
 listeners.tcp.1 = 0.0.0.0:5672
 
 # management ui (https://www.rabbitmq.com/management.html#path-prefix)
-management.path_prefix = /broker
+management.path_prefix = /api/broker
 
 # logging
 log.console = true
diff --git a/dbrepo-metadata-service/Dockerfile b/dbrepo-metadata-service/Dockerfile
index e9587b40feac829f8b1b7d0676779a758c7f29da..6e9c922e45aaa46bf1988cc766cd0e2b8eb9e119 100644
--- a/dbrepo-metadata-service/Dockerfile
+++ b/dbrepo-metadata-service/Dockerfile
@@ -36,7 +36,7 @@ ENV ADMIN_MAIL="noreply@localhost"
 ENV BASE_URL="http://localhost"
 ENV GRANT_PRIVILEGES="SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"
 ENV BROKER_CONSUMERS=2
-ENV BROKER_ENDPOINT="http://broker-service:15672"
+ENV BROKER_ENDPOINT="http://broker-service:15672/api/broker"
 ENV BROKER_USERNAME=fda
 ENV BROKER_PASSWORD=fda
 ENV DELETED_RECORD=persistent
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java
index 52de16e2f364e3ea6f4896763dc0514cc0331a64..de50b0538a1f3a8f8f7e7358d9351b12330a452d 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java
@@ -47,16 +47,12 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway {
         this.gatewayConfig = gatewayConfig;
     }
 
-    private String parseUrl(String path) {
-        final String url = "/api" + path;
-        log.debug("parse url: {}", url);
-        return url;
-    }
-
     @Override
     public void createVirtualHost(CreateVirtualHostDto data) throws BrokerVirtualHostCreationException {
-        final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/vhost"), HttpMethod.POST,
-                new HttpEntity<>(data), Void.class);
+        final String url = "/api/vhost";
+        log.trace("POST {}{}", gatewayConfig.getBrokerEndpoint(), url);
+        final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(data),
+                Void.class);
         if (!response.getStatusCode().equals(HttpStatus.CREATED)) {
             log.error("Failed to create virtual host: {}", response.getStatusCode());
             throw new BrokerVirtualHostCreationException("Failed to create virtual host");
@@ -67,8 +63,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway {
     @Override
     public void grantPermission(String username, ExchangeUpdatePermissionsDto data)
             throws BrokerVirtualHostGrantException {
-        final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/topic-permissions/dbrepo/" + username), HttpMethod.PUT,
-                new HttpEntity<>(data), Void.class);
+        final String url = "/api/topic-permissions/dbrepo/" + username;
+        log.trace("PUT {}{}", gatewayConfig.getBrokerEndpoint(), url);
+        final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.PUT, new HttpEntity<>(data),
+                Void.class);
         if (!response.getStatusCode().equals(HttpStatus.CREATED) && !response.getStatusCode().equals(HttpStatus.NO_CONTENT)) {
             log.error("Failed to grant exchange: {}", response.getStatusCode());
             throw new BrokerVirtualHostGrantException("Failed to grant exchange");
@@ -82,8 +80,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway {
                 .passwordHash("")
                 .tags("")
                 .build();
-        final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/users/" + username), HttpMethod.PUT,
-                new HttpEntity<>(data), Void.class);
+        final String url = "/api/users/" + username;
+        log.trace("PUT {}{}", gatewayConfig.getBrokerEndpoint(), url);
+        final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.PUT, new HttpEntity<>(data),
+                Void.class);
         if (!response.getStatusCode().equals(HttpStatus.CREATED) && !response.getStatusCode().equals(HttpStatus.NO_CONTENT)) {
             log.error("Failed to create user: {}", response.getStatusCode());
             throw new BrokerVirtualHostCreationException("Failed to create user");
@@ -94,8 +94,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway {
     @Override
     public void grantPermission(String username, GrantVirtualHostPermissionsDto data)
             throws BrokerVirtualHostGrantException {
-        final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/permissions/dbrepo/" + username), HttpMethod.PUT,
-                new HttpEntity<>(data), Void.class);
+        final String url = "/api/permissions/dbrepo/" + username;
+        log.trace("PUT {}{}", gatewayConfig.getBrokerEndpoint(), url);
+        final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.PUT, new HttpEntity<>(data),
+                Void.class);
         if (!response.getStatusCode().equals(HttpStatus.CREATED) && !response.getStatusCode().equals(HttpStatus.NO_CONTENT)) {
             log.error("Failed to grant virtual host: {}", response.getStatusCode());
             throw new BrokerVirtualHostGrantException("Failed to grant virtual host");
@@ -105,16 +107,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway {
 
     @Override
     public List<ConsumerDto> findAllConsumers() {
-        final StringBuilder urlBuilder = new StringBuilder(gatewayConfig.getBrokerEndpoint())
-                .append("/api");
-        if (Arrays.stream(environment.getActiveProfiles()).noneMatch(p -> p.equals("junit"))) {
-            urlBuilder.append("/broker");
-        }
-        urlBuilder.append("/consumers/")
-                .append(VIRTUAL_SERVER);
+        final String url = "/api/consumers/" + VIRTUAL_SERVER;
         log.trace("gateway broker find all consumers, virtual server={}", VIRTUAL_SERVER);
-        final URI findUri = URI.create(urlBuilder.toString());
-        final ResponseEntity<List<ConsumerDto>> response = restTemplate.exchange(findUri, HttpMethod.GET,
+        log.trace("GET {}{}", gatewayConfig.getBrokerEndpoint(), url);
+        final ResponseEntity<List<ConsumerDto>> response = restTemplate.exchange(URI.create(url), HttpMethod.GET,
                 HttpEntity.EMPTY, new ParameterizedTypeReference<>() {
                 });
         return response.getBody();
diff --git a/dbrepo-ui/config.js b/dbrepo-ui/config.js
index 1ccca7b563eec4b1a6cf57d9325cb53b30fb229c..480968cd52d0b6053437b3251a50f34b22ce5555 100644
--- a/dbrepo-ui/config.js
+++ b/dbrepo-ui/config.js
@@ -1,21 +1,21 @@
 const config = {}
 
-config.title = process.env.TITLE || null
-config.icon = process.env.ICON || null
-config.brokerUsername = process.env.BROKER_USERNAME || null
-config.brokerPassword = process.env.BROKER_PASSWORD || null
-config.brokerLoginUrl = process.env.BROKER_LOGIN_URL || null
-config.keycloakLoginUrl = process.env.KEYCLOAK_LOGIN_URL || null
-config.sharedFilesystem = process.env.SHARED_FILESYSTEM || null
-config.version = process.env.VERSION || null
-config.logo = process.env.LOGO || null
-config.tokenMax = process.env.TOKEN_MAX || null
-config.searchUsername = process.env.SEARCH_USERNAME || null
-config.searchPassword = process.env.SEARCH_PASSWORD || null
-config.clientId = process.env.DBREPO_CLIENT_ID || null
-config.clientSecret = process.env.DBREPO_CLIENT_SECRET || null
-config.defaultPublisher = process.env.DEFAULT_PID_PUBLISHER || null
-config.doiUrl = process.env.DOI_URL || null
-config.uploadPath = process.env.UPLOAD_PATH || null
+config.title = process.env.TITLE || 'Database Repository'
+config.icon = process.env.ICON || '/favicon.ico'
+config.brokerUsername = process.env.BROKER_USERNAME || 'fda'
+config.brokerPassword = process.env.BROKER_PASSWORD || 'fda'
+config.brokerLoginUrl = process.env.BROKER_LOGIN_URL || '/broker/'
+config.keycloakLoginUrl = process.env.KEYCLOAK_LOGIN_URL || '/api/auth/'
+config.sharedFilesystem = process.env.SHARED_FILESYSTEM || '/tmp'
+config.version = process.env.VERSION || 'latest'
+config.logo = process.env.LOGO || '/logo.png'
+config.tokenMax = process.env.TOKEN_MAX || 5
+config.searchUsername = process.env.SEARCH_USERNAME || 'admin'
+config.searchPassword = process.env.SEARCH_PASSWORD || 'admin'
+config.clientId = process.env.DBREPO_CLIENT_ID || 'dbrepo-client'
+config.clientSecret = process.env.DBREPO_CLIENT_SECRET || 'MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG'
+config.defaultPublisher = process.env.DEFAULT_PID_PUBLISHER || 'Example University'
+config.doiUrl = process.env.DOI_URL || 'https://doi.org'
+config.uploadPath = process.env.UPLOAD_PATH || '/tmp/'
 
 module.exports = config
diff --git a/dbrepo-ui/package.json b/dbrepo-ui/package.json
index 61548c8c365411c283009ea84c387b58ec219161..d9fc5ed0314786876d03ee1fe8f4fb74fcd94f64 100644
--- a/dbrepo-ui/package.json
+++ b/dbrepo-ui/package.json
@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "scripts": {
-    "dev": "NODE_ENV=development nuxt --port 3001",
+    "dev": "NODE_ENV=development nuxt --dotenv ../.env --port 3001",
     "docker": "nuxt > /dev/null",
     "build": "nuxt build",
     "start": "nuxt start",
diff --git a/dbrepo-ui/pages/login.vue b/dbrepo-ui/pages/login.vue
index 4ffb24e8e72363cb563a02d83745a175b48612c0..d99b9622e9ed480642cabf9a0c164e37eef15265 100644
--- a/dbrepo-ui/pages/login.vue
+++ b/dbrepo-ui/pages/login.vue
@@ -51,19 +51,12 @@
             Login
           </v-btn>
         </v-card-actions>
+        <v-card-subtitle class="text-right">
+          <a v-if="rabbitMqUrl" color="orange" class="mr-1" plain :href="rabbitMqUrl">RabbitMQ Admin</a>
+          <a v-if="keycloakUrl" color="secondary" class="ml-1" plain :href="keycloakUrl">Keycloak Admin</a>
+        </v-card-subtitle>
       </v-card>
     </v-form>
-    <v-toolbar v-if="!token" flat>
-      <v-spacer />
-      <v-toolbar-title>
-        <v-btn v-if="rabbitMqUrl" color="orange" plain :href="rabbitMqUrl">
-          <v-icon left>mdi-rabbit</v-icon> RabbitMQ
-        </v-btn>
-        <v-btn v-if="keycloakUrl" color="secondary" plain :href="keycloakUrl">
-          <v-icon left>mdi-key</v-icon> Keycloak
-        </v-btn>
-      </v-toolbar-title>
-    </v-toolbar>
   </div>
 </template>
 
diff --git a/docker-compose.yml b/docker-compose.yml
index bd8b3eb5e6173903aa54ea3a4290f3491718769e..32d7641a39a1defaead81925c3146706761e47f9 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -223,6 +223,11 @@ services:
     ports:
       - "5672:5672"
       - "15672:15672"
+    healthcheck:
+      test: wget -qO- localhost:15672/api/broker | grep "RabbitMQ" || exit 1
+      interval: 10s
+      timeout: 5s
+      retries: 12
     depends_on:
       dbrepo-authentication-service:
         condition: service_healthy