diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index efc0d9d4c84334e8dc18661ed698493284cdab3a..d43f738ca6db6bf7b535291a96458877c2df6375 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -12,7 +12,7 @@ default:
   tags:
     - docker
   before_script:
-    - npm --version  # For debugging
+    - npm --version # For debugging
     - node --version
     - npm install --no-fund
 
@@ -38,14 +38,12 @@ build:
   stage: deploy
   image:
     name: gcr.io/kaniko-project/executor:v1.23.2-debug
-    entrypoint: [ "" ]
-  dependencies: [ ]
-  cache: [ ]
+    entrypoint: [""]
+  dependencies: []
+  cache: []
   before_script:
     - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$(echo -n $CI_DEPENDENCY_PROXY_SERVER | awk -F[:] '{print $1}')\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
 
-
-
 publish-main-docker-container-job:
   extends: .build-container-job
   only:
@@ -57,6 +55,7 @@ publish-main-docker-container-job:
       --dockerfile "${CI_PROJECT_DIR}/Dockerfile"
       --destination "${CI_REGISTRY_IMAGE}:main-${CI_COMMIT_SHA}"
       --destination "${CI_REGISTRY_IMAGE}:main-latest"
+      --registry-mirror "${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}"
 
 publish-docker-container-job:
   extends: .build-container-job
@@ -70,3 +69,4 @@ publish-docker-container-job:
       --destination "${CI_REGISTRY_IMAGE}:$(echo ${CI_COMMIT_TAG} | cut -d'.' -f1-2)"
       --destination "${CI_REGISTRY_IMAGE}:$(echo ${CI_COMMIT_TAG} | cut -d'.' -f1)"
       --destination "${CI_REGISTRY_IMAGE}:latest"
+      --registry-mirror "${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}"
diff --git a/openapi-ts.config.ts b/openapi-ts.config.ts
index 5ddf6587a90c9e86778d915e27db0022c667d053..0e4a01c23662568ea7977afc62ff9bea5cc07abe 100644
--- a/openapi-ts.config.ts
+++ b/openapi-ts.config.ts
@@ -3,6 +3,7 @@ import { defineConfig } from "@hey-api/openapi-ts";
 export default defineConfig({
   client: "@hey-api/client-axios",
   input: "./openapi-clowm.json",
+  experimentalParser: false,
   output: {
     lint: "eslint",
     format: "prettier",
diff --git a/package-lock.json b/package-lock.json
index cb64cd8f9c7927009434d272bc2c63c2e74bd20f..5f43b75741ccc4fb6c639a38a8506458099d8fa8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,7 +18,7 @@
         "ajv": "~8.17.0",
         "bootstrap": "~5.3.0",
         "chart.js": "~4.4.0",
-        "chartjs-plugin-zoom": "~2.1.0",
+        "chartjs-plugin-zoom": "~2.2.0",
         "dayjs": "~1.11.0",
         "dompurify": "~3.2.0",
         "filesize": "~10.1.0",
@@ -30,7 +30,7 @@
         "sortablejs": "^1.15.2",
         "vue": "~3.5.0",
         "vue-matomo": "^4.2.0",
-        "vue-router": "~4.4.0",
+        "vue-router": "~4.5.0",
         "vue3-cookies": "~1.0.0"
       },
       "devDependencies": {
@@ -52,7 +52,7 @@
         "eslint": "~9.12.0",
         "eslint-plugin-vue": "~9.31.0",
         "highlight.js": "^11.9.0",
-        "prettier": "~3.3.0",
+        "prettier": "~3.4.0",
         "sass": "^1.66.0",
         "typescript": "~5.5.0",
         "vite": "~5.4.0",
@@ -281,9 +281,9 @@
       }
     },
     "node_modules/@aws-sdk/client-s3": {
-      "version": "3.699.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.699.0.tgz",
-      "integrity": "sha512-x3wV9e6d0esA6Yyg3xWJucMYd/O8JVrNCJnGm/sz3lMYOQGefpVZKZZsHcnzQcTEVAQMF/T5/cdfdvPzIx/esA==",
+      "version": "3.701.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.701.0.tgz",
+      "integrity": "sha512-7iXmPC5r7YNjvwSsRbGq9oLVgfIWZesXtEYl908UqMmRj2sVAW/leLopDnbLT7TEedqlK0RasOZT05I0JTNdKw==",
       "license": "Apache-2.0",
       "dependencies": {
         "@aws-crypto/sha1-browser": "5.2.0",
@@ -295,7 +295,7 @@
         "@aws-sdk/credential-provider-node": "3.699.0",
         "@aws-sdk/middleware-bucket-endpoint": "3.696.0",
         "@aws-sdk/middleware-expect-continue": "3.696.0",
-        "@aws-sdk/middleware-flexible-checksums": "3.697.0",
+        "@aws-sdk/middleware-flexible-checksums": "3.701.0",
         "@aws-sdk/middleware-host-header": "3.696.0",
         "@aws-sdk/middleware-location-constraint": "3.696.0",
         "@aws-sdk/middleware-logger": "3.696.0",
@@ -666,9 +666,9 @@
       }
     },
     "node_modules/@aws-sdk/lib-storage": {
-      "version": "3.699.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.699.0.tgz",
-      "integrity": "sha512-l8Eeb0am8nqUdAh5UVJJu0h3x8NGcs1yKe7riIT+gP5LUSTxdQDQfaWdMK9du9+M+Pbw0N93i1PTLVVbgJNT1Q==",
+      "version": "3.701.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.701.0.tgz",
+      "integrity": "sha512-eAbJ/3OgyFp1NnFdQfkZ7PuKCjrhbSQWf0EVTMhlg4aE5piCZ1We38NI1dQ58yr53rGc2gBkbYr8+/9CehpEvA==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/abort-controller": "^3.1.7",
@@ -683,7 +683,7 @@
         "node": ">=16.0.0"
       },
       "peerDependencies": {
-        "@aws-sdk/client-s3": "^3.699.0"
+        "@aws-sdk/client-s3": "^3.701.0"
       }
     },
     "node_modules/@aws-sdk/middleware-bucket-endpoint": {
@@ -720,9 +720,9 @@
       }
     },
     "node_modules/@aws-sdk/middleware-flexible-checksums": {
-      "version": "3.697.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.697.0.tgz",
-      "integrity": "sha512-K/y43P+NuHu5+21/29BoJSltcPekvcCU8i74KlGGHbW2Z105e5QVZlFjxivcPOjOA3gdC0W4SoFSIWam5RBhzw==",
+      "version": "3.701.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.701.0.tgz",
+      "integrity": "sha512-adNaPCyTT+CiVM0ufDiO1Fe7nlRmJdI9Hcgj0M9S6zR7Dw70Ra5z8Lslkd7syAccYvZaqxLklGjPQH/7GNxwTA==",
       "license": "Apache-2.0",
       "dependencies": {
         "@aws-crypto/crc32": "5.2.0",
@@ -876,9 +876,9 @@
       }
     },
     "node_modules/@aws-sdk/s3-request-presigner": {
-      "version": "3.699.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.699.0.tgz",
-      "integrity": "sha512-r4/A55LfdqtVmaa8FEaN4uvNiJK+fjtPdX1WgscOa+BA0tkzFGXzmAKmtw/gLhJtgsDPc0Pgd15nQJnnPn94Mg==",
+      "version": "3.701.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.701.0.tgz",
+      "integrity": "sha512-S4eKSZxhDcVmUoHv9N4dCxGde7V4v60R/+qFz/LgHxU++XOZ2npM/jqX5I9vT4uOkHLwQD6DgkL0j37vZpsqxA==",
       "license": "Apache-2.0",
       "dependencies": {
         "@aws-sdk/signature-v4-multi-region": "3.696.0",
@@ -1694,9 +1694,9 @@
       }
     },
     "node_modules/@hey-api/client-axios": {
-      "version": "0.2.10",
-      "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.2.10.tgz",
-      "integrity": "sha512-EXTf9WcZCyzRIi1JEbKbJ4JvB+TLy9WsSaBKRUwd7d8c6PYQ+MRJCTnkzGJk1wXkeBLqJEwyf2IZH/qmCkDhqg==",
+      "version": "0.2.11",
+      "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.2.11.tgz",
+      "integrity": "sha512-jyJAsEkdi5ybAGTSfZD8gaKRCVid25h3qWQQ+BzgmBmlw2X5dIQaXXXnOxAQJxLD9Q+FWUh2MspLKIZ16MQ3Dw==",
       "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/hey-api"
@@ -1706,9 +1706,9 @@
       }
     },
     "node_modules/@hey-api/openapi-ts": {
-      "version": "0.57.0",
-      "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.57.0.tgz",
-      "integrity": "sha512-TFcr7CYAFYLJVjJzCNk8bbGpLhn5K7PR3SHvBizVCZM4PdrcbTx6++W7FyKq84TGXuptN70+LvM+8bOSf3PgCw==",
+      "version": "0.57.1",
+      "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.57.1.tgz",
+      "integrity": "sha512-CZ2W1Ma4Z1zPI2M7mR5wfgTvDnxYenv/zAiX4wYgUX3n8GlWWjRkAQ02TgwBiHD3T9isR2zPyub/8rqyZ5yIsA==",
       "dev": true,
       "license": "FSL-1.1-MIT",
       "dependencies": {
@@ -3228,13 +3228,13 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.9.3",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.3.tgz",
-      "integrity": "sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==",
+      "version": "22.10.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz",
+      "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "undici-types": "~6.19.8"
+        "undici-types": "~6.20.0"
       }
     },
     "node_modules/@types/qs": {
@@ -3273,17 +3273,17 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.15.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz",
-      "integrity": "sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz",
+      "integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.15.0",
-        "@typescript-eslint/type-utils": "8.15.0",
-        "@typescript-eslint/utils": "8.15.0",
-        "@typescript-eslint/visitor-keys": "8.15.0",
+        "@typescript-eslint/scope-manager": "8.16.0",
+        "@typescript-eslint/type-utils": "8.16.0",
+        "@typescript-eslint/utils": "8.16.0",
+        "@typescript-eslint/visitor-keys": "8.16.0",
         "graphemer": "^1.4.0",
         "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
@@ -3307,16 +3307,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.15.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.15.0.tgz",
-      "integrity": "sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz",
+      "integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.15.0",
-        "@typescript-eslint/types": "8.15.0",
-        "@typescript-eslint/typescript-estree": "8.15.0",
-        "@typescript-eslint/visitor-keys": "8.15.0",
+        "@typescript-eslint/scope-manager": "8.16.0",
+        "@typescript-eslint/types": "8.16.0",
+        "@typescript-eslint/typescript-estree": "8.16.0",
+        "@typescript-eslint/visitor-keys": "8.16.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -3336,14 +3336,14 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.15.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz",
-      "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz",
+      "integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.15.0",
-        "@typescript-eslint/visitor-keys": "8.15.0"
+        "@typescript-eslint/types": "8.16.0",
+        "@typescript-eslint/visitor-keys": "8.16.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3354,14 +3354,14 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.15.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz",
-      "integrity": "sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz",
+      "integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.15.0",
-        "@typescript-eslint/utils": "8.15.0",
+        "@typescript-eslint/typescript-estree": "8.16.0",
+        "@typescript-eslint/utils": "8.16.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^1.3.0"
       },
@@ -3382,9 +3382,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.15.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz",
-      "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz",
+      "integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3396,14 +3396,14 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.15.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz",
-      "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz",
+      "integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
-        "@typescript-eslint/types": "8.15.0",
-        "@typescript-eslint/visitor-keys": "8.15.0",
+        "@typescript-eslint/types": "8.16.0",
+        "@typescript-eslint/visitor-keys": "8.16.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -3425,16 +3425,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.15.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.15.0.tgz",
-      "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz",
+      "integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.15.0",
-        "@typescript-eslint/types": "8.15.0",
-        "@typescript-eslint/typescript-estree": "8.15.0"
+        "@typescript-eslint/scope-manager": "8.16.0",
+        "@typescript-eslint/types": "8.16.0",
+        "@typescript-eslint/typescript-estree": "8.16.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3453,13 +3453,13 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.15.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz",
-      "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz",
+      "integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.15.0",
+        "@typescript-eslint/types": "8.16.0",
         "eslint-visitor-keys": "^4.2.0"
       },
       "engines": {
@@ -3484,16 +3484,16 @@
       }
     },
     "node_modules/@vitejs/plugin-vue": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.0.tgz",
-      "integrity": "sha512-7n7KdUEtx/7Yl7I/WVAMZ1bEb0eVvXF3ummWTeLcs/9gvo9pJhuLdouSXGjdZ/MKD1acf1I272+X0RMua4/R3g==",
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz",
+      "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
         "node": "^18.0.0 || >=20.0.0"
       },
       "peerDependencies": {
-        "vite": "^5.0.0",
+        "vite": "^5.0.0 || ^6.0.0",
         "vue": "^3.2.25"
       }
     },
@@ -3609,15 +3609,15 @@
       }
     },
     "node_modules/@vue/eslint-config-typescript": {
-      "version": "14.1.3",
-      "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.1.3.tgz",
-      "integrity": "sha512-L4NUJQz/0We2QYtrNwRAGRy4KfpOagl5V3MpZZ+rQ51a+bKjlKYYrugi7lp7PIX8LolRgu06ZwDoswnSGWnAmA==",
+      "version": "14.1.4",
+      "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.1.4.tgz",
+      "integrity": "sha512-NcG1adLFde+t+TCaXlL38PHuZlBEuwDahgrPVyB052m9QeHOswVIAplMD2cXgH8vXieAVNF1+mXvyilpIO3+kg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "^8.8.1",
+        "@typescript-eslint/eslint-plugin": "^8.15.0",
         "fast-glob": "^3.3.2",
-        "typescript-eslint": "^8.8.1",
+        "typescript-eslint": "^8.15.0",
         "vue-eslint-parser": "^9.4.3"
       },
       "engines": {
@@ -3854,9 +3854,9 @@
       }
     },
     "node_modules/axios": {
-      "version": "1.7.7",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
-      "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz",
+      "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==",
       "license": "MIT",
       "peer": true,
       "dependencies": {
@@ -4210,9 +4210,9 @@
       }
     },
     "node_modules/chartjs-plugin-zoom": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.1.0.tgz",
-      "integrity": "sha512-7lMimfQCUaIJLhPJaWSAA4gw+1m8lyR3Wn+M3MxjHbM/XxRUnOxN7cM5RR9jUmxmyW0h7L2hZ8KhvUsqrFxy/Q==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.2.0.tgz",
+      "integrity": "sha512-in6kcdiTlP6npIVLMd4zXZ08PDUXC52gZ4FAy5oyjk1zX3gKarXMAof7B9eFiisf9WOC3bh2saHg+J5WtLXZeA==",
       "license": "MIT",
       "dependencies": {
         "@types/hammerjs": "^2.0.45",
@@ -4249,9 +4249,9 @@
       }
     },
     "node_modules/cipher-base": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.5.tgz",
-      "integrity": "sha512-xq7ICKB4TMHUx7Tz1L9O2SGKOhYMOTR32oir45Bq28/AQTpHogKgHcoYFSdRbMtddl+ozNXfXY9jWcgYKmde0w==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz",
+      "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5999,9 +5999,9 @@
       "license": "MIT"
     },
     "node_modules/magic-string": {
-      "version": "0.30.13",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz",
-      "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==",
+      "version": "0.30.14",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz",
+      "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==",
       "license": "MIT",
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.5.0"
@@ -6225,9 +6225,9 @@
       "license": "MIT"
     },
     "node_modules/nanoid": {
-      "version": "3.3.7",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
-      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "version": "3.3.8",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
       "funding": [
         {
           "type": "github",
@@ -6798,9 +6798,9 @@
       }
     },
     "node_modules/prettier": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
-      "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz",
+      "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -7459,9 +7459,9 @@
       }
     },
     "node_modules/ts-api-utils": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.1.tgz",
-      "integrity": "sha512-5RU2/lxTA3YUZxju61HO2U6EoZLvBLtmV2mbTvqyu4a/7s7RmJPT+1YekhMVsQhznRWk/czIwDUg+V8Q9ZuG4w==",
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.2.tgz",
+      "integrity": "sha512-ZF5gQIQa/UmzfvxbHZI3JXN0/Jt+vnAfAviNRAMc491laiK6YCLpCW9ft8oaCRFOTxCZtUTE6XB0ZQAe3olntw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7525,15 +7525,15 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.15.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.15.0.tgz",
-      "integrity": "sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.16.0.tgz",
+      "integrity": "sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.15.0",
-        "@typescript-eslint/parser": "8.15.0",
-        "@typescript-eslint/utils": "8.15.0"
+        "@typescript-eslint/eslint-plugin": "8.16.0",
+        "@typescript-eslint/parser": "8.16.0",
+        "@typescript-eslint/utils": "8.16.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -7573,9 +7573,9 @@
       }
     },
     "node_modules/undici-types": {
-      "version": "6.19.8",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
-      "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+      "version": "6.20.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
       "dev": true,
       "license": "MIT"
     },
@@ -7829,9 +7829,9 @@
       }
     },
     "node_modules/vue-router": {
-      "version": "4.4.5",
-      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz",
-      "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==",
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz",
+      "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==",
       "license": "MIT",
       "dependencies": {
         "@vue/devtools-api": "^6.6.4"
diff --git a/package.json b/package.json
index a79dfb56576c83e9f35a96f42976cec9818f2ecd..fcc3a0b2c35e492037b5afc817ef178eb7dd735c 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
     "ajv": "~8.17.0",
     "bootstrap": "~5.3.0",
     "chart.js": "~4.4.0",
-    "chartjs-plugin-zoom": "~2.1.0",
+    "chartjs-plugin-zoom": "~2.2.0",
     "dayjs": "~1.11.0",
     "dompurify": "~3.2.0",
     "filesize": "~10.1.0",
@@ -33,7 +33,7 @@
     "sortablejs": "^1.15.2",
     "vue": "~3.5.0",
     "vue-matomo": "^4.2.0",
-    "vue-router": "~4.4.0",
+    "vue-router": "~4.5.0",
     "vue3-cookies": "~1.0.0"
   },
   "devDependencies": {
@@ -55,7 +55,7 @@
     "eslint": "~9.12.0",
     "eslint-plugin-vue": "~9.31.0",
     "highlight.js": "^11.9.0",
-    "prettier": "~3.3.0",
+    "prettier": "~3.4.0",
     "sass": "^1.66.0",
     "typescript": "~5.5.0",
     "vite": "~5.4.0",
diff --git a/src/App.vue b/src/App.vue
index 4f96203d759b40dc40a7028367c0b4d5eb006603..3c0d059dd78da8e2526b4ba210d4a22403ff2194 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -176,10 +176,4 @@ onMounted(() => {
   <AppFooter />
 </template>
 
-<style scoped>
-@media (min-width: 1550px) {
-  .container-xxxl {
-    max-width: 1500px !important;
-  }
-}
-</style>
+<style scoped></style>
diff --git a/src/assets/main.css b/src/assets/main.css
index 0409e705a7f134cc895ac2c58aa18b6ceb835a67..0d119addbd61fb34df399c995bbc3141962f312c 100644
--- a/src/assets/main.css
+++ b/src/assets/main.css
@@ -46,3 +46,9 @@ pre {
 .parameter-form-tooltip {
     --bs-tooltip-max-width: 350px;
 }
+
+@media (min-width: 1550px) {
+    .container-xxxl {
+        max-width: 1500px !important;
+    }
+}
\ No newline at end of file
diff --git a/src/client/sdk.gen.ts b/src/client/sdk.gen.ts
index 24a6202224c54f87178b8f8ab34a264f7a5f798b..eb05917e3aad9a4d00b8d768b5dd3f7a4815dbcb 100644
--- a/src/client/sdk.gen.ts
+++ b/src/client/sdk.gen.ts
@@ -3,7 +3,7 @@
 import {
   createClient,
   createConfig,
-  type Options,
+  type OptionsLegacyParser,
   formDataBodySerializer,
 } from "@hey-api/client-axios";
 import type {
@@ -294,7 +294,7 @@ export class ApiTokenService {
    * Permissions `api_token:list_all` required. See parameter `uid` for exception.
    */
   public static apiTokenListToken<ThrowOnError extends boolean = false>(
-    options?: Options<ApiTokenListTokenData, ThrowOnError>,
+    options?: OptionsLegacyParser<ApiTokenListTokenData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       ApiTokenListTokenResponse,
@@ -313,7 +313,7 @@ export class ApiTokenService {
    * Permission `api_token:create` required.
    */
   public static apiTokenCreateToken<ThrowOnError extends boolean = false>(
-    options: Options<ApiTokenCreateTokenData, ThrowOnError>,
+    options: OptionsLegacyParser<ApiTokenCreateTokenData, ThrowOnError>,
   ) {
     return (options?.client ?? client).post<
       ApiTokenCreateTokenResponse,
@@ -333,7 +333,7 @@ export class ApiTokenService {
    * otherwise `api_token:read_any` required.
    */
   public static apiTokenGetToken<ThrowOnError extends boolean = false>(
-    options: Options<ApiTokenGetTokenData, ThrowOnError>,
+    options: OptionsLegacyParser<ApiTokenGetTokenData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       ApiTokenGetTokenResponse,
@@ -353,7 +353,7 @@ export class ApiTokenService {
    * otherwise `api_token:delete_any` required.
    */
   public static apiTokenDeleteToken<ThrowOnError extends boolean = false>(
-    options: Options<ApiTokenDeleteTokenData, ThrowOnError>,
+    options: OptionsLegacyParser<ApiTokenDeleteTokenData, ThrowOnError>,
   ) {
     return (options?.client ?? client).delete<
       ApiTokenDeleteTokenResponse,
@@ -372,7 +372,7 @@ export class AuthService {
    * Redirect route to OIDC provider to kickstart the login process.
    */
   public static authLogin<ThrowOnError extends boolean = false>(
-    options?: Options<AuthLoginData, ThrowOnError>,
+    options?: OptionsLegacyParser<AuthLoginData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<void, unknown, ThrowOnError>({
       ...options,
@@ -394,7 +394,7 @@ export class AuthService {
    * This JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.
    */
   public static authLoginCallback<ThrowOnError extends boolean = false>(
-    options: Options<AuthLoginCallbackData, ThrowOnError>,
+    options: OptionsLegacyParser<AuthLoginCallbackData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<void, unknown, ThrowOnError>({
       ...options,
@@ -407,7 +407,7 @@ export class AuthService {
    * Logout the user from the system by deleting the bearer cookie.
    */
   public static authLogout<ThrowOnError extends boolean = false>(
-    options?: Options<unknown, ThrowOnError>,
+    options?: OptionsLegacyParser<unknown, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<void, unknown, ThrowOnError>({
       ...options,
@@ -424,7 +424,7 @@ export class BucketService {
    * Permission `bucket:list_all` required. See parameter `owner_id` for exception.
    */
   public static bucketListBuckets<ThrowOnError extends boolean = false>(
-    options?: Options<BucketListBucketsData, ThrowOnError>,
+    options?: OptionsLegacyParser<BucketListBucketsData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       BucketListBucketsResponse,
@@ -447,7 +447,7 @@ export class BucketService {
    * Permission `bucket:create` required.
    */
   public static bucketCreateBucket<ThrowOnError extends boolean = false>(
-    options: Options<BucketCreateBucketData, ThrowOnError>,
+    options: OptionsLegacyParser<BucketCreateBucketData, ThrowOnError>,
   ) {
     return (options?.client ?? client).post<
       BucketCreateBucketResponse,
@@ -467,7 +467,7 @@ export class BucketService {
    * otherwise `bucket:list_all`
    */
   public static bucketListBucketOtrs<ThrowOnError extends boolean = false>(
-    options?: Options<BucketListBucketOtrsData, ThrowOnError>,
+    options?: OptionsLegacyParser<BucketListBucketOtrsData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       BucketListBucketOtrsResponse,
@@ -487,7 +487,7 @@ export class BucketService {
    * otherwise `bucket:read_any` required.
    */
   public static bucketGetBucket<ThrowOnError extends boolean = false>(
-    options: Options<BucketGetBucketData, ThrowOnError>,
+    options: OptionsLegacyParser<BucketGetBucketData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       BucketGetBucketResponse,
@@ -507,7 +507,7 @@ export class BucketService {
    * otherwise `bucket:delete_any` required.
    */
   public static bucketDeleteBucket<ThrowOnError extends boolean = false>(
-    options: Options<BucketDeleteBucketData, ThrowOnError>,
+    options: OptionsLegacyParser<BucketDeleteBucketData, ThrowOnError>,
   ) {
     return (options?.client ?? client).delete<
       BucketDeleteBucketResponse,
@@ -527,7 +527,7 @@ export class BucketService {
    * otherwise `bucket:read_any` required.
    */
   public static bucketGetBucketOtr<ThrowOnError extends boolean = false>(
-    options: Options<BucketGetBucketOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<BucketGetBucketOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       BucketGetBucketOtrResponse,
@@ -547,7 +547,7 @@ export class BucketService {
    * otherwise `bucket:update_any` required.
    */
   public static bucketCreateBucketOtr<ThrowOnError extends boolean = false>(
-    options: Options<BucketCreateBucketOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<BucketCreateBucketOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).post<
       BucketCreateBucketOtrResponse,
@@ -567,7 +567,7 @@ export class BucketService {
    * otherwise `bucket:update_any` required.
    */
   public static bucketAcceptBucketOtr<ThrowOnError extends boolean = false>(
-    options: Options<BucketAcceptBucketOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<BucketAcceptBucketOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).patch<
       BucketAcceptBucketOtrResponse,
@@ -587,7 +587,7 @@ export class BucketService {
    * otherwise `bucket:update_any` required.
    */
   public static bucketDeleteBucketOtr<ThrowOnError extends boolean = false>(
-    options: Options<BucketDeleteBucketOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<BucketDeleteBucketOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).delete<
       BucketDeleteBucketOtrResponse,
@@ -608,7 +608,12 @@ export class BucketService {
    */
   public static bucketUpdateBucketPublicState<
     ThrowOnError extends boolean = false,
-  >(options: Options<BucketUpdateBucketPublicStateData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      BucketUpdateBucketPublicStateData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).patch<
       BucketUpdateBucketPublicStateResponse,
       BucketUpdateBucketPublicStateError,
@@ -626,7 +631,7 @@ export class BucketService {
    * Permission `bucket:update_any` required.
    */
   public static bucketUpdateBucketLimits<ThrowOnError extends boolean = false>(
-    options: Options<BucketUpdateBucketLimitsData, ThrowOnError>,
+    options: OptionsLegacyParser<BucketUpdateBucketLimitsData, ThrowOnError>,
   ) {
     return (options?.client ?? client).patch<
       BucketUpdateBucketLimitsResponse,
@@ -648,7 +653,12 @@ export class BucketPermissionService {
    */
   public static bucketPermissionListPermissions<
     ThrowOnError extends boolean = false,
-  >(options?: Options<BucketPermissionListPermissionsData, ThrowOnError>) {
+  >(
+    options?: OptionsLegacyParser<
+      BucketPermissionListPermissionsData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).get<
       BucketPermissionListPermissionsResponse,
       BucketPermissionListPermissionsError,
@@ -667,7 +677,12 @@ export class BucketPermissionService {
    */
   public static bucketPermissionCreatePermission<
     ThrowOnError extends boolean = false,
-  >(options: Options<BucketPermissionCreatePermissionData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      BucketPermissionCreatePermissionData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).post<
       BucketPermissionCreatePermissionResponse,
       BucketPermissionCreatePermissionError,
@@ -688,7 +703,10 @@ export class BucketPermissionService {
   public static bucketPermissionListPermissionsPerUser<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<BucketPermissionListPermissionsPerUserData, ThrowOnError>,
+    options: OptionsLegacyParser<
+      BucketPermissionListPermissionsPerUserData,
+      ThrowOnError
+    >,
   ) {
     return (options?.client ?? client).get<
       BucketPermissionListPermissionsPerUserResponse,
@@ -710,7 +728,7 @@ export class BucketPermissionService {
   public static bucketPermissionListPermissionsPerBucket<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       BucketPermissionListPermissionsPerBucketData,
       ThrowOnError
     >,
@@ -735,7 +753,10 @@ export class BucketPermissionService {
   public static bucketPermissionGetPermissionForBucket<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<BucketPermissionGetPermissionForBucketData, ThrowOnError>,
+    options: OptionsLegacyParser<
+      BucketPermissionGetPermissionForBucketData,
+      ThrowOnError
+    >,
   ) {
     return (options?.client ?? client).get<
       BucketPermissionGetPermissionForBucketResponse,
@@ -755,7 +776,12 @@ export class BucketPermissionService {
    */
   public static bucketPermissionUpdatePermission<
     ThrowOnError extends boolean = false,
-  >(options: Options<BucketPermissionUpdatePermissionData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      BucketPermissionUpdatePermissionData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).put<
       BucketPermissionUpdatePermissionResponse,
       BucketPermissionUpdatePermissionError,
@@ -775,7 +801,12 @@ export class BucketPermissionService {
    */
   public static bucketPermissionDeletePermission<
     ThrowOnError extends boolean = false,
-  >(options: Options<BucketPermissionDeletePermissionData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      BucketPermissionDeletePermissionData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).delete<
       BucketPermissionDeletePermissionResponse,
       BucketPermissionDeletePermissionError,
@@ -795,7 +826,7 @@ export class NewsService {
    * Permission `news:create` required.
    */
   public static newsCreateNews<ThrowOnError extends boolean = false>(
-    options: Options<NewsCreateNewsData, ThrowOnError>,
+    options: OptionsLegacyParser<NewsCreateNewsData, ThrowOnError>,
   ) {
     return (options?.client ?? client).post<
       NewsCreateNewsResponse,
@@ -817,7 +848,7 @@ export class NewsService {
    * Permission `news:list` required.
    */
   public static newsListNews<ThrowOnError extends boolean = false>(
-    options?: Options<NewsListNewsData, ThrowOnError>,
+    options?: OptionsLegacyParser<NewsListNewsData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       NewsListNewsResponse,
@@ -836,7 +867,7 @@ export class NewsService {
    * Permission `news:list` required.
    */
   public static newsListLatestNews<ThrowOnError extends boolean = false>(
-    options?: Options<unknown, ThrowOnError>,
+    options?: OptionsLegacyParser<unknown, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       NewsListLatestNewsResponse,
@@ -855,7 +886,7 @@ export class NewsService {
    * Permission `news:read` required.
    */
   public static newsGetNews<ThrowOnError extends boolean = false>(
-    options: Options<NewsGetNewsData, ThrowOnError>,
+    options: OptionsLegacyParser<NewsGetNewsData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       NewsGetNewsResponse,
@@ -874,7 +905,7 @@ export class NewsService {
    * Permission `news:delete` required.
    */
   public static newsDeleteNews<ThrowOnError extends boolean = false>(
-    options: Options<NewsDeleteNewsData, ThrowOnError>,
+    options: OptionsLegacyParser<NewsDeleteNewsData, ThrowOnError>,
   ) {
     return (options?.client ?? client).delete<
       NewsDeleteNewsResponse,
@@ -895,7 +926,7 @@ export class ResourceService {
    * Permission `resource:create` required.
    */
   public static resourceCreateResource<ThrowOnError extends boolean = false>(
-    options: Options<ResourceCreateResourceData, ThrowOnError>,
+    options: OptionsLegacyParser<ResourceCreateResourceData, ThrowOnError>,
   ) {
     return (options?.client ?? client).post<
       ResourceCreateResourceResponse,
@@ -914,7 +945,7 @@ export class ResourceService {
    * Permission `resource:list` required.
    */
   public static resourceListResources<ThrowOnError extends boolean = false>(
-    options?: Options<ResourceListResourcesData, ThrowOnError>,
+    options?: OptionsLegacyParser<ResourceListResourcesData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       ResourceListResourcesResponse,
@@ -933,7 +964,7 @@ export class ResourceService {
    * Permission `resource:update_any` required.
    */
   public static resourceListSyncRequests<ThrowOnError extends boolean = false>(
-    options?: Options<unknown, ThrowOnError>,
+    options?: OptionsLegacyParser<unknown, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       ResourceListSyncRequestsResponse,
@@ -953,7 +984,7 @@ export class ResourceService {
    * otherwise `resource:list_all`
    */
   public static resourceListResourceOtrs<ThrowOnError extends boolean = false>(
-    options?: Options<ResourceListResourceOtrsData, ThrowOnError>,
+    options?: OptionsLegacyParser<ResourceListResourceOtrsData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       ResourceListResourceOtrsResponse,
@@ -972,7 +1003,7 @@ export class ResourceService {
    * Permission `resource:read` required.
    */
   public static resourceGetResource<ThrowOnError extends boolean = false>(
-    options: Options<ResourceGetResourceData, ThrowOnError>,
+    options: OptionsLegacyParser<ResourceGetResourceData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       ResourceGetResourceResponse,
@@ -991,7 +1022,7 @@ export class ResourceService {
    * Permission `resource:delete` required.
    */
   public static resourceDeleteResource<ThrowOnError extends boolean = false>(
-    options: Options<ResourceDeleteResourceData, ThrowOnError>,
+    options: OptionsLegacyParser<ResourceDeleteResourceData, ThrowOnError>,
   ) {
     return (options?.client ?? client).delete<
       ResourceDeleteResourceResponse,
@@ -1011,7 +1042,7 @@ export class ResourceService {
    * otherwise `resource:read_any` required.
    */
   public static resourceGetResourceOtr<ThrowOnError extends boolean = false>(
-    options: Options<ResourceGetResourceOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<ResourceGetResourceOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       ResourceGetResourceOtrResponse,
@@ -1031,7 +1062,7 @@ export class ResourceService {
    * otherwise `resource:update_any` required.
    */
   public static resourceCreateResourceOtr<ThrowOnError extends boolean = false>(
-    options: Options<ResourceCreateResourceOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<ResourceCreateResourceOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).post<
       ResourceCreateResourceOtrResponse,
@@ -1051,7 +1082,7 @@ export class ResourceService {
    * otherwise `resource:update_any` required.
    */
   public static resourceAcceptResourceOtr<ThrowOnError extends boolean = false>(
-    options: Options<ResourceAcceptResourceOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<ResourceAcceptResourceOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).patch<
       ResourceAcceptResourceOtrResponse,
@@ -1071,7 +1102,7 @@ export class ResourceService {
    * otherwise `resource:update_any` required.
    */
   public static resourceDeleteResourceOtr<ThrowOnError extends boolean = false>(
-    options: Options<ResourceDeleteResourceOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<ResourceDeleteResourceOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).delete<
       ResourceDeleteResourceOtrResponse,
@@ -1093,7 +1124,12 @@ export class ResourceVersionService {
    */
   public static resourceVersionListResourceVersions<
     ThrowOnError extends boolean = false,
-  >(options: Options<ResourceVersionListResourceVersionsData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      ResourceVersionListResourceVersionsData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).get<
       ResourceVersionListResourceVersionsResponse,
       ResourceVersionListResourceVersionsError,
@@ -1112,7 +1148,12 @@ export class ResourceVersionService {
    */
   public static resourceVersionRequestResourceVersion<
     ThrowOnError extends boolean = false,
-  >(options: Options<ResourceVersionRequestResourceVersionData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      ResourceVersionRequestResourceVersionData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).post<
       ResourceVersionRequestResourceVersionResponse,
       ResourceVersionRequestResourceVersionError,
@@ -1132,7 +1173,12 @@ export class ResourceVersionService {
    */
   public static resourceVersionGetResourceVersion<
     ThrowOnError extends boolean = false,
-  >(options: Options<ResourceVersionGetResourceVersionData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      ResourceVersionGetResourceVersionData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).get<
       ResourceVersionGetResourceVersionResponse,
       ResourceVersionGetResourceVersionError,
@@ -1151,7 +1197,12 @@ export class ResourceVersionService {
    */
   public static resourceVersionResourceFileTree<
     ThrowOnError extends boolean = false,
-  >(options: Options<ResourceVersionResourceFileTreeData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      ResourceVersionResourceFileTreeData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).get<
       ResourceVersionResourceFileTreeResponse,
       ResourceVersionResourceFileTreeError,
@@ -1171,7 +1222,7 @@ export class ResourceVersionService {
   public static resourceVersionRequestResourceVersionReview<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       ResourceVersionRequestResourceVersionReviewData,
       ThrowOnError
     >,
@@ -1195,7 +1246,7 @@ export class ResourceVersionService {
   public static resourceVersionRequestResourceVersionSync<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       ResourceVersionRequestResourceVersionSyncData,
       ThrowOnError
     >,
@@ -1218,7 +1269,12 @@ export class ResourceVersionService {
    */
   public static resourceVersionResourceVersionReview<
     ThrowOnError extends boolean = false,
-  >(options: Options<ResourceVersionResourceVersionReviewData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      ResourceVersionResourceVersionReviewData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).put<
       ResourceVersionResourceVersionReviewResponse,
       ResourceVersionResourceVersionReviewError,
@@ -1237,7 +1293,12 @@ export class ResourceVersionService {
    */
   public static resourceVersionResourceVersionSync<
     ThrowOnError extends boolean = false,
-  >(options: Options<ResourceVersionResourceVersionSyncData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      ResourceVersionResourceVersionSyncData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).put<
       ResourceVersionResourceVersionSyncResponse,
       ResourceVersionResourceVersionSyncError,
@@ -1256,7 +1317,12 @@ export class ResourceVersionService {
    */
   public static resourceVersionResourceVersionLatest<
     ThrowOnError extends boolean = false,
-  >(options: Options<ResourceVersionResourceVersionLatestData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      ResourceVersionResourceVersionLatestData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).put<
       ResourceVersionResourceVersionLatestResponse,
       ResourceVersionResourceVersionLatestError,
@@ -1276,7 +1342,7 @@ export class ResourceVersionService {
   public static resourceVersionDeleteResourceVersionCluster<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       ResourceVersionDeleteResourceVersionClusterData,
       ThrowOnError
     >,
@@ -1300,7 +1366,10 @@ export class ResourceVersionService {
   public static resourceVersionDeleteResourceVersionS3<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<ResourceVersionDeleteResourceVersionS3Data, ThrowOnError>,
+    options: OptionsLegacyParser<
+      ResourceVersionDeleteResourceVersionS3Data,
+      ThrowOnError
+    >,
   ) {
     return (options?.client ?? client).delete<
       ResourceVersionDeleteResourceVersionS3Response,
@@ -1321,7 +1390,7 @@ export class S3KeyService {
    * Permission `s3_key:list` required.
    */
   public static s3KeyGetUserKeys<ThrowOnError extends boolean = false>(
-    options: Options<S3KeyGetUserKeysData, ThrowOnError>,
+    options: OptionsLegacyParser<S3KeyGetUserKeysData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       S3KeyGetUserKeysResponse,
@@ -1340,7 +1409,7 @@ export class S3KeyService {
    * Permission `s3_key:create` required.
    */
   public static s3KeyCreateUserKey<ThrowOnError extends boolean = false>(
-    options: Options<S3KeyCreateUserKeyData, ThrowOnError>,
+    options: OptionsLegacyParser<S3KeyCreateUserKeyData, ThrowOnError>,
   ) {
     return (options?.client ?? client).post<
       S3KeyCreateUserKeyResponse,
@@ -1359,7 +1428,7 @@ export class S3KeyService {
    * Permission `s3_key:read` required.
    */
   public static s3KeyGetUserKey<ThrowOnError extends boolean = false>(
-    options: Options<S3KeyGetUserKeyData, ThrowOnError>,
+    options: OptionsLegacyParser<S3KeyGetUserKeyData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       S3KeyGetUserKeyResponse,
@@ -1378,7 +1447,7 @@ export class S3KeyService {
    * Permission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.
    */
   public static s3KeyDeleteUserKey<ThrowOnError extends boolean = false>(
-    options: Options<S3KeyDeleteUserKeyData, ThrowOnError>,
+    options: OptionsLegacyParser<S3KeyDeleteUserKeyData, ThrowOnError>,
   ) {
     return (options?.client ?? client).delete<
       S3KeyDeleteUserKeyResponse,
@@ -1399,7 +1468,7 @@ export class UserService {
    * Permission `user:create` required.
    */
   public static userCreateUser<ThrowOnError extends boolean = false>(
-    options: Options<UserCreateUserData, ThrowOnError>,
+    options: OptionsLegacyParser<UserCreateUserData, ThrowOnError>,
   ) {
     return (options?.client ?? client).post<
       UserCreateUserResponse,
@@ -1418,7 +1487,7 @@ export class UserService {
    * Permission `user:list` required.
    */
   public static userListUsers<ThrowOnError extends boolean = false>(
-    options?: Options<UserListUsersData, ThrowOnError>,
+    options?: OptionsLegacyParser<UserListUsersData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       UserListUsersResponse,
@@ -1437,7 +1506,7 @@ export class UserService {
    * Permission `user: search` required.
    */
   public static userSearchUsers<ThrowOnError extends boolean = false>(
-    options: Options<UserSearchUsersData, ThrowOnError>,
+    options: OptionsLegacyParser<UserSearchUsersData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       UserSearchUsersResponse,
@@ -1456,7 +1525,7 @@ export class UserService {
    * Permission `user:read` required.
    */
   public static userGetLoggedInUser<ThrowOnError extends boolean = false>(
-    options?: Options<unknown, ThrowOnError>,
+    options?: OptionsLegacyParser<unknown, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       UserGetLoggedInUserResponse,
@@ -1475,7 +1544,7 @@ export class UserService {
    * Permission `user:read` required.
    */
   public static userGetUser<ThrowOnError extends boolean = false>(
-    options: Options<UserGetUserData, ThrowOnError>,
+    options: OptionsLegacyParser<UserGetUserData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       UserGetUserResponse,
@@ -1494,7 +1563,7 @@ export class UserService {
    * Permission `user:update` required.
    */
   public static userUpdateRoles<ThrowOnError extends boolean = false>(
-    options: Options<UserUpdateRolesData, ThrowOnError>,
+    options: OptionsLegacyParser<UserUpdateRolesData, ThrowOnError>,
   ) {
     return (options?.client ?? client).put<
       UserUpdateRolesResponse,
@@ -1513,7 +1582,7 @@ export class UserService {
    * Permission `user:create` required.
    */
   public static userResendInvitation<ThrowOnError extends boolean = false>(
-    options: Options<UserResendInvitationData, ThrowOnError>,
+    options: OptionsLegacyParser<UserResendInvitationData, ThrowOnError>,
   ) {
     return (options?.client ?? client).patch<
       UserResendInvitationResponse,
@@ -1538,7 +1607,7 @@ export class WorkflowService {
    * Permission `workflow:create` required.
    */
   public static workflowCreateWorkflow<ThrowOnError extends boolean = false>(
-    options: Options<WorkflowCreateWorkflowData, ThrowOnError>,
+    options: OptionsLegacyParser<WorkflowCreateWorkflowData, ThrowOnError>,
   ) {
     return (options?.client ?? client).post<
       WorkflowCreateWorkflowResponse,
@@ -1557,7 +1626,7 @@ export class WorkflowService {
    * Permission `workflow:list` required.
    */
   public static workflowListWorkflows<ThrowOnError extends boolean = false>(
-    options?: Options<WorkflowListWorkflowsData, ThrowOnError>,
+    options?: OptionsLegacyParser<WorkflowListWorkflowsData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       WorkflowListWorkflowsResponse,
@@ -1577,7 +1646,7 @@ export class WorkflowService {
    * otherwise `workflow:list_all`
    */
   public static workflowListWorkflowOtrs<ThrowOnError extends boolean = false>(
-    options?: Options<WorkflowListWorkflowOtrsData, ThrowOnError>,
+    options?: OptionsLegacyParser<WorkflowListWorkflowOtrsData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       WorkflowListWorkflowOtrsResponse,
@@ -1599,7 +1668,10 @@ export class WorkflowService {
   public static workflowGetDeveloperWorkflowStatistics<
     ThrowOnError extends boolean = false,
   >(
-    options?: Options<WorkflowGetDeveloperWorkflowStatisticsData, ThrowOnError>,
+    options?: OptionsLegacyParser<
+      WorkflowGetDeveloperWorkflowStatisticsData,
+      ThrowOnError
+    >,
   ) {
     return (options?.client ?? client).get<
       WorkflowGetDeveloperWorkflowStatisticsResponse,
@@ -1618,7 +1690,7 @@ export class WorkflowService {
    * Permission `workflow:read` required.
    */
   public static workflowGetWorkflow<ThrowOnError extends boolean = false>(
-    options: Options<WorkflowGetWorkflowData, ThrowOnError>,
+    options: OptionsLegacyParser<WorkflowGetWorkflowData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       WorkflowGetWorkflowResponse,
@@ -1638,7 +1710,7 @@ export class WorkflowService {
    * other `workflow:delete_any`.
    */
   public static workflowDeleteWorkflow<ThrowOnError extends boolean = false>(
-    options: Options<WorkflowDeleteWorkflowData, ThrowOnError>,
+    options: OptionsLegacyParser<WorkflowDeleteWorkflowData, ThrowOnError>,
   ) {
     return (options?.client ?? client).delete<
       WorkflowDeleteWorkflowResponse,
@@ -1658,7 +1730,7 @@ export class WorkflowService {
    * otherwise `workflow:read_any` required.
    */
   public static workflowGetWorkflowOtr<ThrowOnError extends boolean = false>(
-    options: Options<WorkflowGetWorkflowOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<WorkflowGetWorkflowOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).get<
       WorkflowGetWorkflowOtrResponse,
@@ -1678,7 +1750,7 @@ export class WorkflowService {
    * otherwise `workflow:update_any` required.
    */
   public static workflowCreateWorkflowOtr<ThrowOnError extends boolean = false>(
-    options: Options<WorkflowCreateWorkflowOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<WorkflowCreateWorkflowOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).post<
       WorkflowCreateWorkflowOtrResponse,
@@ -1698,7 +1770,7 @@ export class WorkflowService {
    * otherwise `workflow:update_any` required.
    */
   public static workflowAcceptWorkflowOtr<ThrowOnError extends boolean = false>(
-    options: Options<WorkflowAcceptWorkflowOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<WorkflowAcceptWorkflowOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).patch<
       WorkflowAcceptWorkflowOtrResponse,
@@ -1718,7 +1790,7 @@ export class WorkflowService {
    * otherwise `workflow:update_any` required.
    */
   public static workflowDeleteWorkflowOtr<ThrowOnError extends boolean = false>(
-    options: Options<WorkflowDeleteWorkflowOtrData, ThrowOnError>,
+    options: OptionsLegacyParser<WorkflowDeleteWorkflowOtrData, ThrowOnError>,
   ) {
     return (options?.client ?? client).delete<
       WorkflowDeleteWorkflowOtrResponse,
@@ -1738,7 +1810,12 @@ export class WorkflowService {
    */
   public static workflowGetWorkflowStatistics<
     ThrowOnError extends boolean = false,
-  >(options: Options<WorkflowGetWorkflowStatisticsData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      WorkflowGetWorkflowStatisticsData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).get<
       WorkflowGetWorkflowStatisticsResponse,
       WorkflowGetWorkflowStatisticsError,
@@ -1756,7 +1833,7 @@ export class WorkflowService {
    * Permission `workflow:update` required.
    */
   public static workflowUpdateWorkflow<ThrowOnError extends boolean = false>(
-    options: Options<WorkflowUpdateWorkflowData, ThrowOnError>,
+    options: OptionsLegacyParser<WorkflowUpdateWorkflowData, ThrowOnError>,
   ) {
     return (options?.client ?? client).post<
       WorkflowUpdateWorkflowResponse,
@@ -1779,7 +1856,7 @@ export class WorkflowCredentialsService {
   public static workflowCredentialsGetWorkflowCredentials<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowCredentialsGetWorkflowCredentialsData,
       ThrowOnError
     >,
@@ -1803,7 +1880,7 @@ export class WorkflowCredentialsService {
   public static workflowCredentialsUpdateWorkflowCredentials<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowCredentialsUpdateWorkflowCredentialsData,
       ThrowOnError
     >,
@@ -1828,7 +1905,7 @@ export class WorkflowCredentialsService {
   public static workflowCredentialsDeleteWorkflowCredentials<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowCredentialsDeleteWorkflowCredentialsData,
       ThrowOnError
     >,
@@ -1854,7 +1931,12 @@ export class WorkflowExecutionService {
    */
   public static workflowExecutionStartWorkflow<
     ThrowOnError extends boolean = false,
-  >(options: Options<WorkflowExecutionStartWorkflowData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      WorkflowExecutionStartWorkflowData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).post<
       WorkflowExecutionStartWorkflowResponse,
       WorkflowExecutionStartWorkflowError,
@@ -1879,7 +1961,7 @@ export class WorkflowExecutionService {
   public static workflowExecutionListWorkflowExecutions<
     ThrowOnError extends boolean = false,
   >(
-    options?: Options<
+    options?: OptionsLegacyParser<
       WorkflowExecutionListWorkflowExecutionsData,
       ThrowOnError
     >,
@@ -1907,7 +1989,10 @@ export class WorkflowExecutionService {
   public static workflowExecutionStartArbitraryWorkflow<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<WorkflowExecutionStartArbitraryWorkflowData, ThrowOnError>,
+    options: OptionsLegacyParser<
+      WorkflowExecutionStartArbitraryWorkflowData,
+      ThrowOnError
+    >,
   ) {
     return (options?.client ?? client).post<
       WorkflowExecutionStartArbitraryWorkflowResponse,
@@ -1928,7 +2013,12 @@ export class WorkflowExecutionService {
    */
   public static workflowExecutionGetWorkflowExecution<
     ThrowOnError extends boolean = false,
-  >(options: Options<WorkflowExecutionGetWorkflowExecutionData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      WorkflowExecutionGetWorkflowExecutionData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).get<
       WorkflowExecutionGetWorkflowExecutionResponse,
       WorkflowExecutionGetWorkflowExecutionError,
@@ -1949,7 +2039,7 @@ export class WorkflowExecutionService {
   public static workflowExecutionDeleteWorkflowExecution<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowExecutionDeleteWorkflowExecutionData,
       ThrowOnError
     >,
@@ -1974,7 +2064,7 @@ export class WorkflowExecutionService {
   public static workflowExecutionGetWorkflowExecutionParams<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowExecutionGetWorkflowExecutionParamsData,
       ThrowOnError
     >,
@@ -1999,7 +2089,7 @@ export class WorkflowExecutionService {
   public static workflowExecutionCancelWorkflowExecution<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowExecutionCancelWorkflowExecutionData,
       ThrowOnError
     >,
@@ -2024,7 +2114,9 @@ export class WorkflowModeService {
    */
   public static workflowModeGetWorkflowMode<
     ThrowOnError extends boolean = false,
-  >(options: Options<WorkflowModeGetWorkflowModeData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<WorkflowModeGetWorkflowModeData, ThrowOnError>,
+  ) {
     return (options?.client ?? client).get<
       WorkflowModeGetWorkflowModeResponse,
       WorkflowModeGetWorkflowModeError,
@@ -2045,7 +2137,12 @@ export class WorkflowVersionService {
    */
   public static workflowVersionListWorkflowVersion<
     ThrowOnError extends boolean = false,
-  >(options: Options<WorkflowVersionListWorkflowVersionData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      WorkflowVersionListWorkflowVersionData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).get<
       WorkflowVersionListWorkflowVersionResponse,
       WorkflowVersionListWorkflowVersionError,
@@ -2065,7 +2162,12 @@ export class WorkflowVersionService {
    */
   public static workflowVersionGetWorkflowVersion<
     ThrowOnError extends boolean = false,
-  >(options: Options<WorkflowVersionGetWorkflowVersionData, ThrowOnError>) {
+  >(
+    options: OptionsLegacyParser<
+      WorkflowVersionGetWorkflowVersionData,
+      ThrowOnError
+    >,
+  ) {
     return (options?.client ?? client).get<
       WorkflowVersionGetWorkflowVersionResponse,
       WorkflowVersionGetWorkflowVersionError,
@@ -2085,7 +2187,7 @@ export class WorkflowVersionService {
   public static workflowVersionUpdateWorkflowVersionStatus<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowVersionUpdateWorkflowVersionStatusData,
       ThrowOnError
     >,
@@ -2110,7 +2212,7 @@ export class WorkflowVersionService {
   public static workflowVersionGetWorkflowVersionMetadata<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowVersionGetWorkflowVersionMetadataData,
       ThrowOnError
     >,
@@ -2135,7 +2237,7 @@ export class WorkflowVersionService {
   public static workflowVersionUpdateWorkflowVersionMetadata<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowVersionUpdateWorkflowVersionMetadataData,
       ThrowOnError
     >,
@@ -2160,7 +2262,10 @@ export class WorkflowVersionService {
   public static workflowVersionDeprecateWorkflowVersion<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<WorkflowVersionDeprecateWorkflowVersionData, ThrowOnError>,
+    options: OptionsLegacyParser<
+      WorkflowVersionDeprecateWorkflowVersionData,
+      ThrowOnError
+    >,
   ) {
     return (options?.client ?? client).patch<
       WorkflowVersionDeprecateWorkflowVersionResponse,
@@ -2181,7 +2286,7 @@ export class WorkflowVersionService {
   public static workflowVersionUpdateWorkflowVersionParameterExtension<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowVersionUpdateWorkflowVersionParameterExtensionData,
       ThrowOnError
     >,
@@ -2206,7 +2311,7 @@ export class WorkflowVersionService {
   public static workflowVersionDownloadWorkflowDocumentation<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowVersionDownloadWorkflowDocumentationData,
       ThrowOnError
     >,
@@ -2230,7 +2335,7 @@ export class WorkflowVersionService {
   public static workflowVersionUploadWorkflowVersionIcon<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowVersionUploadWorkflowVersionIconData,
       ThrowOnError
     >,
@@ -2259,7 +2364,7 @@ export class WorkflowVersionService {
   public static workflowVersionDeleteWorkflowVersionIcon<
     ThrowOnError extends boolean = false,
   >(
-    options: Options<
+    options: OptionsLegacyParser<
       WorkflowVersionDeleteWorkflowVersionIconData,
       ThrowOnError
     >,
diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue
index ada871cf06afeb043df0f015531fd97686bba690..6a955567c8ab291a211009441ae90ae07482bc37 100644
--- a/src/components/AppHeader.vue
+++ b/src/components/AppHeader.vue
@@ -52,9 +52,11 @@ watch(
   <header
     class="navbar navbar-expand bd-navbar sticky-top border-bottom border-secondary"
   >
-    <nav class="container-xxl bd-gutter flex-wrap flex-lg-nowrap text-light">
+    <nav
+      class="container-fluid container-xxxl bd-gutter flex-wrap flex-lg-nowrap text-light"
+    >
       <router-link
-        class="navbar-brand ms-3 text-white d-flex align-items-center"
+        class="navbar-brand text-white d-flex align-items-center"
         to="/"
       >
         <img
@@ -376,4 +378,11 @@ ul {
   --bs-navbar-hover-color: rgba(255, 255, 255, 0.9) !important;
   --bs-navbar-disabled-color: rgba(255, 255, 255, 0.4) !important;
 }
+
+.navbar > .container-xxxl {
+  display: flex;
+  flex-wrap: inherit;
+  align-items: center;
+  justify-content: space-between;
+}
 </style>
diff --git a/src/components/object-storage/modals/CopyObjectModal.vue b/src/components/object-storage/modals/CopyObjectModal.vue
index 2ecf9d2e1272ba60f59c8370abe8034738c21c92..ced824132c8d264aaff7c891a060b59d96daff77 100644
--- a/src/components/object-storage/modals/CopyObjectModal.vue
+++ b/src/components/object-storage/modals/CopyObjectModal.vue
@@ -62,10 +62,9 @@ function copyObject() {
     )
     .then(() => {
       if (formState.moveObject && props.srcObject.Key != undefined) {
-        return objectRepository.deleteObject(
-          props.srcBucket,
+        return objectRepository.deleteObjects(props.srcBucket, [
           props.srcObject.Key,
-        );
+        ]);
       }
     })
     .then(() => {
diff --git a/src/components/object-storage/modals/ObjectDetailModal.vue b/src/components/object-storage/modals/ObjectDetailModal.vue
index 6a1a018b0f2deb88087fef111ef9ac65d6016f6d..a5053f9e4a3527c3d050f36687ca854f99289122 100644
--- a/src/components/object-storage/modals/ObjectDetailModal.vue
+++ b/src/components/object-storage/modals/ObjectDetailModal.vue
@@ -84,10 +84,6 @@ onMounted(() => {
                   filesize(
                     objectRepository.objectMetaMapping[metaIdentifier]
                       .ContentLength ?? 0,
-                    {
-                      base: 2,
-                      standard: "jedec",
-                    },
                   )
                 }}
               </td>
diff --git a/src/components/parameter-schema/GroupNav.vue b/src/components/parameter-schema/GroupNav.vue
index 8e36ad9594ed4aca3ab58a807e1c81075d52943d..60dcff07445898882d17deb1b7b5cfc22bb55857 100644
--- a/src/components/parameter-schema/GroupNav.vue
+++ b/src/components/parameter-schema/GroupNav.vue
@@ -275,6 +275,7 @@ onMounted(() => {
         Try it out
       </button>
       <button
+        v-if="workflowId != undefined"
         type="button"
         class="btn btn-primary"
         data-bs-toggle="modal"
diff --git a/src/components/workflows/WorkflowWithVersionsCard.vue b/src/components/workflows/WorkflowWithVersionsCard.vue
index 726b88585cbacc4813312a2167b1320297982c89..71b4d7275729a11343cac6dc56a85594206e8e93 100644
--- a/src/components/workflows/WorkflowWithVersionsCard.vue
+++ b/src/components/workflows/WorkflowWithVersionsCard.vue
@@ -182,7 +182,7 @@ onMounted(() => {
                   },
                 }"
                 class="btn btn-primary dropdown-item"
-                >Add Parameter Metadata
+                >Edit Parameter Metadata
               </router-link>
             </li>
             <li>
@@ -355,11 +355,7 @@ onMounted(() => {
                           },
                         }"
                       >
-                        <template v-if="version.parameter_extension"
-                          >Update
-                        </template>
-                        <template v-else>Add</template>
-                        Parameter Translation
+                        Edit parameter translation
                       </router-link>
                     </li>
                     <li>
@@ -373,7 +369,7 @@ onMounted(() => {
                           },
                         }"
                       >
-                        Update Metadata
+                        Edit execution environment
                       </router-link>
                     </li>
                     <li>
@@ -390,7 +386,7 @@ onMounted(() => {
                           },
                         }"
                       >
-                        Edit Parameter Visibility
+                        Edit parameter visibility
                       </router-link>
                     </li>
                   </ul>
diff --git a/src/components/workflows/modals/ParameterModal.vue b/src/components/workflows/modals/ParameterModal.vue
index 9b52f749880d5a9b8925a2afaa8cc1f47ca79ae0..cab38a286c94d59f28a8b1cfe7a70fba4006a8e2 100644
--- a/src/components/workflows/modals/ParameterModal.vue
+++ b/src/components/workflows/modals/ParameterModal.vue
@@ -174,7 +174,7 @@ onMounted(() => {
     :modal-id="modalId"
     :static-backdrop="false"
     modal-label="Workflow Execution Parameters Modal"
-    size-modifier-modal="lg"
+    size-modifier-modal="xl"
     :track-modal-value="executionId"
   >
     <template #header
diff --git a/src/stores/s3objects.ts b/src/stores/s3objects.ts
index cf6229bb034f49050a07b612fe49fdf4d4a19577..341502885d6de5d14b00bee88399351608df2376 100644
--- a/src/stores/s3objects.ts
+++ b/src/stores/s3objects.ts
@@ -172,27 +172,75 @@ export const useS3ObjectStore = defineStore({
         })
         .finally(onFinally);
     },
-    deleteObject(bucketName: string, key: string): Promise<void> {
-      const command = new DeleteObjectCommand({
-        Bucket: bucketName,
-        Key: key,
-      });
-      return this.client
-        .send(command)
-        .then(() => {
-          const bucketRepository = useBucketStore();
-          bucketRepository.fetchBucket(bucketName);
-          if (this.objectMapping[bucketName] == undefined) {
-            this.fetchS3Objects(bucketName);
-          } else {
-            this.objectMapping[bucketName] = this.objectMapping[
-              bucketName
-            ].filter((obj) => obj.Key !== key);
+    deleteObjects(bucketName: string, keys: string[]): Promise<void> {
+      switch (keys.length) {
+        case 0: {
+          return Promise.resolve();
+        }
+        case 1: {
+          return this.client
+            .send(
+              new DeleteObjectCommand({
+                Bucket: bucketName,
+                Key: keys[0],
+              }),
+            )
+            .then(() => {
+              const bucketRepository = useBucketStore();
+              bucketRepository.fetchBucket(bucketName);
+              if (this.objectMapping[bucketName] == undefined) {
+                this.fetchS3Objects(bucketName);
+              } else {
+                this.objectMapping[bucketName] = this.objectMapping[
+                  bucketName
+                ].filter((obj) => obj.Key !== keys[0]);
+              }
+            })
+            .catch((err) => {
+              console.error(err);
+            });
+        }
+        default: {
+          const commands: DeleteObjectsCommand[] = [];
+          const chunksize = 1000;
+          for (let i = 0; i < keys.length; i = i + chunksize) {
+            commands.push(
+              new DeleteObjectsCommand({
+                Bucket: bucketName,
+                Delete: {
+                  Objects: keys.slice(i, i + chunksize).map((obj) => {
+                    return { Key: obj };
+                  }),
+                },
+              }),
+            );
           }
-        })
-        .catch((err) => {
-          console.error(err);
-        });
+          return Promise.all(
+            commands.map((command, index) => {
+              this.client.send(command).then(() => {
+                if (this.objectMapping[bucketName] != undefined) {
+                  this.objectMapping[bucketName] = this.objectMapping[
+                    bucketName
+                  ].filter((obj) =>
+                    obj.Key != undefined
+                      ? !keys
+                          .slice(
+                            index * chunksize,
+                            index * chunksize + chunksize,
+                          )
+                          .includes(obj.Key)
+                      : false,
+                  );
+                }
+              });
+            }),
+          ).then(() => {
+            if (this.objectMapping[bucketName] == undefined) {
+              this.fetchS3Objects(bucketName);
+            }
+          });
+        }
+      }
     },
     deleteObjectsWithPrefix(bucketName: string, prefix: string): Promise<void> {
       if (this.objectMapping[bucketName] == undefined) {
diff --git a/src/types/PseudoFolder.ts b/src/types/PseudoFolder.ts
index c65e1f950c9a0825fae56ef479820bb9bff2ee4c..0941f12482f4d22113c3eb8a6b0a2a57815bb9b1 100644
--- a/src/types/PseudoFolder.ts
+++ b/src/types/PseudoFolder.ts
@@ -7,6 +7,7 @@ export interface S3ObjectWithFolder extends S3Object {
 
 export type S3PseudoFolder = {
   Size: number;
+  quantity: number;
   parentFolder: string[];
   LastModified: Date;
   name: string;
diff --git a/src/views/DashboardView.vue b/src/views/DashboardView.vue
index 5d79dfe4f6231337f35ea91ae9c277ac4bfdfa16..5ceece659261709c7fba24b047dbb9697b5dee19 100644
--- a/src/views/DashboardView.vue
+++ b/src/views/DashboardView.vue
@@ -161,7 +161,7 @@ function accumulateWorkflowStatus(
             </router-link>
           </template>
           <template #body>
-            <div>Access to {{ bucketStore.buckets.length }} buckets</div>
+            <div>Access to {{ bucketStore.buckets.length }} bucket(s)</div>
             <ul class="mb-0">
               <li>
                 {{
@@ -191,7 +191,7 @@ function accumulateWorkflowStatus(
           <template #body>
             <div>
               {{ otrStore.bucketOtrs.length }} open bucket ownership transfer
-              requests
+              request(s)
             </div>
             <ul class="mb-0">
               <li>
@@ -200,7 +200,7 @@ function accumulateWorkflowStatus(
                     (otr) => otr.current_owner_uid == authStore.currentUID,
                   ).length
                 }}
-                pending request to others
+                pending request(s) to others
               </li>
               <li>
                 {{
@@ -208,7 +208,7 @@ function accumulateWorkflowStatus(
                     (otr) => otr.new_owner_uid == authStore.currentUID,
                   ).length
                 }}
-                request to accept / reject
+                request(s) to accept / reject
               </li>
             </ul>
           </template>
@@ -218,7 +218,7 @@ function accumulateWorkflowStatus(
             <router-link :to="{ name: 's3_keys' }">S3 Bucket Keys</router-link>
           </template>
           <template #body>
-            <div>{{ keyStore.keys.length }} active keys</div>
+            <div>{{ keyStore.keys.length }} active key(s)</div>
             <div>S3 Endpoint:</div>
             <a :href="environment.S3_URL">{{ environment.S3_URL }}</a>
           </template>
@@ -231,7 +231,7 @@ function accumulateWorkflowStatus(
           </template>
           <template #body>
             <div class="card-text">
-              {{ activeUploadBuckets.length }} active multipart uploads
+              {{ activeUploadBuckets.length }} active multipart upload(s)
             </div>
             <template v-if="activeUploadBuckets.length > 0">
               <div>Buckets</div>
@@ -290,7 +290,8 @@ function accumulateWorkflowStatus(
           </template>
           <template #body>
             <div>
-              Overall {{ executionStore.executions.length }} workflow executions
+              Overall {{ executionStore.executions.length }} workflow
+              execution(s)
             </div>
             <ul class="mb-0">
               <li>
@@ -302,7 +303,7 @@ function accumulateWorkflowStatus(
                       execution.status === WorkflowExecutionStatus.SCHEDULED,
                   ).length
                 }}
-                running executions
+                running execution(s)
               </li>
               <li>
                 {{
@@ -311,7 +312,7 @@ function accumulateWorkflowStatus(
                       execution.status === WorkflowExecutionStatus.SUCCESS,
                   ).length
                 }}
-                successful executions
+                successful execution(s)
               </li>
               <li>
                 {{
@@ -320,7 +321,7 @@ function accumulateWorkflowStatus(
                       execution.status === WorkflowExecutionStatus.ERROR,
                   ).length
                 }}
-                erroneous executions
+                erroneous execution(s)
               </li>
             </ul>
           </template>
@@ -337,8 +338,8 @@ function accumulateWorkflowStatus(
             </template>
             <template #body>
               <div>
-                {{ processedOwnWorkflows.length }} own workflows,
-                {{ pendingOwnWorkflowReviews }} pending reviews
+                {{ processedOwnWorkflows.length }} own workflow(s),
+                {{ pendingOwnWorkflowReviews }} pending review(s)
               </div>
               <ul v-if="processedOwnWorkflows.length > 0" class="mb-0">
                 <li
@@ -365,7 +366,7 @@ function accumulateWorkflowStatus(
             <template #body>
               <div>
                 {{ otrStore.workflowOtrs.length }} open workflow ownership
-                transfer requests
+                transfer request(s)
               </div>
               <ul class="mb-0">
                 <li>
@@ -374,7 +375,7 @@ function accumulateWorkflowStatus(
                       (otr) => otr.current_owner_uid == authStore.currentUID,
                     ).length
                   }}
-                  pending request to others
+                  pending request(s) to others
                 </li>
                 <li>
                   {{
@@ -382,7 +383,7 @@ function accumulateWorkflowStatus(
                       (otr) => otr.new_owner_uid == authStore.currentUID,
                     ).length
                   }}
-                  request to accept / reject
+                  request(s) to accept / reject
                 </li>
               </ul>
             </template>
@@ -399,15 +400,15 @@ function accumulateWorkflowStatus(
               </router-link>
             </template>
             <template #body>
-              <div>{{ resourceStore.ownResources.length }} own resources</div>
+              <div>{{ resourceStore.ownResources.length }} own resource(s)</div>
               <ul v-if="processedOwnWorkflows.length > 0" class="mb-0">
                 <li class="mb-0">
                   {{ pendingOwnResourceUploads }}
-                  pending uploads
+                  pending upload(s)
                 </li>
                 <li class="mb-0">
                   {{ pendingOwnResourceReviews }}
-                  pending reviews
+                  pending review(s)
                 </li>
               </ul>
             </template>
@@ -421,7 +422,7 @@ function accumulateWorkflowStatus(
             <template #body>
               <div>
                 {{ otrStore.resourceOtrs.length }} open workflow ownership
-                transfer requests
+                transfer request(s)
               </div>
               <ul class="mb-0">
                 <li>
@@ -430,7 +431,7 @@ function accumulateWorkflowStatus(
                       (otr) => otr.current_owner_uid == authStore.currentUID,
                     ).length
                   }}
-                  pending request to others
+                  pending request(s) to others
                 </li>
                 <li>
                   {{
@@ -438,7 +439,7 @@ function accumulateWorkflowStatus(
                       (otr) => otr.new_owner_uid == authStore.currentUID,
                     ).length
                   }}
-                  request to accept / reject
+                  request(s) to accept / reject
                 </li>
               </ul>
             </template>
@@ -455,7 +456,7 @@ function accumulateWorkflowStatus(
               </router-link>
             </template>
             <template #body>
-              {{ pendingWorkflowReviews }} pending reviews
+              {{ pendingWorkflowReviews }} pending review(s)
             </template>
           </bootstrap-card>
           <bootstrap-card class="hover-shadow m-2 flex-fill w-fit">
@@ -465,7 +466,7 @@ function accumulateWorkflowStatus(
               </router-link>
             </template>
             <template #body>
-              {{ pendingResourceReviews }} pending reviews
+              {{ pendingResourceReviews }} pending review(s)
             </template>
           </bootstrap-card>
         </div>
@@ -480,7 +481,7 @@ function accumulateWorkflowStatus(
               </router-link>
             </template>
             <template #body>
-              {{ resourceStore.syncRequests.length }} pending sync requests
+              {{ resourceStore.syncRequests.length }} pending sync request(s)
             </template>
           </bootstrap-card>
           <bootstrap-card class="hover-shadow m-2 flex-fill w-fit">
diff --git a/src/views/object-storage/BucketView.vue b/src/views/object-storage/BucketView.vue
index 2d9c31cce9ec840834fe392d5d947c3b8481c63f..3445fe82546e751dcb7930622972c210409ebb71 100644
--- a/src/views/object-storage/BucketView.vue
+++ b/src/views/object-storage/BucketView.vue
@@ -23,6 +23,7 @@ import { useS3ObjectStore } from "@/stores/s3objects";
 import { useS3KeyStore } from "@/stores/s3keys";
 import BootstrapToast from "@/components/BootstrapToast.vue";
 import { useSettingsStore } from "@/stores/settings";
+import { md5 } from "@/utils/md5";
 
 const authStore = useUserStore();
 const bucketRepository = useBucketStore();
@@ -46,12 +47,10 @@ let refreshTimeout: NodeJS.Timeout | undefined = undefined;
 // -----------------------------------------------------------------------------
 const deleteObjectsState = reactive<{
   deletedItem: string;
-  potentialObjectToDelete: string;
-  deleteFolder: boolean;
+  potentialObjectsToDelete: string[];
 }>({
   deletedItem: "",
-  potentialObjectToDelete: "",
-  deleteFolder: true,
+  potentialObjectsToDelete: [],
 });
 
 const objectState = reactive<{
@@ -62,6 +61,7 @@ const objectState = reactive<{
   editObjectKey: string;
   copyObject: S3Object;
   viewDetailKey: string | undefined;
+  selectedObjs: string[];
 }>({
   loading: true,
   filterString: "",
@@ -74,6 +74,7 @@ const objectState = reactive<{
     LastModified: new Date(),
   },
   viewDetailKey: undefined,
+  selectedObjs: [],
 });
 
 // Computed Properties
@@ -189,10 +190,14 @@ const visibleObjects = computed<(S3ObjectWithFolder | S3PseudoFolder)[]>(() => {
       const folderLastModified = dayjs(
         calculateFolderLastModified(currentFolder.subFolders[subFolderName]),
       ).toDate();
+      const folderQuantity = calculateFolderObjectNumber(
+        currentFolder.subFolders[subFolderName],
+      );
       return {
         name: subFolderName,
         Size: folderSize,
         Key: subFolderName,
+        quantity: folderQuantity,
         parentFolder: currentSubFolders.value,
         LastModified: folderLastModified,
       } as S3PseudoFolder;
@@ -257,6 +262,13 @@ watch(
   { flush: "post" },
 );
 
+watch(
+  () => props.subFolders,
+  () => {
+    objectState.selectedObjs = [];
+  },
+);
+
 // Lifecycle Hooks
 // -----------------------------------------------------------------------------
 onMounted(() => {
@@ -282,17 +294,35 @@ onMounted(() => {
 // Functions
 // -----------------------------------------------------------------------------
 /**
- * Calculate recursively the cumulative file size of all o objects in a folder
+ * Calculate recursively the number of objects in a folder
+ * @param folder Folder to inspect
+ * @returns The number of objects in this folder
+ */
+function calculateFolderObjectNumber(folder: FolderTree): number {
+  return (
+    folder.files.filter((obj) => !obj.Key?.endsWith("/") ?? false).length +
+    Object.keys(folder.subFolders).reduce(
+      (size, subFolderName) =>
+        size + calculateFolderObjectNumber(folder.subFolders[subFolderName]),
+      0,
+    )
+  );
+}
+
+/**
+ * Calculate recursively the cumulative file size of all objects in a folder
  * @param folder Folder to inspect
  * @returns The size of this folder in bytes
  */
 function calculateFolderSize(folder: FolderTree): number {
-  let folderSize = 0;
-  folderSize += folder.files.reduce((acc, file) => acc + (file.Size ?? 0), 0);
-  for (const subFolderName of Object.keys(folder.subFolders)) {
-    folderSize += calculateFolderSize(folder.subFolders[subFolderName]);
-  }
-  return folderSize;
+  return (
+    folder.files.reduce((acc, file) => acc + (file.Size ?? 0), 0) +
+    Object.keys(folder.subFolders).reduce(
+      (size, subFolderName) =>
+        size + calculateFolderSize(folder.subFolders[subFolderName]),
+      0,
+    )
+  );
 }
 
 /**
@@ -363,20 +393,7 @@ function deleteObject(key?: string) {
   if (key == undefined) {
     return;
   }
-  deleteObjectsState.potentialObjectToDelete = key;
-  deleteObjectsState.deleteFolder = false;
-}
-
-/**
- * Delete an Object in the current folder
- * @param key Key of the Object
- */
-function confirmedDeleteObject(key: string) {
-  objectRepository.deleteObject(props.bucketName, key).then(() => {
-    const splittedKey = key.split("/");
-    deleteObjectsState.deletedItem = splittedKey[splittedKey.length - 1];
-    successToast?.show();
-  });
+  deleteObjectsState.potentialObjectsToDelete = [key];
 }
 
 /**
@@ -398,29 +415,61 @@ async function downloadObject(bucket: string, key?: string) {
   document.body.removeChild(element);
 }
 
-function deleteFolder(folderPath: string) {
-  deleteObjectsState.potentialObjectToDelete = folderPath;
-  deleteObjectsState.deleteFolder = true;
+function deleteFolder(folder: S3PseudoFolder) {
+  deleteObjectsState.potentialObjectsToDelete = [folderKeyPrefix(folder)];
+}
+
+function folderKeyPrefix(folder: S3PseudoFolder): string {
+  return folder.parentFolder.concat([""]).join("/") + folder.name + "/";
 }
 
 /**
  * Delete a folder in the current Bucket
- * @param folderPath Path to the folder with a trailing "/", e.g. some/path/to/a/folder/
+ * @param keys Path to the folder with a trailing "/", e.g. some/path/to/a/folder/
  */
-function confirmedDeleteFolder(folderPath: string) {
-  objectRepository
-    .deleteObjectsWithPrefix(props.bucketName, folderPath)
-    .then(() => {
-      const splittedPath = folderPath.split("/");
-      deleteObjectsState.deletedItem = splittedPath[splittedPath.length - 2];
+function confirmedDeleteKeys(keys: string[]) {
+  Promise.all(
+    keys
+      .filter((key) => key.endsWith("/"))
+      .map((key) =>
+        objectRepository.deleteObjectsWithPrefix(props.bucketName, key),
+      )
+      .concat(
+        objectRepository.deleteObjects(
+          props.bucketName,
+          keys.filter((key) => !key.endsWith("/")),
+        ),
+      ),
+  ).then(() => {
+    objectState.selectedObjs = objectState.selectedObjs.filter(
+      (obj) => !keys.includes(obj),
+    );
+    if (keys.length > 0) {
+      deleteObjectsState.deletedItem =
+        keys.length > 1 ? "selected items" : keys[0];
       successToast?.show();
-    });
+    }
+  });
 }
 
 function getObjectFileName(key: string): string {
   const splittedKey = key.split("/");
   return splittedKey[splittedKey.length - 1];
 }
+
+function deleteSelected() {
+  deleteObjectsState.potentialObjectsToDelete = objectState.selectedObjs;
+}
+
+function clickBox() {
+  if (objectState.selectedObjs.length < visibleObjects.value.length) {
+    objectState.selectedObjs = visibleObjects.value.map((obj) =>
+      isS3Object(obj) ? (obj.Key ?? "") : folderKeyPrefix(obj),
+    );
+  } else {
+    objectState.selectedObjs = [];
+  }
+}
 </script>
 
 <template>
@@ -429,12 +478,13 @@ function getObjectFileName(key: string): string {
   </bootstrap-toast>
   <DeleteModal
     modal-id="delete-object-modal"
-    :object-name-delete="deleteObjectsState.potentialObjectToDelete"
-    :back-modal-id="undefined"
+    :object-name-delete="
+      deleteObjectsState.potentialObjectsToDelete.length === 1
+        ? deleteObjectsState.potentialObjectsToDelete[0]
+        : 'selected items'
+    "
     @confirm-delete="
-      deleteObjectsState.deleteFolder
-        ? confirmedDeleteFolder(deleteObjectsState.potentialObjectToDelete)
-        : confirmedDeleteObject(deleteObjectsState.potentialObjectToDelete)
+      confirmedDeleteKeys(deleteObjectsState.potentialObjectsToDelete)
     "
   />
   <!-- Navbar Breadcrumb -->
@@ -598,6 +648,16 @@ function getObjectFileName(key: string): string {
         <font-awesome-icon icon="fa-solid fa-users-line" />
         <span class="visually-hidden">View Bucket Permissions</span>
       </button>
+      <button
+        class="btn tooltip-container btn-danger ms-2"
+        :disabled="!writableBucket || objectState.selectedObjs.length === 0"
+        data-bs-toggle="modal"
+        data-bs-target="#delete-object-modal"
+        data-bs-title="Delete selected files"
+        @click="deleteSelected()"
+      >
+        <font-awesome-icon icon="fa-solid fa-trash" />
+      </button>
       <permission-list-modal
         v-if="
           objectState.loading == false &&
@@ -639,43 +699,73 @@ function getObjectFileName(key: string): string {
     <div v-else>
       <!-- Table header -->
       <table class="table table-sm table-hover caption-top align-middle">
-        <caption>
+        <caption v-if="objectState.selectedObjs.length === 0">
           Displaying
           {{
             objectState.loading ? 0 : filteredObjects.length
           }}
           Items
         </caption>
+        <caption v-else>
+          Selected
+          {{
+            objectState.selectedObjs.length
+          }}
+          Item(s)
+        </caption>
         <thead>
           <tr>
+            <th v-if="writableBucket && visibleObjects.length > 0">
+              <input
+                class="form-check-input"
+                type="checkbox"
+                :checked="
+                  objectState.selectedObjs.length === visibleObjects.length
+                "
+                @click="clickBox()"
+              />
+            </th>
             <th scope="col">Name</th>
             <th scope="col">Last Accessed</th>
             <th scope="col">Size</th>
             <th scope="col"></th>
+            <th scope="col"></th>
           </tr>
         </thead>
         <!-- Table body when loading the objects -->
         <tbody v-if="objectState.loading">
           <tr v-for="n in 5" :key="n" class="placeholder-glow">
+            <td v-if="writableBucket"></td>
             <th scope="row">
               <span class="placeholder w-100 bg-secondary"></span>
             </th>
             <td><span class="placeholder w-50 bg-secondary"></span></td>
             <td><span class="placeholder w-50 bg-secondary"></span></td>
+            <td><span class="placeholder w-50 bg-secondary"></span></td>
             <td></td>
           </tr>
         </tbody>
         <!-- Table body when no objects are in the bucket -->
         <tbody v-else-if="filteredObjects.length === 0">
           <tr>
-            <td colspan="4" class="text-center fst-italic fw-light">
+            <td colspan="5" class="text-center fst-italic fw-light">
               No objects to display
             </td>
           </tr>
         </tbody>
         <!-- Table body when showing objects -->
         <tbody v-else>
-          <tr v-for="obj in filteredObjects" :key="obj.Key">
+          <tr v-for="obj in filteredObjects" :key="md5(obj.Key ?? '')">
+            <td v-if="writableBucket">
+              <input
+                v-model="objectState.selectedObjs"
+                class="form-check-input"
+                type="checkbox"
+                :value="
+                  isS3Object(obj) ? (obj.Key ?? '') : folderKeyPrefix(obj)
+                "
+              />
+            </td>
             <th scope="row" class="text-truncate">
               <!-- Show file name if row is an object -->
               <div v-if="isS3Object(obj)">{{ obj.pseudoFileName }}</div>
@@ -707,6 +797,13 @@ function getObjectFileName(key: string): string {
             <td>
               {{ filesize(obj.Size ?? 0) }}
             </td>
+            <td>
+              <span v-if="!isS3Object(obj)"
+                >{{ obj.quantity }} object<template v-if="obj.quantity != 1"
+                  >s</template
+                ></span
+              >
+            </td>
             <!-- Show buttons with dropdown menu if row is an object -->
             <td class="text-end">
               <div
@@ -790,11 +887,7 @@ function getObjectFileName(key: string): string {
                   :disabled="!writableBucket"
                   data-bs-toggle="modal"
                   data-bs-target="#delete-object-modal"
-                  @click="
-                    deleteFolder(
-                      obj.parentFolder.concat(['']).join('/') + obj.name + '/',
-                    )
-                  "
+                  @click="deleteFolder(obj)"
                 >
                   <font-awesome-icon icon="fa-solid fa-trash" class="me-2" />
                   <span>Delete</span>
diff --git a/src/views/workflows/ArbitraryWorkflowView.vue b/src/views/workflows/ArbitraryWorkflowView.vue
index 2cc8579fecf769fd3ffb176741034ea5b49b22cc..30ea0be5658a31653ca51a852025d710865624ac 100644
--- a/src/views/workflows/ArbitraryWorkflowView.vue
+++ b/src/views/workflows/ArbitraryWorkflowView.vue
@@ -255,7 +255,6 @@ onMounted(() => {
       v-else
       :loading="workflowExecutionState.loading"
       :schema="workflowState.parameterSchema"
-      :view-mode="props.viewMode"
       :nextflow-version="workflowState.workflow.nextflow_version"
       @start-workflow="startWorkflow"
     />