diff --git a/dbrepo-metadata-db/setup-schema.sql b/dbrepo-metadata-db/setup-schema.sql
index 21081998abdc10c0ea8c72282133792c4f350765..c42a754e863da64daf563dc29821076e0d8c7891 100644
--- a/dbrepo-metadata-db/setup-schema.sql
+++ b/dbrepo-metadata-db/setup-schema.sql
@@ -51,9 +51,12 @@ CREATE TABLE IF NOT EXISTS `mdb_containers`
     internal_name       character varying(255) NOT NULL,
     name                character varying(255) NOT NULL,
     host                character varying(255) NOT NULL,
-    port                integer                NOT NULL,
+    port                integer                NOT NULL default 3306,
+    ui_host             character varying(255) NOT NULL default host,
+    ui_port             integer                NOT NULL default port,
+    ui_additional_flags text,
     sidecar_host        character varying(255) NOT NULL,
-    sidecar_port        integer                NOT NULL,
+    sidecar_port        integer                NOT NULL default 3305,
     image_id            bigint                 NOT NULL,
     created             timestamp              NOT NULL DEFAULT NOW(),
     last_modified       timestamp,
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
index bedba0f11369ed3243e36d7c55671a08b82cd788..78435fc540721a6e695ba0346749b2827b913e3e 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
@@ -48,6 +48,12 @@ public class ContainerDto {
     @JsonProperty("sidecar_port")
     private Integer sidecarPort;
 
+    @JsonProperty("ui_host")
+    private String uiHost;
+
+    @JsonProperty("ui_port")
+    private Integer uiPort;
+
     private ImageBriefDto image;
 
     @NotNull
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java
index e44c9313841bd556b8b7cb6671fff75a53bddc93..82b646e3adbb682e1b6629f85afbb6efbeecdcee 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java
@@ -51,6 +51,15 @@ public class Container {
     @Column(nullable = false)
     private Integer sidecarPort;
 
+    @Column
+    private String uiHost;
+
+    @Column
+    private Integer uiPort;
+
+    @Column
+    private String uiAdditionalFlags;
+
     @ToString.Exclude
     @org.springframework.data.annotation.Transient
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
index cd78c8200c12ca4ca21c3893d706818942dc39bf..ae3ae81be32720f67f7303a1920ecb153b2265ea 100644
--- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
+++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
@@ -825,6 +825,9 @@ public abstract class BaseTest {
     public final static String CONTAINER_1_NAME = "u01";
     public final static String CONTAINER_1_INTERNALNAME = "dbrepo-userdb-u01";
     public final static String CONTAINER_1_IP = "127.0.0.1";
+    public final static String CONTAINER_1_UI_HOST = "localhost";
+    public final static Integer CONTAINER_1_UI_PORT = 3306;
+    public final static String CONTAINER_1_UI_ADDITIONAL_FLAGS = "?sslMode=disable";
     public final static Boolean CONTAINER_1_RUNNING = true;
     public final static String CONTAINER_1_HOST = "localhost";
     public final static Integer CONTAINER_1_PORT = 3308;
@@ -843,6 +846,9 @@ public abstract class BaseTest {
             .created(CONTAINER_1_CREATED)
             .host(CONTAINER_1_HOST)
             .port(CONTAINER_1_PORT)
+            .uiHost(CONTAINER_1_UI_HOST)
+            .uiPort(CONTAINER_1_UI_PORT)
+            .uiAdditionalFlags(CONTAINER_1_UI_ADDITIONAL_FLAGS)
             .sidecarHost(CONTAINER_1_SIDECAR_HOST)
             .sidecarPort(CONTAINER_1_SIDECAR_PORT)
             .privilegedUsername(CONTAINER_1_PRIVILEGED_USERNAME)
diff --git a/dbrepo-ui/Dockerfile b/dbrepo-ui/Dockerfile
index ff5efad1efd58121879e0f83c959f7930b2c8c0c..3336cdc5b50683d5a6b02299f20e7cd6586bab9b 100644
--- a/dbrepo-ui/Dockerfile
+++ b/dbrepo-ui/Dockerfile
@@ -8,8 +8,8 @@ ENV API=http://:80
 
 WORKDIR /app
 
-COPY ./package.json ./
-COPY ./yarn.lock ./
+COPY ./package.json ./package.json
+COPY ./yarn.lock ./yarn.lock
 
 # Install yarn dependencies
 RUN yarn install --frozen-lockfile
@@ -17,7 +17,7 @@ RUN yarn install --frozen-lockfile
 COPY ./nuxt.config.js ./nuxt.config.js
 COPY ./ava.config.cjs ./ava.config.cjs
 COPY ./babel.config.js ./babel.config.js
-COPY ./config.js ./config.js
+COPY ./dbrepo.config.json ./dbrepo.config.json
 COPY ./assets ./assets
 COPY ./api ./api
 COPY ./components ./components
@@ -39,27 +39,6 @@ MAINTAINER Martin Weise <martin.weise@tuwien.ac.at>
 EXPOSE 3000
 EXPOSE 9100
 
-ENV BROKER_USERNAME="fda"
-ENV BROKER_PASSWORD="fda"
-ENV BROKER_LOGIN_URL="/admin/broker/"
-ENV KEYCLOAK_LOGIN_URL="/api/auth/"
-ENV OPENSEARCH_LOGIN_URL="/admin/dashboard/"
-ENV MINIO_LOGIN_URL="/admin/storage/"
-ENV LOGO="/logo.png"
-ENV SEARCH_USERNAME="admin"
-ENV SEARCH_PASSWORD="admin"
-ENV S3_STORAGE_HOSTNAME="storage-service"
-ENV S3_STORAGE_PORT="9000"
-ENV S3_ACCESS_KEY_ID="minioadmin"
-ENV S3_SECRET_ACCESS_KEY="minioadmin"
-ENV VERSION="${TAG}"
-ENV TITLE="Database Repository"
-ENV ICON="/favicon.ico"
-ENV DBREPO_CLIENT_ID="dbrepo-client"
-ENV DBREPO_CLIENT_SECRET="MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG"
-ENV DEFAULT_PID_PUBLISHER=""
-ENV FORCE_SSL="false"
-
 WORKDIR /app
 
 COPY --from=build /app /app
diff --git a/dbrepo-ui/config.js b/dbrepo-ui/config.js
deleted file mode 100644
index e5d23835276fa64031bd07a38bc52bbc4e93049b..0000000000000000000000000000000000000000
--- a/dbrepo-ui/config.js
+++ /dev/null
@@ -1,22 +0,0 @@
-const config = {}
-
-config.title = process.env.NODE_ENV !== 'development' ? process.env.TITLE : 'Database Repository'
-config.icon = process.env.NODE_ENV !== 'development' ? process.env.ICON : '/favicon.ico'
-config.brokerLoginUrl = process.env.NODE_ENV !== 'development' ? process.env.BROKER_LOGIN_URL : '/admin/broker/'
-config.keycloakLoginUrl = process.env.NODE_ENV !== 'development' ? process.env.KEYCLOAK_LOGIN_URL : '/api/auth/'
-config.openSearchUrl = process.env.NODE_ENV !== 'development' ? process.env.OPENSEARCH_LOGIN_URL : '/admin/dashboard/'
-config.version = process.env.NODE_ENV !== 'development' ? process.env.VERSION : 'vue-dev'
-config.logo = process.env.NODE_ENV !== 'development' ? process.env.LOGO : '/logo.png'
-config.searchUsername = process.env.NODE_ENV !== 'development' ? process.env.SEARCH_USERNAME : 'admin'
-config.searchPassword = process.env.NODE_ENV !== 'development' ? process.env.SEARCH_PASSWORD : 'admin'
-config.clientId = process.env.NODE_ENV !== 'development' ? process.env.DBREPO_CLIENT_ID : 'dbrepo-client'
-config.clientSecret = process.env.NODE_ENV !== 'development' ? process.env.DBREPO_CLIENT_SECRET : 'MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG'
-config.defaultPublisher = process.env.NODE_ENV !== 'development' ? process.env.DEFAULT_PID_PUBLISHER : ''
-config.doiUrl = process.env.NODE_ENV !== 'development' ? process.env.DOI_URL : 'https://doi.org'
-config.minIoUrl = process.env.NODE_ENV !== 'development' ? process.env.MINIO_LOGIN_URL : '/admin/storage/'
-config.s3storageHostname = process.env.NODE_ENV !== 'development' ? process.env.S3_STORAGE_HOSTNAME : 'storage-service'
-config.s3storagePort = process.env.NODE_ENV !== 'development' ? Number(process.env.S3_STORAGE_PORT) : 9000
-config.s3accessKeyId = process.env.NODE_ENV !== 'development' ? process.env.S3_ACCESS_KEY_ID : 'minioadmin'
-config.s3secretAccessKey = process.env.NODE_ENV !== 'development' ? process.env.S3_SECRET_ACCESS_KEY : 'minioadmin'
-config.forceSsl = process.env.NODE_ENV !== 'development' ? process.env.FORCE_SSL === 'true' : false
-module.exports = config
diff --git a/dbrepo-ui/dbrepo.config.json b/dbrepo-ui/dbrepo.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..5683a2059536cf5fd21a4065f1f318cc9577d4a0
--- /dev/null
+++ b/dbrepo-ui/dbrepo.config.json
@@ -0,0 +1,114 @@
+{
+  "title": "Database Repository",
+  "version": "vue-dev",
+  "ssl": {
+    "force": false
+  },
+  "logo": {
+    "path": "/logo.png"
+  },
+  "icon": {
+    "path": "/favicon.ico"
+  },
+  "broker": {
+    "connection": {
+      "host": "localhost",
+      "ports": [
+        5672
+      ],
+      "extraInfo": null
+    }
+  },
+  "storage": {
+    "endpoint": "storage-service",
+    "port": 9000,
+    "useSsl": false,
+    "accessKey": {
+      "id": "minioadmin",
+      "secret": "minioadmin"
+    }
+  },
+  "database": {
+    "connection": {
+      "extraInfo": null
+    }
+  },
+  "keycloak": {
+    "client": {
+      "id": "dbrepo-client",
+      "secret": "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG"
+    }
+  },
+  "opensearch": {
+    "username": "admin",
+    "password": "admin"
+  },
+  "pid": {
+    "default": {
+      "publisher": ""
+    }
+  },
+  "doi": {
+    "url": "https://doi.org"
+  },
+  "pages": {
+    "login": {
+      "links": [
+        {
+          "text": "OpenSearch Admin",
+          "blank": true,
+          "href": "http://localhost/admin/dashboard"
+        },
+        {
+          "text": "Storage Admin",
+          "blank": true,
+          "href": "http://localhost/admin/storage"
+        },
+        {
+          "text": "RabbitMQ Admin",
+          "blank": true,
+          "href": "http://localhost/admin/broker"
+        },
+        {
+          "text": "Keycloak Admin",
+          "blank": true,
+          "href": "http://localhost/api/auth"
+        }
+      ]
+    },
+    "information": {
+      "links": [
+        {
+          "text": "Online Documentation",
+          "blank": true,
+          "href": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/latest/"
+        },
+        {
+          "text": "Sourcecode Documentation",
+          "blank": true,
+          "href": "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services"
+        },
+        {
+          "text": "Docker Images",
+          "blank": true,
+          "href": "https://hub.docker.com/u/dbrepo"
+        },
+        {
+          "text": "Demo Instance (Kubernetes)",
+          "blank": true,
+          "href": "https://test.dbrepo.tuwien.ac.at/"
+        },
+        {
+          "text": "Demo Instance (Docker Compose)",
+          "blank": true,
+          "href": "https://dbrepo2.ec.tuwien.ac.at/"
+        },
+        {
+          "text": "Paper",
+          "blank": true,
+          "href": "https://doi.org/10.2218/ijdc.v17i1.825"
+        }
+      ]
+    }
+  }
+}
diff --git a/dbrepo-ui/layouts/default.vue b/dbrepo-ui/layouts/default.vue
index fa175be0f78335f4175f7c04fe3aebf20a1b97ea..9a3b21d8e7f1111ea26065b0388a6a786c6debb4 100644
--- a/dbrepo-ui/layouts/default.vue
+++ b/dbrepo-ui/layouts/default.vue
@@ -463,11 +463,6 @@ export default {
       this.$store.commit('SET_SEARCH_USERNAME', this.$config.searchUsername)
       this.$store.commit('SET_SEARCH_PASSWORD', this.$config.searchPassword)
       this.$store.commit('SET_DOI_URL', this.$config.doiUrl)
-      this.$store.commit('SET_S3_STORAGE_HOSTNAME', this.$config.s3storageHostname)
-      this.$store.commit('SET_S3_STORAGE_PORT', this.$config.s3storagePort)
-      this.$store.commit('SET_S3_ACCESS_KEY_ID', this.$config.s3accessKeyId)
-      this.$store.commit('SET_S3_SECRET_ACCESS_KEY', this.$config.s3secretAccessKey)
-      this.$store.commit('SET_FORCE_SSL', this.$config.forceSsl)
       console.debug('runtime config', this.$config)
     },
     advancedSearch () {
@@ -544,6 +539,11 @@ export default {
       return this.dynamicFieldsMap()[this.advancedSearchData.type].includes(item.attribute_name)
     }
   },
+  head () {
+    return {
+      title: this.$config.title
+    }
+  },
   provide () {
     return {
       advancedSearchData: this.advancedSearchData
diff --git a/dbrepo-ui/nuxt.config.js b/dbrepo-ui/nuxt.config.js
index 91db20c2cf3acec146bd6800c665083e8fa69e72..9bab00a4e3e6396f6d29a6b68981af73ac6c712a 100644
--- a/dbrepo-ui/nuxt.config.js
+++ b/dbrepo-ui/nuxt.config.js
@@ -1,6 +1,6 @@
 import path from 'path'
 import colors from 'vuetify/es5/util/colors'
-import { forceSsl, icon, clientSecret, title, logo, version, defaultPublisher, doiUrl, minIoUrl, clientId, searchUsername, searchPassword, brokerLoginUrl, keycloakLoginUrl, openSearchUrl, s3storageHostname, s3storagePort, s3accessKeyId, s3secretAccessKey } from './config'
+import config from './dbrepo.config.json'
 
 const proxy = {}
 
@@ -29,6 +29,8 @@ const meta = [
   { name: 'viewport', content: 'width=device-width, initial-scale=1' }
 ]
 
+const forceSsl = config.ssl.force
+
 if (forceSsl) {
   console.info('Flag FORCE_SSL is set: http-equiv Content-Security-Policy header is set to upgrade-insecure-requests')
   meta.push({ 'http-equiv': 'Content-Security-Policy', content: 'upgrade-insecure-requests' })
@@ -47,10 +49,10 @@ export default {
   },
 
   head: {
-    title,
+    title: config.title,
     meta,
     link: [
-      { rel: 'icon', type: 'image/x-icon', href: icon }
+      { rel: 'icon', type: 'image/x-icon', href: config.icon.path }
     ]
   },
 
@@ -96,23 +98,21 @@ export default {
   proxy,
 
   publicRuntimeConfig: {
-    title,
-    version,
-    logo,
-    clientId,
-    clientSecret,
-    defaultPublisher,
-    brokerLoginUrl,
-    keycloakLoginUrl,
-    openSearchUrl,
-    searchUsername,
-    searchPassword,
-    doiUrl,
-    minIoUrl,
-    s3storageHostname,
-    s3storagePort,
-    s3accessKeyId,
-    s3secretAccessKey
+    title: config.title,
+    version: config.version,
+    logo: config.logo.path,
+    clientId: config.keycloak.client.id,
+    clientSecret: config.keycloak.client.secret,
+    defaultPublisher: config.pid.default.publisher,
+    searchUsername: config.opensearch.username,
+    searchPassword: config.opensearch.password,
+    doiUrl: config.doi.url,
+    infoLinks: config.pages.information.links,
+    loginLinks: config.pages.login.links,
+    brokerHost: config.broker.connection.host,
+    brokerPorts: config.broker.connection.ports,
+    brokerExtraInfo: config.broker.connection.extraInfo,
+    databaseExtraInfo: config.database.connection.extraInfo
   },
 
   serverMiddleware: [
diff --git a/dbrepo-ui/pages/database/_database_id/info.vue b/dbrepo-ui/pages/database/_database_id/info.vue
index 8715c63e2fc5ef5795571da749838434060edcf7..de0a1082ed8366e3407daacf297b2465773f344d 100644
--- a/dbrepo-ui/pages/database/_database_id/info.vue
+++ b/dbrepo-ui/pages/database/_database_id/info.vue
@@ -77,14 +77,22 @@
                     Database Access
                   </v-list-item-title>
                   <v-list-item-content v-if="access && access.type">
-                    <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" />
-                    {{ accessDescription.text }}
+                    <span>
+                      <v-badge inline :content="databaseExtraInfo" color="primary">
+                        <pre v-text="accessDescription.text" />
+                      </v-badge>
+                    </span>
+                  </v-list-item-content>
+                  <v-list-item-title v-if="access" class="mt-2">
+                    Database Connection
+                  </v-list-item-title>
+                  <v-list-item-content v-if="access">
+                    <pre class="pb-1" v-text="jdbcString" />
                   </v-list-item-content>
                   <v-list-item-title v-if="contact" class="mt-2">
                     Database Contact
                   </v-list-item-title>
                   <v-list-item-content v-if="contact">
-                    <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" />
                     <span v-if="!loading" v-text="contact" />
                   </v-list-item-content>
                 </v-list-item-content>
@@ -298,6 +306,12 @@ export default {
         return false
       }
       return this.database.owner.username === this.user.username
+    },
+    jdbcString () {
+      return `jdbc://${this.database.container.ui_host}:${this.database.container.ui_port}/${this.database.internal_name}${this.database.container.ui_additional_flags} (username=${this.user.username}, password=yourpassword)`
+    },
+    databaseExtraInfo () {
+      return this.$config.databaseExtraInfo
     }
   },
   methods: {
diff --git a/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue b/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue
index f6960c957bf685e04862e0859988110d149bf333..e5a5e86ff2b4c8c426632e6ebb91d88bc08ca69e 100644
--- a/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue
+++ b/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue
@@ -31,9 +31,19 @@
               <v-list-item-content v-if="table && table.created">
                 <span>{{ createdUTC }}</span>
               </v-list-item-content>
+              <v-list-item-title v-if="access && access.type" class="mt-2">
+                Table Access
+              </v-list-item-title>
+              <v-list-item-content v-if="access && access.type">
+                <span>
+                  <v-badge inline :content="brokerExtraInfo" color="primary">
+                    <span v-text="accessDescription.text" />
+                  </v-badge>
+                </span>
+              </v-list-item-content>
             </v-list-item-content>
           </v-list-item>
-          <v-list-item v-if="canWriteQueues">
+          <v-list-item v-if="canWrite && canWriteQueues">
             <v-list-item-icon>
               <v-icon>mdi-rabbit</v-icon>
             </v-list-item-icon>
@@ -49,7 +59,7 @@
               </v-list-item-title>
               <v-list-item-content v-if="database">
                 <span>
-                  <v-badge inline :content="database.exchange_type" color="primary">{{ database.exchange_name }}</v-badge>
+                  <v-badge inline :content="database.exchange_type" color="secondary">{{ database.exchange_name }}</v-badge>
                 </span>
               </v-list-item-content>
               <v-list-item-title class="mt-2">
@@ -57,7 +67,7 @@
               </v-list-item-title>
               <v-list-item-content v-if="table">
                 <span>
-                  <v-badge inline :content="table.queue_type" color="primary">{{ table.queue_name }}</v-badge>
+                  <v-badge inline :content="table.queue_type" color="secondary">{{ table.queue_name }}</v-badge>
                 </span>
               </v-list-item-content>
               <v-list-item-title v-if="table && table.routing_key" class="mt-2">
@@ -66,11 +76,16 @@
               <v-list-item-content v-if="table && table.routing_key">
                 <pre v-text="table.routing_key" />
               </v-list-item-content>
-              <v-list-item-title v-if="canRead" class="mt-2">
+              <v-list-item-title class="mt-2">
                 Connection String
               </v-list-item-title>
               <v-list-item-content>
-                <pre v-text="amqpString" />
+                <span v-for="(port, i) in brokerPorts" :key="i">
+                  <pre v-if="![5671,5672].includes(port)" class="pb-1" v-text="amqpString" />
+                  <v-badge inline :content="amqpBadgeText(port)" :color="amqpBadgeColor(port)">
+                    <pre class="pb-1" v-text="amqpString(port)" />
+                  </v-badge>
+                </span>
               </v-list-item-content>
             </v-list-item-content>
           </v-list-item>
@@ -130,6 +145,12 @@ export default {
       }
       return this.access.type === 'read' || this.access.type === 'write_own' || this.access.type === 'write_all'
     },
+    canWrite () {
+      if (!this.table || !this.user || !this.access) {
+        return false
+      }
+      return (this.access.type === 'write_own' && this.table.owner.id === this.user.id) || this.access.type === 'write_all'
+    },
     createdUTC () {
       if (this.table.created === undefined || this.table.created === null) {
         return null
@@ -166,11 +187,26 @@ export default {
       }
       return this.version.substring(0, 10) + 'T' + this.version.substring(11, 19) + 'Z'
     },
-    amqpString () {
-      if (!this.user) {
-        return null
+    brokerExtraInfo () {
+      return this.$config.brokerExtraInfo
+    },
+    brokerHost () {
+      return this.$config.brokerHost
+    },
+    brokerPorts () {
+      return this.$config.brokerPorts
+    },
+    accessDescription () {
+      if (!this.access) {
+        return
+      }
+      if (this.canWrite) {
+        return { text: 'You can write to this table' }
+      } else if (this.canRead) {
+        return { text: 'You can read all contents of this table' }
+      } else {
+        return { text: null }
       }
-      return `amqp://${window.location.hostname}:5672/dbrepo (username=${this.user.username}, password=yourpassword)`
     }
   },
   methods: {
@@ -182,6 +218,28 @@ export default {
         return false
       }
       return table.owner.id === this.user.id
+    },
+    amqpBadgeText (port) {
+      if (port === 5672) {
+        return 'insecure'
+      } else if (port === 5671) {
+        return 'secure'
+      }
+      return null
+    },
+    amqpBadgeColor (port) {
+      if (port === 5672) {
+        return 'warning'
+      } else if (port === 5671) {
+        return 'success'
+      }
+      return null
+    },
+    amqpString (port) {
+      if (!this.user) {
+        return null
+      }
+      return `amqp://${this.brokerHost}:${port}/dbrepo (username=${this.user.username}, password=yourpassword)`
     }
   }
 }
diff --git a/dbrepo-ui/pages/index.vue b/dbrepo-ui/pages/index.vue
index 646c9f58acfd050b36433773964771f8a79cdd2b..f2c22e4aef9f37fed61ebf5cd7272298498c2334 100644
--- a/dbrepo-ui/pages/index.vue
+++ b/dbrepo-ui/pages/index.vue
@@ -1,25 +1,14 @@
 <template>
   <div>
     <v-card flat tile>
-      <v-card-text>
+      <v-card-text v-if="infoLinks && infoLinks.length > 0">
         <div class="mb-2">Important Links</div>
         <div class="text--primary">
           <ul>
-            <li>
-              <a href="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/" target="_blank">Online Documentation</a>
-            </li>
-            <li>
-              <a href="https://doi.org/10.2218/ijdc.v17i1.825" target="_blank">System Description</a>
-            </li>
-            <li>
-              <a href="https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services" target="_blank">Sourcecode
-                Documentation</a>
-            </li>
-            <li>
-              <a href="https://hub.docker.com/u/dbrepo" target="_blank">Docker Images</a>
-            </li>
-            <li>
-              <a href="https://dbrepo2.ec.tuwien.ac.at/" target="_blank">Demo Instance</a>
+            <li v-for="(link, i) in infoLinks" :key="i">
+              <a :href="link.href" :target="link.blank ? '_blank' : 'self'">
+                {{ link.text }} <sup v-if="link.blank"><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup>
+              </a>
             </li>
           </ul>
         </div>
@@ -86,6 +75,12 @@
 
 <script>
 export default {
-  components: {}
+  computed: {
+    infoLinks () {
+      const infoLinks = this.$config.infoLinks
+      console.debug('info links', infoLinks)
+      return infoLinks
+    }
+  }
 }
 </script>
diff --git a/dbrepo-ui/pages/login.vue b/dbrepo-ui/pages/login.vue
index 057e21926280e8bfbcf6e259ea70c0bb3ae89f35..fad6973e5b069ef86ceb0c90be85625dc3236440 100644
--- a/dbrepo-ui/pages/login.vue
+++ b/dbrepo-ui/pages/login.vue
@@ -52,17 +52,8 @@
           </v-btn>
         </v-card-actions>
         <v-card-subtitle class="text-right">
-          <a v-if="openSearchUrl" class="mr-1" :href="openSearchUrl" target="_blank">
-            OpenSearch Admin <sup><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup>
-          </a>
-          <a v-if="rabbitMqUrl" class="mr-1" :href="rabbitMqUrl" target="_blank">
-            RabbitMQ Admin <sup><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup>
-          </a>
-          <a v-if="keycloakUrl" class="ml-1" :href="keycloakUrl" target="_blank">
-            Keycloak Admin <sup><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup>
-          </a>
-          <a v-if="minIoUrl" class="ml-1" :href="minIoUrl" target="_blank">
-            MinIO Admin <sup><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup>
+          <a v-for="(link, i) in loginLinks" :key="i" class="ml-1" :href="link.href" :target="link.blank ? '_blank' : 'self'">
+            {{ link.text }} <sup v-if="link.blank"><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup>
           </a>
         </v-card-subtitle>
       </v-card>
@@ -94,17 +85,10 @@ export default {
     user () {
       return this.$store.state.user
     },
-    keycloakUrl () {
-      return this.$config.keycloakLoginUrl
-    },
-    rabbitMqUrl () {
-      return this.$config.brokerLoginUrl
-    },
-    openSearchUrl () {
-      return this.$config.openSearchUrl
-    },
-    minIoUrl () {
-      return this.$config.minIoUrl
+    loginLinks () {
+      const loginLinks = this.$config.loginLinks
+      console.debug('login links', loginLinks)
+      return loginLinks
     }
   },
   mounted () {
diff --git a/dbrepo-ui/server-middleware/index.js b/dbrepo-ui/server-middleware/index.js
index 6d2f71275988547b857766ccae4c72055e8ecf64..40b785bac1f38f7748dc6ecb220eaef1c79af24b 100644
--- a/dbrepo-ui/server-middleware/index.js
+++ b/dbrepo-ui/server-middleware/index.js
@@ -1,18 +1,18 @@
+import config from '../dbrepo.config.json'
 const express = require('express')
 const multer = require('multer')
 const Minio = require('minio')
-const { s3storageHostname, s3storagePort, forceSsl, s3accessKeyId, s3secretAccessKey } = require('../config')
 const { buildQuery } = require('./query')
 const app = express()
 
 app.use(express.json())
 
 const minioClient = new Minio.Client({
-  endPoint: s3storageHostname,
-  port: s3storagePort,
-  useSSL: forceSsl,
-  accessKeyId: s3accessKeyId,
-  secretAccessKey: s3secretAccessKey
+  endPoint: config.storage.endpoint,
+  port: config.storage.port,
+  useSSL: config.storage.useSsl,
+  accessKeyId: config.storage.accessKey.id,
+  secretAccessKey: config.storage.accessKey.secret
 })
 
 app.post('/query/build', (req, res) => {
diff --git a/dbrepo-ui/store/index.js b/dbrepo-ui/store/index.js
index f6ca7efdb7d8140efbd3ef101714c43bb91a68a4..b919a18df9b3cd3076efd7f809a8406709147baf 100644
--- a/dbrepo-ui/store/index.js
+++ b/dbrepo-ui/store/index.js
@@ -28,12 +28,7 @@ const store = new Store({
     searchUsername: null,
     searchPassword: null,
     databaseCount: null,
-    doiUrl: null,
-    s3storageHostname: null,
-    s3storagePort: null,
-    s3accessKeyId: null,
-    s3secretAccessKey: null,
-    forceSsl: null
+    doiUrl: null
   },
   getters: {
     getTitle: state => state.title,
@@ -52,12 +47,7 @@ const store = new Store({
     getClientSecret: state => state.clientSecret,
     getSearchUsername: state => state.searchUsername,
     getSearchPassword: state => state.searchPassword,
-    getDatabaseCount: state => state.databaseCount,
-    getS3storageHostname: state => state.s3storageHostname,
-    getS3storagePort: state => state.s3storagePort,
-    getS3accessKeyId: state => state.s3accessKeyId,
-    getS3secretAccessKey: state => state.s3secretAccessKey,
-    getForceSsl: state => state.forceSsl
+    getDatabaseCount: state => state.databaseCount
   },
   mutations: {
     SET_TITLE (state, title) {
@@ -113,21 +103,6 @@ const store = new Store({
     },
     SET_DOI_URL (state, doiUrl) {
       state.doiUrl = doiUrl
-    },
-    SET_S3_STORAGE_HOSTNAME (state, s3storageHostname) {
-      state.s3storageHostname = s3storageHostname
-    },
-    SET_S3_STORAGE_PORT (state, s3storagePort) {
-      state.s3storagePort = s3storagePort
-    },
-    SET_S3_ACCESS_KEY_ID (state, s3accessKeyId) {
-      state.s3accessKeyId = s3accessKeyId
-    },
-    SET_S3_SECRET_ACCESS_KEY (state, s3secretAccessKey) {
-      state.s3secretAccessKey = s3secretAccessKey
-    },
-    SET_FORCE_SSL (state, forceSsl) {
-      state.forceSsl = forceSsl
     }
   },
   actions: {
diff --git a/dbrepo-upload-service/README.md b/dbrepo-upload-service/README.md
deleted file mode 100644
index a8d1e38506fc48b28470b7723de7c76f64865874..0000000000000000000000000000000000000000
--- a/dbrepo-upload-service/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Upload Service
-
-## Actuator
-
-- Info: http://localhost:1080
-- Prometheus: http://localhost:1080/metrics
-
-## TUS
-
-- File upload: http://localhost:1080/api/upload/files
\ No newline at end of file
diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml
index b93f1ad203b390b6538e3bc539bf3a9ed6d34cbe..a703eadeabf41b0f402e844e75dec406e93e9b6c 100644
--- a/docker-compose.prod.yml
+++ b/docker-compose.prod.yml
@@ -273,27 +273,8 @@ services:
     container_name: dbrepo-ui
     hostname: ui
     image: docker.io/dbrepo/ui:latest
-    environment:
-      BROKER_USERNAME: "${BROKER_USERNAME:-fda}"
-      BROKER_PASSWORD: "${BROKER_PASSWORD:-fda}"
-      BROKER_LOGIN_URL: "${BROKER_LOGIN_URL:-/admin/broker/}"
-      KEYCLOAK_LOGIN_URL: "${KEYCLOAK_LOGIN_URL:-/api/auth/admin/}"
-      OPENSEARCH_LOGIN_URL: "${OPENSEARCH_LOGIN_URL:-/admin/dashboard/}"
-      SHARED_FILESYSTEM: "${SHARED_FILESYSTEM:-/tmp}"
-      LOGO: "${LOGO:-/logo.png}"
-      SEARCH_USERNAME: "${SEARCH_USERNAME:-admin}"
-      SEARCH_PASSWORD: "${SEARCH_PASSWORD:-admin}"
-      VERSION: "${VERSION:-latest}"
-      TITLE: "${TITLE:-Database Repository}"
-      ICON: "${ICON:-/favicon.ico}"
-      DBREPO_CLIENT_ID: "${DBREPO_CLIENT_ID:-dbrepo-client}"
-      DBREPO_CLIENT_SECRET: "${DBREPO_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}"
-      S3_STORAGE_HOSTNAME: "${STORAGE_HOSTNAME:-storage-service}"
-      S3_STORAGE_PORT: "${STORAGE_PORT:-9000}"
-      S3_ACCESS_KEY_ID: "${STORAGE_USERNAME:-minioadmin}"
-      S3_SECRET_ACCESS_KEY: ${STORAGE_PASSWORD:-minioadmin}
-      FORCE_SSL: "${FORCE_SSL:-false}"
-      DOI_URL: "${DOI_URL:-https://doi.org}"
+    volumes:
+      - ./dist/dbrepo.config.json:/app/dbrepo.config.json
     depends_on:
       dbrepo-search-service:
         condition: service_started
diff --git a/docker-compose.yml b/docker-compose.yml
index 809b7546e0fc4a77c31a909ae7115816665ace9b..f38cb5618f150c5e5e1c439efef7e20aff3c8045 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -22,7 +22,7 @@ services:
     build: ./dbrepo-metadata-db
     volumes:
       - metadata-db-data:/bitnami/mariadb
-      - ./dist/setup-schema_local.sql:/docker-entrypoint-initdb.d/setup-schema_local.sql
+      - ./dbrepo-metadata-db/setup-schema_local.sql:/docker-entrypoint-initdb.d/setup-schema_local.sql
     ports:
       - "3306:3306"
     environment:
@@ -203,11 +203,11 @@ services:
       - "5672:5672"
       - "15672:15672"
     volumes:
-      - ./dist/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
-      - ./dist/enabled_plugins:/etc/rabbitmq/enabled_plugins
-      - ./dist/cert.pem:/app/cert.pem
-      - ./dist/pubkey.pem:/app/pubkey.pem
-      - ./dist/definitions.json:/app/definitions.json
+      - ./dbrepo-broker-service/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
+      - ./dbrepo-broker-service/enabled_plugins:/etc/rabbitmq/enabled_plugins
+      - ./dbrepo-broker-service/cert.pem:/app/cert.pem
+      - ./dbrepo-broker-service/pubkey.pem:/app/pubkey.pem
+      - ./dbrepo-broker-service/definitions.json:/app/definitions.json
       - broker-service-data:/bitnami/rabbitmq/mnesia
     healthcheck:
       test: rabbitmq-diagnostics -q is_running | grep 'is fully booted and running'
@@ -281,27 +281,6 @@ services:
     hostname: ui
     image: dbrepo-ui:latest
     build: ./dbrepo-ui
-    environment:
-      BROKER_USERNAME: "${BROKER_USERNAME:-fda}"
-      BROKER_PASSWORD: "${BROKER_PASSWORD:-fda}"
-      BROKER_LOGIN_URL: "${BROKER_LOGIN_URL:-/admin/broker/}"
-      KEYCLOAK_LOGIN_URL: "${KEYCLOAK_LOGIN_URL:-/api/auth/admin/}"
-      OPENSEARCH_LOGIN_URL: "${OPENSEARCH_LOGIN_URL:-/admin/dashboard/}"
-      SHARED_FILESYSTEM: "${SHARED_FILESYSTEM:-/tmp}"
-      LOGO: "${LOGO:-/logo.png}"
-      SEARCH_USERNAME: "${SEARCH_USERNAME:-admin}"
-      SEARCH_PASSWORD: "${SEARCH_PASSWORD:-admin}"
-      VERSION: "${VERSION:-latest}"
-      TITLE: "${TITLE:-Database Repository}"
-      ICON: "${ICON:-/favicon.ico}"
-      DBREPO_CLIENT_ID: "${DBREPO_CLIENT_ID:-dbrepo-client}"
-      DBREPO_CLIENT_SECRET: "${DBREPO_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}"
-      S3_STORAGE_HOSTNAME: "${STORAGE_HOSTNAME:-storage-service}"
-      S3_STORAGE_PORT: "${STORAGE_PORT:-9000}"
-      S3_ACCESS_KEY_ID: "${STORAGE_USERNAME:-minioadmin}"
-      S3_SECRET_ACCESS_KEY: ${STORAGE_PASSWORD:-minioadmin}
-      FORCE_SSL: "${FORCE_SSL:-false}"
-      DOI_URL: "${DOI_URL:-https://doi.org}"
     depends_on:
       dbrepo-search-service:
         condition: service_started
@@ -319,7 +298,7 @@ services:
       - "80:80"
       - "443:443"
     volumes:
-      - ./dist/dbrepo.conf:/etc/nginx/conf.d/default.conf
+      - ./dbrepo-gateway-service/dbrepo.conf:/etc/nginx/conf.d/default.conf
     depends_on:
       dbrepo-analyse-service:
         condition: service_healthy
@@ -342,7 +321,7 @@ services:
     hostname: search-db-dashboard
     image: docker.io/opensearchproject/opensearch-dashboards:2.10.0
     volumes:
-      - ./dist/opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml
+      - ./dbrepo-search-db/opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml
     ports:
       - "5601:5601"
     depends_on:
diff --git a/install.sh b/install.sh
index 390f09dc43d50d0f185be23580a5eaa06137517b..0a2941913fc5772aad5d79ee48448ba9c30fe408 100644
--- a/install.sh
+++ b/install.sh
@@ -22,6 +22,7 @@ curl -sSL -o ./dist/pubkey.pem https://gitlab.phaidra.org/fair-data-austria-db-r
 curl -sSL -o ./dist/definitions.json https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-broker-service/definitions.json
 curl -sSL -o ./dist/dbrepo.conf https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-gateway-service/dbrepo.conf
 curl -sSL -o ./dist/opensearch_dashboards.yml https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-search-db/opensearch_dashboards.yml
+curl -sSL -o ./dist/dbrepo.config.json https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-ui/dbrepo.config.json
 
 echo "[📦] Pulling images ..."
 docker compose pull