diff --git a/src/client/auth/core/CancelablePromise.ts b/src/client/auth/core/CancelablePromise.ts
index 55fef8517238d2dab7478598eefca72e657b9fb5..eb02246c31f61b897667a6433d55b8b413bafbc1 100644
--- a/src/client/auth/core/CancelablePromise.ts
+++ b/src/client/auth/core/CancelablePromise.ts
@@ -51,7 +51,7 @@ export class CancelablePromise<T> implements Promise<T> {
                     return;
                 }
                 this.#isResolved = true;
-                this.#resolve?.(value);
+                if (this.#resolve) this.#resolve(value);
             };
 
             const onReject = (reason?: any): void => {
@@ -59,7 +59,7 @@ export class CancelablePromise<T> implements Promise<T> {
                     return;
                 }
                 this.#isRejected = true;
-                this.#reject?.(reason);
+                if (this.#reject) this.#reject(reason);
             };
 
             const onCancel = (cancelHandler: () => void): void => {
@@ -122,7 +122,7 @@ export class CancelablePromise<T> implements Promise<T> {
             }
         }
         this.#cancelHandlers.length = 0;
-        this.#reject?.(new CancelError('Request aborted'));
+        if (this.#reject) this.#reject(new CancelError('Request aborted'));
     }
 
     public get isCancelled(): boolean {
diff --git a/src/client/auth/core/request.ts b/src/client/auth/core/request.ts
index 1142d43219797c94e09f35ba83a9f5441892ddd2..c6a0602a006d2d1855c2ab50d2d7f43c2eb1bab4 100644
--- a/src/client/auth/core/request.ts
+++ b/src/client/auth/core/request.ts
@@ -145,10 +145,13 @@ export const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Reso
 };
 
 export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise<Record<string, string>> => {
-    const token = await resolve(options, config.TOKEN);
-    const username = await resolve(options, config.USERNAME);
-    const password = await resolve(options, config.PASSWORD);
-    const additionalHeaders = await resolve(options, config.HEADERS);
+    const [token, username, password, additionalHeaders] = await Promise.all([
+        resolve(options, config.TOKEN),
+        resolve(options, config.USERNAME),
+        resolve(options, config.PASSWORD),
+        resolve(options, config.HEADERS),
+    ]);
+
     const formHeaders = typeof formData?.getHeaders === 'function' && formData?.getHeaders() || {}
 
     const headers = Object.entries({
diff --git a/src/client/auth/models/ErrorDetail.ts b/src/client/auth/models/ErrorDetail.ts
index eba50ab9335b70df9b29cada4c54cf9ffaad10a4..69dd37eb86bc15e2ab2037f3f82516493801e74d 100644
--- a/src/client/auth/models/ErrorDetail.ts
+++ b/src/client/auth/models/ErrorDetail.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Schema for a error due to a rejected request.
  */
diff --git a/src/client/auth/models/HTTPValidationError.ts b/src/client/auth/models/HTTPValidationError.ts
index c0bcc87cf7f3222638466bc2e5753ca1accf01f7..892e4257ccbb49769737cb2e78e0aad49d81a3b1 100644
--- a/src/client/auth/models/HTTPValidationError.ts
+++ b/src/client/auth/models/HTTPValidationError.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { ValidationError } from './ValidationError';
-
 export type HTTPValidationError = {
     detail?: Array<ValidationError>;
 };
diff --git a/src/client/auth/models/RoleEnum.ts b/src/client/auth/models/RoleEnum.ts
index c38121aa528efe32ad2db1868fe05ca559006f4b..d1a23ae7bd28accb81fa3d196c78cafd7aebe846 100644
--- a/src/client/auth/models/RoleEnum.ts
+++ b/src/client/auth/models/RoleEnum.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Enumeration for the Roles in the CloWM Services.
  */
@@ -12,4 +11,5 @@ export enum RoleEnum {
     REVIEWER = 'reviewer',
     DEVELOPER = 'developer',
     FOREIGN_USER = 'foreign_user',
+    DB_MAINTAINER = 'db_maintainer',
 }
diff --git a/src/client/auth/models/User.ts b/src/client/auth/models/User.ts
index 8804790e499d6f84af8e66835bdfc8f9a1a269ff..5a1a2a0818d6fde1ed83cf5085a558edd232589b 100644
--- a/src/client/auth/models/User.ts
+++ b/src/client/auth/models/User.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { RoleEnum } from './RoleEnum';
-
 /**
  * Schema for a user.
  */
diff --git a/src/client/auth/models/ValidationError.ts b/src/client/auth/models/ValidationError.ts
index 18997ec72f4103731f38d915508522ba23ba8506..f2ff49a2b9ad95d18a90c95dc2a7c0b60b7e85e7 100644
--- a/src/client/auth/models/ValidationError.ts
+++ b/src/client/auth/models/ValidationError.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type ValidationError = {
     loc: Array<(string | number)>;
     msg: string;
diff --git a/src/client/auth/services/AuthService.ts b/src/client/auth/services/AuthService.ts
index 0472d3962a5f73dac257fe6de7e4c74cfe56f987..ff4c0213646a9f24e8e8471bcd4cae3f116af2b7 100644
--- a/src/client/auth/services/AuthService.ts
+++ b/src/client/auth/services/AuthService.ts
@@ -5,9 +5,7 @@
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class AuthService {
-
     /**
      * Redirect to LifeScience OIDC Login
      * Redirect route to OIDC provider to kickstart the login process.
@@ -23,7 +21,6 @@ export class AuthService {
             },
         });
     }
-
     /**
      * LifeScience Login Callback
      * Callback for the Life Science Identity Provider.
@@ -48,5 +45,4 @@ export class AuthService {
             },
         });
     }
-
 }
diff --git a/src/client/auth/services/UserService.ts b/src/client/auth/services/UserService.ts
index ae578426600f01927ec075bafe3d68b849366327..0e52ed2f45be911672273c012f8c53859ca25c4c 100644
--- a/src/client/auth/services/UserService.ts
+++ b/src/client/auth/services/UserService.ts
@@ -4,17 +4,14 @@
 /* eslint-disable */
 import type { RoleEnum } from '../models/RoleEnum';
 import type { User } from '../models/User';
-
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class UserService {
-
     /**
      * Get the logged in user
      * Return the user associated with the used JWT.
-     * Permission 'user:read' required.
+     * Permission `user:read` required.
      * @returns User Successful Response
      * @throws ApiError
      */
@@ -29,21 +26,21 @@ export class UserService {
             },
         });
     }
-
     /**
      * List users and search by their name
      * Return the users that have a specific substring in their name.
-     * Permission 'user:read_any' required, except when 'name_substring' as only query parameter is set.
-     * Then permission 'user:search' required.
-     * @param nameSubstring Filter users by a substring in their name. Permission 'search' required
-     * @param filterRoles Filter users by their role. If multiple are selected, they are concatenating by an OR Expresssion. Permission 'read_any' required
-     * @param includeRoles Flag whether to include the roles of the users in the response. If True, permission 'read_any' required.
+     *
+     * Permission `user:read_any` required, except when `name_substring` as only query parameter is set,
+     * then permission `user:search` required.
+     * @param nameSubstring Filter users by a substring in their name. Permission `user:search` required
+     * @param filterRoles Filter users by their role. If multiple are selected, they are concatenating by an OR Expression. Permission `user:read_any` required
+     * @param includeRoles Flag whether to include the roles of the users in the response. If True, permission `user:read_any` required.
      * @returns User Successful Response
      * @throws ApiError
      */
     public static userListUsers(
-        nameSubstring?: (string | null),
-        filterRoles?: (Array<RoleEnum> | null),
+        nameSubstring?: string,
+        filterRoles?: Array<RoleEnum>,
         includeRoles: boolean = false,
     ): CancelablePromise<Array<User>> {
         return __request(OpenAPI, {
@@ -62,13 +59,13 @@ export class UserService {
             },
         });
     }
-
     /**
      * Get a user by its uid
-     * Return the user with the specific uid. A user can only view himself.
-     * Permission 'user:read' required
+     * Return the user with the specific uid.
+     *
+     * Permission `user:read` required if the current user has the same uid as `uid` otherwise `user:read_any` required.
      * @param uid UID of a user
-     * @param includeRoles Flag whether to include the roles of the users in the response. If True, permission 'read_any' required.
+     * @param includeRoles Flag whether to include the roles of the users in the response. If True, permission `user:read_any` required.
      * @returns User Successful Response
      * @throws ApiError
      */
@@ -93,5 +90,4 @@ export class UserService {
             },
         });
     }
-
 }
diff --git a/src/client/resource/core/CancelablePromise.ts b/src/client/resource/core/CancelablePromise.ts
index 55fef8517238d2dab7478598eefca72e657b9fb5..eb02246c31f61b897667a6433d55b8b413bafbc1 100644
--- a/src/client/resource/core/CancelablePromise.ts
+++ b/src/client/resource/core/CancelablePromise.ts
@@ -51,7 +51,7 @@ export class CancelablePromise<T> implements Promise<T> {
                     return;
                 }
                 this.#isResolved = true;
-                this.#resolve?.(value);
+                if (this.#resolve) this.#resolve(value);
             };
 
             const onReject = (reason?: any): void => {
@@ -59,7 +59,7 @@ export class CancelablePromise<T> implements Promise<T> {
                     return;
                 }
                 this.#isRejected = true;
-                this.#reject?.(reason);
+                if (this.#reject) this.#reject(reason);
             };
 
             const onCancel = (cancelHandler: () => void): void => {
@@ -122,7 +122,7 @@ export class CancelablePromise<T> implements Promise<T> {
             }
         }
         this.#cancelHandlers.length = 0;
-        this.#reject?.(new CancelError('Request aborted'));
+        if (this.#reject) this.#reject(new CancelError('Request aborted'));
     }
 
     public get isCancelled(): boolean {
diff --git a/src/client/resource/core/request.ts b/src/client/resource/core/request.ts
index 1142d43219797c94e09f35ba83a9f5441892ddd2..c6a0602a006d2d1855c2ab50d2d7f43c2eb1bab4 100644
--- a/src/client/resource/core/request.ts
+++ b/src/client/resource/core/request.ts
@@ -145,10 +145,13 @@ export const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Reso
 };
 
 export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise<Record<string, string>> => {
-    const token = await resolve(options, config.TOKEN);
-    const username = await resolve(options, config.USERNAME);
-    const password = await resolve(options, config.PASSWORD);
-    const additionalHeaders = await resolve(options, config.HEADERS);
+    const [token, username, password, additionalHeaders] = await Promise.all([
+        resolve(options, config.TOKEN),
+        resolve(options, config.USERNAME),
+        resolve(options, config.PASSWORD),
+        resolve(options, config.HEADERS),
+    ]);
+
     const formHeaders = typeof formData?.getHeaders === 'function' && formData?.getHeaders() || {}
 
     const headers = Object.entries({
diff --git a/src/client/resource/models/ErrorDetail.ts b/src/client/resource/models/ErrorDetail.ts
index eba50ab9335b70df9b29cada4c54cf9ffaad10a4..69dd37eb86bc15e2ab2037f3f82516493801e74d 100644
--- a/src/client/resource/models/ErrorDetail.ts
+++ b/src/client/resource/models/ErrorDetail.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Schema for a error due to a rejected request.
  */
diff --git a/src/client/resource/models/HTTPValidationError.ts b/src/client/resource/models/HTTPValidationError.ts
index c0bcc87cf7f3222638466bc2e5753ca1accf01f7..892e4257ccbb49769737cb2e78e0aad49d81a3b1 100644
--- a/src/client/resource/models/HTTPValidationError.ts
+++ b/src/client/resource/models/HTTPValidationError.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { ValidationError } from './ValidationError';
-
 export type HTTPValidationError = {
     detail?: Array<ValidationError>;
 };
diff --git a/src/client/resource/models/ResourceIn.ts b/src/client/resource/models/ResourceIn.ts
index c9c83e3be1eeebf4f6921c5bb63ed0bb1351dda0..bb3eddc4e2b8bc0763e0e1f71eb2b51d074e7e9d 100644
--- a/src/client/resource/models/ResourceIn.ts
+++ b/src/client/resource/models/ResourceIn.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type ResourceIn = {
     /**
      * Short tag describing the version of the resource
diff --git a/src/client/resource/models/ResourceOut.ts b/src/client/resource/models/ResourceOut.ts
index 2d1a2b0ab36b86bd6187baef0289880102c1f84b..dcb34557a6459d8d4a98764ce9376417ead6e4f7 100644
--- a/src/client/resource/models/ResourceOut.ts
+++ b/src/client/resource/models/ResourceOut.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { ResourceVersionOut } from './ResourceVersionOut';
-
 export type ResourceOut = {
     /**
      * Short Name for the resource
diff --git a/src/client/resource/models/ResourceVersionIn.ts b/src/client/resource/models/ResourceVersionIn.ts
index 4adef894b573bac397a82fb8c30935c485c4ba8e..68eb986b9852ca442172b4d9ac7ba2b1e33d8d00 100644
--- a/src/client/resource/models/ResourceVersionIn.ts
+++ b/src/client/resource/models/ResourceVersionIn.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type ResourceVersionIn = {
     /**
      * Short tag describing the version of the resource
diff --git a/src/client/resource/models/ResourceVersionOut.ts b/src/client/resource/models/ResourceVersionOut.ts
index 3723577012b7f6b1d9bf50a9d1396b95d7799cd5..7ab1dda6759829a8e9a4e3c4b0b9cf3658c8cb56 100644
--- a/src/client/resource/models/ResourceVersionOut.ts
+++ b/src/client/resource/models/ResourceVersionOut.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { Status } from './Status';
-
 export type ResourceVersionOut = {
     /**
      * Short tag describing the version of the resource
diff --git a/src/client/resource/models/Status.ts b/src/client/resource/models/Status.ts
index 7bd78cb3c4d2b1de22d1f3d72fc77de9275217dc..51aaaaac28610eeb989f2d761d1d9f525cdd8c4b 100644
--- a/src/client/resource/models/Status.ts
+++ b/src/client/resource/models/Status.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Enumeration for the possible status of a resource version.
  */
diff --git a/src/client/resource/models/ValidationError.ts b/src/client/resource/models/ValidationError.ts
index 18997ec72f4103731f38d915508522ba23ba8506..f2ff49a2b9ad95d18a90c95dc2a7c0b60b7e85e7 100644
--- a/src/client/resource/models/ValidationError.ts
+++ b/src/client/resource/models/ValidationError.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type ValidationError = {
     loc: Array<(string | number)>;
     msg: string;
diff --git a/src/client/resource/services/ResourceService.ts b/src/client/resource/services/ResourceService.ts
index 7d00e5718418467e00872175d99bece8c6800d8a..2c182a2bdc2b2aec492e95d0f6b0b26951b367cd 100644
--- a/src/client/resource/services/ResourceService.ts
+++ b/src/client/resource/services/ResourceService.ts
@@ -5,13 +5,10 @@
 import type { ResourceIn } from '../models/ResourceIn';
 import type { ResourceOut } from '../models/ResourceOut';
 import type { Status } from '../models/Status';
-
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class ResourceService {
-
     /**
      * List resources
      * List all resources.
@@ -24,9 +21,9 @@ export class ResourceService {
      * @throws ApiError
      */
     public static resourceListResources(
-        maintainerId?: (string | null),
-        versionStatus?: (Array<Status> | null),
-        nameSubstring?: (string | null),
+        maintainerId?: string,
+        versionStatus?: Array<Status>,
+        nameSubstring?: string,
     ): CancelablePromise<Array<ResourceOut>> {
         return __request(OpenAPI, {
             method: 'GET',
@@ -44,7 +41,6 @@ export class ResourceService {
             },
         });
     }
-
     /**
      * Request a new resource
      * Request a new resources.
@@ -54,7 +50,7 @@ export class ResourceService {
      * @returns ResourceOut Successful Response
      * @throws ApiError
      */
-    public static resourceRequestResource(
+    public static resourceCreateResource(
         requestBody: ResourceIn,
     ): CancelablePromise<ResourceOut> {
         return __request(OpenAPI, {
@@ -70,7 +66,6 @@ export class ResourceService {
             },
         });
     }
-
     /**
      * Get a resource
      * Get a specific resource.
@@ -83,7 +78,7 @@ export class ResourceService {
      */
     public static resourceGetResource(
         rid: string,
-        versionStatus?: (Array<Status> | null),
+        versionStatus?: Array<Status>,
     ): CancelablePromise<ResourceOut> {
         return __request(OpenAPI, {
             method: 'GET',
@@ -102,7 +97,6 @@ export class ResourceService {
             },
         });
     }
-
     /**
      * Delete a resource
      * Delete a resources.
@@ -129,5 +123,4 @@ export class ResourceService {
             },
         });
     }
-
 }
diff --git a/src/client/resource/services/ResourceVersionService.ts b/src/client/resource/services/ResourceVersionService.ts
index dd1fa68ad31b9ad6d0b82aba36449d497dfb246e..804d721aaab59aea45dff36fda2481770c257149 100644
--- a/src/client/resource/services/ResourceVersionService.ts
+++ b/src/client/resource/services/ResourceVersionService.ts
@@ -5,13 +5,10 @@
 import type { ResourceVersionIn } from '../models/ResourceVersionIn';
 import type { ResourceVersionOut } from '../models/ResourceVersionOut';
 import type { Status } from '../models/Status';
-
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class ResourceVersionService {
-
     /**
      * List versions of a resource
      * List all the resource version for a specific resource.
@@ -24,7 +21,7 @@ export class ResourceVersionService {
      */
     public static resourceVersionListResourceVersions(
         rid: string,
-        versionStatus?: (Array<Status> | null),
+        versionStatus?: Array<Status>,
     ): CancelablePromise<Array<ResourceVersionOut>> {
         return __request(OpenAPI, {
             method: 'GET',
@@ -43,7 +40,6 @@ export class ResourceVersionService {
             },
         });
     }
-
     /**
      * Request new version of a resource
      * Request a new resource version.
@@ -74,7 +70,6 @@ export class ResourceVersionService {
             },
         });
     }
-
     /**
      * Get version of a resource
      * Get a specific resource version for a specific resource.
@@ -105,7 +100,6 @@ export class ResourceVersionService {
             },
         });
     }
-
     /**
      * Request resource version synchronization
      * Request the synchronization of a resource version to the cluster.
@@ -135,7 +129,6 @@ export class ResourceVersionService {
             },
         });
     }
-
     /**
      * Synchronize resource version with cluster
      * Synchronize the resource version to the cluster.
@@ -165,7 +158,6 @@ export class ResourceVersionService {
             },
         });
     }
-
     /**
      * Set resource version to latest
      * Set the resource version as the latest version.
@@ -195,7 +187,6 @@ export class ResourceVersionService {
             },
         });
     }
-
     /**
      * Delete resource version on cluster
      * Delete the resource version on the cluster.
@@ -225,7 +216,6 @@ export class ResourceVersionService {
             },
         });
     }
-
     /**
      * Delete resource version in S3
      * Delete the resource version in the S3 bucket.
@@ -255,5 +245,4 @@ export class ResourceVersionService {
             },
         });
     }
-
 }
diff --git a/src/client/s3proxy/core/CancelablePromise.ts b/src/client/s3proxy/core/CancelablePromise.ts
index 55fef8517238d2dab7478598eefca72e657b9fb5..eb02246c31f61b897667a6433d55b8b413bafbc1 100644
--- a/src/client/s3proxy/core/CancelablePromise.ts
+++ b/src/client/s3proxy/core/CancelablePromise.ts
@@ -51,7 +51,7 @@ export class CancelablePromise<T> implements Promise<T> {
                     return;
                 }
                 this.#isResolved = true;
-                this.#resolve?.(value);
+                if (this.#resolve) this.#resolve(value);
             };
 
             const onReject = (reason?: any): void => {
@@ -59,7 +59,7 @@ export class CancelablePromise<T> implements Promise<T> {
                     return;
                 }
                 this.#isRejected = true;
-                this.#reject?.(reason);
+                if (this.#reject) this.#reject(reason);
             };
 
             const onCancel = (cancelHandler: () => void): void => {
@@ -122,7 +122,7 @@ export class CancelablePromise<T> implements Promise<T> {
             }
         }
         this.#cancelHandlers.length = 0;
-        this.#reject?.(new CancelError('Request aborted'));
+        if (this.#reject) this.#reject(new CancelError('Request aborted'));
     }
 
     public get isCancelled(): boolean {
diff --git a/src/client/s3proxy/core/request.ts b/src/client/s3proxy/core/request.ts
index 1142d43219797c94e09f35ba83a9f5441892ddd2..c6a0602a006d2d1855c2ab50d2d7f43c2eb1bab4 100644
--- a/src/client/s3proxy/core/request.ts
+++ b/src/client/s3proxy/core/request.ts
@@ -145,10 +145,13 @@ export const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Reso
 };
 
 export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise<Record<string, string>> => {
-    const token = await resolve(options, config.TOKEN);
-    const username = await resolve(options, config.USERNAME);
-    const password = await resolve(options, config.PASSWORD);
-    const additionalHeaders = await resolve(options, config.HEADERS);
+    const [token, username, password, additionalHeaders] = await Promise.all([
+        resolve(options, config.TOKEN),
+        resolve(options, config.USERNAME),
+        resolve(options, config.PASSWORD),
+        resolve(options, config.HEADERS),
+    ]);
+
     const formHeaders = typeof formData?.getHeaders === 'function' && formData?.getHeaders() || {}
 
     const headers = Object.entries({
diff --git a/src/client/s3proxy/models/BucketIn.ts b/src/client/s3proxy/models/BucketIn.ts
index 96ff7b44981b9551e21fd5562e8d82caeb080043..9505a6420088ebf53b6601e1700d92a865272eb0 100644
--- a/src/client/s3proxy/models/BucketIn.ts
+++ b/src/client/s3proxy/models/BucketIn.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Schema for creating a new bucket.
  */
diff --git a/src/client/s3proxy/models/BucketOut.ts b/src/client/s3proxy/models/BucketOut.ts
index 5b38801ea29b9a411113b9b5c2343d33c6f1ef15..cbb67fb5d8ca30e046785ffb35be521c81e49937 100644
--- a/src/client/s3proxy/models/BucketOut.ts
+++ b/src/client/s3proxy/models/BucketOut.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { Constraint } from './Constraint';
-
 /**
  * Schema for answering a request with a bucket.
  */
diff --git a/src/client/s3proxy/models/BucketPermissionIn.ts b/src/client/s3proxy/models/BucketPermissionIn.ts
index 06bd223c69ce58189c1699343b1018187a8942c1..e0e38255d47fedaf9bf6abda58b1e8e5e5537ef5 100644
--- a/src/client/s3proxy/models/BucketPermissionIn.ts
+++ b/src/client/s3proxy/models/BucketPermissionIn.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { Permission } from './Permission';
-
 export type BucketPermissionIn = {
     /**
      * Start date of permission as UNIX timestamp
diff --git a/src/client/s3proxy/models/BucketPermissionOut.ts b/src/client/s3proxy/models/BucketPermissionOut.ts
index 38ac0254a4332ab86e098af5767e16cd022d0d80..ec3c79d39c434447e2df2791206f05f5f278f909 100644
--- a/src/client/s3proxy/models/BucketPermissionOut.ts
+++ b/src/client/s3proxy/models/BucketPermissionOut.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { Permission } from './Permission';
-
 /**
  * Schema for the bucket permissions.
  */
diff --git a/src/client/s3proxy/models/BucketPermissionParameters.ts b/src/client/s3proxy/models/BucketPermissionParameters.ts
index 4d8ef97bf2f6c6f51fbb3a1c4f2937fba8a0aefb..47c7576e18ad4ec0e6ff29040c723153eeee612b 100644
--- a/src/client/s3proxy/models/BucketPermissionParameters.ts
+++ b/src/client/s3proxy/models/BucketPermissionParameters.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { Permission } from './Permission';
-
 /**
  * Schema for the parameters of a bucket permission.
  */
diff --git a/src/client/s3proxy/models/BucketType.ts b/src/client/s3proxy/models/BucketType.ts
index b096c70b0b7234bc57dd1ecc2223bd41aa3e0d08..8001a27664273bd2a5ad360f6f10444be2e7046d 100644
--- a/src/client/s3proxy/models/BucketType.ts
+++ b/src/client/s3proxy/models/BucketType.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Enumeration for the type of buckets to fetch from the DB
  *
diff --git a/src/client/s3proxy/models/Constraint.ts b/src/client/s3proxy/models/Constraint.ts
index afa995a983b5e08b66d55b8dfa4243553351d3a7..99043221bd2e12d3e2a112ae9308437d99e7df40 100644
--- a/src/client/s3proxy/models/Constraint.ts
+++ b/src/client/s3proxy/models/Constraint.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Enumeration for the possible permission on a bucket.
  */
diff --git a/src/client/s3proxy/models/ErrorDetail.ts b/src/client/s3proxy/models/ErrorDetail.ts
index eba50ab9335b70df9b29cada4c54cf9ffaad10a4..69dd37eb86bc15e2ab2037f3f82516493801e74d 100644
--- a/src/client/s3proxy/models/ErrorDetail.ts
+++ b/src/client/s3proxy/models/ErrorDetail.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Schema for a error due to a rejected request.
  */
diff --git a/src/client/s3proxy/models/HTTPValidationError.ts b/src/client/s3proxy/models/HTTPValidationError.ts
index c0bcc87cf7f3222638466bc2e5753ca1accf01f7..892e4257ccbb49769737cb2e78e0aad49d81a3b1 100644
--- a/src/client/s3proxy/models/HTTPValidationError.ts
+++ b/src/client/s3proxy/models/HTTPValidationError.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { ValidationError } from './ValidationError';
-
 export type HTTPValidationError = {
     detail?: Array<ValidationError>;
 };
diff --git a/src/client/s3proxy/models/Permission.ts b/src/client/s3proxy/models/Permission.ts
index 00592a496a01e178e7192ba3bd76c51b29a3a138..33aebf753f36ab7b85a50e0de9d47501f3ff8709 100644
--- a/src/client/s3proxy/models/Permission.ts
+++ b/src/client/s3proxy/models/Permission.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Enumeration for the possible permission on a bucket.
  */
diff --git a/src/client/s3proxy/models/PermissionStatus.ts b/src/client/s3proxy/models/PermissionStatus.ts
index d51e0928ec89e662e033c833ceacd5bd6c66bc74..0d858f08edd1fdb664ee83cc5805423dc3dd93f5 100644
--- a/src/client/s3proxy/models/PermissionStatus.ts
+++ b/src/client/s3proxy/models/PermissionStatus.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the
  * permission itself has a time limit and the current time is not in the timespan.
diff --git a/src/client/s3proxy/models/S3Key.ts b/src/client/s3proxy/models/S3Key.ts
index cc9f01a57583423aeaad174dc68c8e96c16706a9..b3c30da182357c5a2d3b3c07c315c3cc3a6ff917 100644
--- a/src/client/s3proxy/models/S3Key.ts
+++ b/src/client/s3proxy/models/S3Key.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Schema for a S3 key associated with a user.
  */
diff --git a/src/client/s3proxy/models/ValidationError.ts b/src/client/s3proxy/models/ValidationError.ts
index 18997ec72f4103731f38d915508522ba23ba8506..f2ff49a2b9ad95d18a90c95dc2a7c0b60b7e85e7 100644
--- a/src/client/s3proxy/models/ValidationError.ts
+++ b/src/client/s3proxy/models/ValidationError.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type ValidationError = {
     loc: Array<(string | number)>;
     msg: string;
diff --git a/src/client/s3proxy/services/BucketPermissionService.ts b/src/client/s3proxy/services/BucketPermissionService.ts
index 3b55d1bc1c6674483f24e3471fd5ae07d4cfa189..d5119dc321fff3d195d7638805baa255aefaad6f 100644
--- a/src/client/s3proxy/services/BucketPermissionService.ts
+++ b/src/client/s3proxy/services/BucketPermissionService.ts
@@ -7,13 +7,10 @@ import type { BucketPermissionOut } from '../models/BucketPermissionOut';
 import type { BucketPermissionParameters } from '../models/BucketPermissionParameters';
 import type { Permission } from '../models/Permission';
 import type { PermissionStatus } from '../models/PermissionStatus';
-
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class BucketPermissionService {
-
     /**
      * Get permission for bucket and user combination.
      * Get the bucket permissions for the specific combination of bucket and user.
@@ -46,7 +43,6 @@ export class BucketPermissionService {
             },
         });
     }
-
     /**
      * Delete a bucket permission
      * Delete the bucket permissions for the specific combination of bucket and user.
@@ -79,7 +75,6 @@ export class BucketPermissionService {
             },
         });
     }
-
     /**
      * Update a bucket permission
      * Update a permission for a bucket and user.
@@ -114,7 +109,6 @@ export class BucketPermissionService {
             },
         });
     }
-
     /**
      * Get all permissions for a bucket.
      * List all the bucket permissions for the given bucket.
@@ -150,7 +144,6 @@ export class BucketPermissionService {
             },
         });
     }
-
     /**
      * Get all permissions for a user.
      * List all the bucket permissions for the given user.
@@ -186,7 +179,6 @@ export class BucketPermissionService {
             },
         });
     }
-
     /**
      * Create a permission.
      * Create a permission for a bucket and user.
@@ -212,5 +204,4 @@ export class BucketPermissionService {
             },
         });
     }
-
 }
diff --git a/src/client/s3proxy/services/BucketService.ts b/src/client/s3proxy/services/BucketService.ts
index d51b66804563285d8e72e555076407af7ee381d9..92cee996275bb497a6151023f844736cb7d6a8c5 100644
--- a/src/client/s3proxy/services/BucketService.ts
+++ b/src/client/s3proxy/services/BucketService.ts
@@ -5,13 +5,10 @@
 import type { BucketIn } from '../models/BucketIn';
 import type { BucketOut } from '../models/BucketOut';
 import type { BucketType } from '../models/BucketType';
-
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class BucketService {
-
     /**
      * List buckets of user
      * List all the buckets in the system or of the desired user where the user has READ permissions for.
@@ -41,7 +38,6 @@ export class BucketService {
             },
         });
     }
-
     /**
      * Create a bucket for the current user
      * Create a bucket for the current user.
@@ -71,7 +67,6 @@ export class BucketService {
             },
         });
     }
-
     /**
      * Get a bucket by its name
      * Get a bucket by its name if the current user has READ permissions for the bucket.
@@ -99,7 +94,6 @@ export class BucketService {
             },
         });
     }
-
     /**
      * Delete a bucket
      * Delete a bucket by its name. Only the owner of the bucket can delete the bucket.
@@ -132,5 +126,4 @@ export class BucketService {
             },
         });
     }
-
 }
diff --git a/src/client/s3proxy/services/S3KeyService.ts b/src/client/s3proxy/services/S3KeyService.ts
index c8e048bdc22fbbd683259c5850045063938a7aee..732fd680c4e5530909a9e67fb3d5eb28137d057f 100644
--- a/src/client/s3proxy/services/S3KeyService.ts
+++ b/src/client/s3proxy/services/S3KeyService.ts
@@ -3,13 +3,10 @@
 /* tslint:disable */
 /* eslint-disable */
 import type { S3Key } from '../models/S3Key';
-
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class S3KeyService {
-
     /**
      * Get the S3 Access keys from a user
      * Get all the S3 Access keys for a specific user.
@@ -36,7 +33,6 @@ export class S3KeyService {
             },
         });
     }
-
     /**
      * Create a Access key for a user
      * Create a S3 Access key for a specific user.
@@ -63,7 +59,6 @@ export class S3KeyService {
             },
         });
     }
-
     /**
      * Get a specific S3 Access key from a user
      * Get a specific S3 Access Key for a specific user.
@@ -93,7 +88,6 @@ export class S3KeyService {
             },
         });
     }
-
     /**
      * Delete a specific S3 Access key from a user
      * Delete a specific S3 Access key for a specific user.
@@ -123,5 +117,4 @@ export class S3KeyService {
             },
         });
     }
-
 }
diff --git a/src/client/workflow/core/CancelablePromise.ts b/src/client/workflow/core/CancelablePromise.ts
index 55fef8517238d2dab7478598eefca72e657b9fb5..eb02246c31f61b897667a6433d55b8b413bafbc1 100644
--- a/src/client/workflow/core/CancelablePromise.ts
+++ b/src/client/workflow/core/CancelablePromise.ts
@@ -51,7 +51,7 @@ export class CancelablePromise<T> implements Promise<T> {
                     return;
                 }
                 this.#isResolved = true;
-                this.#resolve?.(value);
+                if (this.#resolve) this.#resolve(value);
             };
 
             const onReject = (reason?: any): void => {
@@ -59,7 +59,7 @@ export class CancelablePromise<T> implements Promise<T> {
                     return;
                 }
                 this.#isRejected = true;
-                this.#reject?.(reason);
+                if (this.#reject) this.#reject(reason);
             };
 
             const onCancel = (cancelHandler: () => void): void => {
@@ -122,7 +122,7 @@ export class CancelablePromise<T> implements Promise<T> {
             }
         }
         this.#cancelHandlers.length = 0;
-        this.#reject?.(new CancelError('Request aborted'));
+        if (this.#reject) this.#reject(new CancelError('Request aborted'));
     }
 
     public get isCancelled(): boolean {
diff --git a/src/client/workflow/core/request.ts b/src/client/workflow/core/request.ts
index 1142d43219797c94e09f35ba83a9f5441892ddd2..c6a0602a006d2d1855c2ab50d2d7f43c2eb1bab4 100644
--- a/src/client/workflow/core/request.ts
+++ b/src/client/workflow/core/request.ts
@@ -145,10 +145,13 @@ export const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Reso
 };
 
 export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise<Record<string, string>> => {
-    const token = await resolve(options, config.TOKEN);
-    const username = await resolve(options, config.USERNAME);
-    const password = await resolve(options, config.PASSWORD);
-    const additionalHeaders = await resolve(options, config.HEADERS);
+    const [token, username, password, additionalHeaders] = await Promise.all([
+        resolve(options, config.TOKEN),
+        resolve(options, config.USERNAME),
+        resolve(options, config.PASSWORD),
+        resolve(options, config.HEADERS),
+    ]);
+
     const formHeaders = typeof formData?.getHeaders === 'function' && formData?.getHeaders() || {}
 
     const headers = Object.entries({
diff --git a/src/client/workflow/models/AnonymizedWorkflowExecution.ts b/src/client/workflow/models/AnonymizedWorkflowExecution.ts
index eb4085fe63360b4b3018cf3e85a097f9679422ed..11497f73bf3bb867a29356784391a47e8b028df0 100644
--- a/src/client/workflow/models/AnonymizedWorkflowExecution.ts
+++ b/src/client/workflow/models/AnonymizedWorkflowExecution.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { WorkflowExecutionStatus } from './WorkflowExecutionStatus';
-
 export type AnonymizedWorkflowExecution = {
     /**
      * ID of the workflow execution
diff --git a/src/client/workflow/models/Body_Workflow_Version_upload_workflow_version_icon.ts b/src/client/workflow/models/Body_Workflow_Version_upload_workflow_version_icon.ts
index 208b0c24d5b34514fe1156aafeddabd72645a53c..fa8dd9ee4c8d6757fd68c4ede429a0122f03546d 100644
--- a/src/client/workflow/models/Body_Workflow_Version_upload_workflow_version_icon.ts
+++ b/src/client/workflow/models/Body_Workflow_Version_upload_workflow_version_icon.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type Body_Workflow_Version_upload_workflow_version_icon = {
     /**
      * Optional Icon for the Workflow.
diff --git a/src/client/workflow/models/DevWorkflowExecutionIn.ts b/src/client/workflow/models/DevWorkflowExecutionIn.ts
index e8c8a5268a58669f45acee40630ad7d6c1d9c21a..ad6cbd949c0011a656dfd2ef699cfe7e90c180ac 100644
--- a/src/client/workflow/models/DevWorkflowExecutionIn.ts
+++ b/src/client/workflow/models/DevWorkflowExecutionIn.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { WorkflowModeIn } from './WorkflowModeIn';
-
 export type DevWorkflowExecutionIn = {
     /**
      * Parameters for this workflow
diff --git a/src/client/workflow/models/DocumentationEnum.ts b/src/client/workflow/models/DocumentationEnum.ts
index 1ae04856a01b1b0b6dfe8c550ec97720aaeb4cd6..2f5b3e3d5833fb1775dd5d45ccef997b2e9b471f 100644
--- a/src/client/workflow/models/DocumentationEnum.ts
+++ b/src/client/workflow/models/DocumentationEnum.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export enum DocumentationEnum {
     USAGE = 'usage',
     INPUT = 'input',
diff --git a/src/client/workflow/models/ErrorDetail.ts b/src/client/workflow/models/ErrorDetail.ts
index eba50ab9335b70df9b29cada4c54cf9ffaad10a4..69dd37eb86bc15e2ab2037f3f82516493801e74d 100644
--- a/src/client/workflow/models/ErrorDetail.ts
+++ b/src/client/workflow/models/ErrorDetail.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Schema for a error due to a rejected request.
  */
diff --git a/src/client/workflow/models/HTTPValidationError.ts b/src/client/workflow/models/HTTPValidationError.ts
index c0bcc87cf7f3222638466bc2e5753ca1accf01f7..892e4257ccbb49769737cb2e78e0aad49d81a3b1 100644
--- a/src/client/workflow/models/HTTPValidationError.ts
+++ b/src/client/workflow/models/HTTPValidationError.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { ValidationError } from './ValidationError';
-
 export type HTTPValidationError = {
     detail?: Array<ValidationError>;
 };
diff --git a/src/client/workflow/models/IconUpdateOut.ts b/src/client/workflow/models/IconUpdateOut.ts
index 0499796ef14433d99fae156f3508df5ed0db9984..1210a9304608adaafc41a6be01dbbb145f8d9964 100644
--- a/src/client/workflow/models/IconUpdateOut.ts
+++ b/src/client/workflow/models/IconUpdateOut.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type IconUpdateOut = {
     /**
      * URL to the uploaded icon
diff --git a/src/client/workflow/models/Status.ts b/src/client/workflow/models/Status.ts
index 8da66ea5e286d86b0f4d9d1c3b7bac8167d769ab..fd918bd83e94662808073249cf91cc0d8b721fac 100644
--- a/src/client/workflow/models/Status.ts
+++ b/src/client/workflow/models/Status.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Enumeration for the possible status of a workflow version.
  */
diff --git a/src/client/workflow/models/ValidationError.ts b/src/client/workflow/models/ValidationError.ts
index 18997ec72f4103731f38d915508522ba23ba8506..f2ff49a2b9ad95d18a90c95dc2a7c0b60b7e85e7 100644
--- a/src/client/workflow/models/ValidationError.ts
+++ b/src/client/workflow/models/ValidationError.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type ValidationError = {
     loc: Array<(string | number)>;
     msg: string;
diff --git a/src/client/workflow/models/WorkflowCredentialsIn.ts b/src/client/workflow/models/WorkflowCredentialsIn.ts
index 37723a3e3a9384f04e6d52ecd6ac4f302d6ac304..a3b3c105701dfc4949bd81bb26409275e60a7b64 100644
--- a/src/client/workflow/models/WorkflowCredentialsIn.ts
+++ b/src/client/workflow/models/WorkflowCredentialsIn.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type WorkflowCredentialsIn = {
     /**
      * Token to access the content git repository
diff --git a/src/client/workflow/models/WorkflowCredentialsOut.ts b/src/client/workflow/models/WorkflowCredentialsOut.ts
index 8a447b4228303bd6e0204694408a131b9a15b0d2..371252ccef56cbab9fae83919271e08aa6ae198d 100644
--- a/src/client/workflow/models/WorkflowCredentialsOut.ts
+++ b/src/client/workflow/models/WorkflowCredentialsOut.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type WorkflowCredentialsOut = {
     /**
      * Token to access the content git repository
diff --git a/src/client/workflow/models/WorkflowExecutionIn.ts b/src/client/workflow/models/WorkflowExecutionIn.ts
index 3532aa80d246e34c0974e847894e043dfbc6b02d..223447aee1646e8aa2cb72943f6772a5812e044e 100644
--- a/src/client/workflow/models/WorkflowExecutionIn.ts
+++ b/src/client/workflow/models/WorkflowExecutionIn.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type WorkflowExecutionIn = {
     /**
      * Parameters for this workflow
diff --git a/src/client/workflow/models/WorkflowExecutionOut.ts b/src/client/workflow/models/WorkflowExecutionOut.ts
index a804c6ade04581facc1d0543e3fcc60a3a030803..dc3e9811125d2bb768b207dfa0ae0e738a798a32 100644
--- a/src/client/workflow/models/WorkflowExecutionOut.ts
+++ b/src/client/workflow/models/WorkflowExecutionOut.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { WorkflowExecutionStatus } from './WorkflowExecutionStatus';
-
 export type WorkflowExecutionOut = {
     /**
      * Workflow version git commit hash
diff --git a/src/client/workflow/models/WorkflowExecutionStatus.ts b/src/client/workflow/models/WorkflowExecutionStatus.ts
index dee8c8fea4f0bbb84f2b8aaf69f626989e1639a6..6b92108d72486d7dbf7cd63606e0e5210d479c02 100644
--- a/src/client/workflow/models/WorkflowExecutionStatus.ts
+++ b/src/client/workflow/models/WorkflowExecutionStatus.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 /**
  * Enumeration for the status on a workflow execution.
  */
diff --git a/src/client/workflow/models/WorkflowIn.ts b/src/client/workflow/models/WorkflowIn.ts
index 9367556e9ffa26da9b64044efbd577d24dc145f7..c5322ce22a5df57eade165e222023333d7d79dd1 100644
--- a/src/client/workflow/models/WorkflowIn.ts
+++ b/src/client/workflow/models/WorkflowIn.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { WorkflowModeIn } from './WorkflowModeIn';
-
 export type WorkflowIn = {
     /**
      * Short descriptive name of the workflow
diff --git a/src/client/workflow/models/WorkflowModeIn.ts b/src/client/workflow/models/WorkflowModeIn.ts
index a50b038c1abd7c60352b1526e164c652aa99e7df..7d8d2d439cc4fa451a071aa2edbf5457c2c84c06 100644
--- a/src/client/workflow/models/WorkflowModeIn.ts
+++ b/src/client/workflow/models/WorkflowModeIn.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type WorkflowModeIn = {
     /**
      * Path to the alternative parameter schema
diff --git a/src/client/workflow/models/WorkflowModeOut.ts b/src/client/workflow/models/WorkflowModeOut.ts
index 1d52e08bd2580b58af3b5204a6e6ebc1fa2d6ee8..d3b61d56fadb4e1e93d4ba47a6fb65e2118b6906 100644
--- a/src/client/workflow/models/WorkflowModeOut.ts
+++ b/src/client/workflow/models/WorkflowModeOut.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type WorkflowModeOut = {
     /**
      * Path to the alternative parameter schema
diff --git a/src/client/workflow/models/WorkflowOut.ts b/src/client/workflow/models/WorkflowOut.ts
index a3d055f5a99d8683b29183cfe42cf01b9903ad28..90fbae386c4790be3b6063d3cff5db722dcd9d4d 100644
--- a/src/client/workflow/models/WorkflowOut.ts
+++ b/src/client/workflow/models/WorkflowOut.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { WorkflowVersion } from './WorkflowVersion';
-
 export type WorkflowOut = {
     /**
      * Short descriptive name of the workflow
diff --git a/src/client/workflow/models/WorkflowStatistic.ts b/src/client/workflow/models/WorkflowStatistic.ts
index 4b7fbade791196f814a52cee40e8cca117ea8102..d84e2dc9ce8a30ce6d93a355774e56957fb117e3 100644
--- a/src/client/workflow/models/WorkflowStatistic.ts
+++ b/src/client/workflow/models/WorkflowStatistic.ts
@@ -2,7 +2,6 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 export type WorkflowStatistic = {
     /**
      * Day of the datapoint
diff --git a/src/client/workflow/models/WorkflowUpdate.ts b/src/client/workflow/models/WorkflowUpdate.ts
index 6aa6f1874344aff94967d05ddd3958cd86726d71..879f4bc2d303f3e3bd247b63b3996a14b9fa1b41 100644
--- a/src/client/workflow/models/WorkflowUpdate.ts
+++ b/src/client/workflow/models/WorkflowUpdate.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { WorkflowModeIn } from './WorkflowModeIn';
-
 export type WorkflowUpdate = {
     /**
      * Version of the Workflow. Should follow semantic versioning
diff --git a/src/client/workflow/models/WorkflowVersion.ts b/src/client/workflow/models/WorkflowVersion.ts
index 26b656fb2a8edb63630ab92736f2f6c6b592a656..d27d809fcdb2796a2967c04cb429cc9e3528cc86 100644
--- a/src/client/workflow/models/WorkflowVersion.ts
+++ b/src/client/workflow/models/WorkflowVersion.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { Status } from './Status';
-
 export type WorkflowVersion = {
     /**
      * Status of the workflow version
diff --git a/src/client/workflow/models/WorkflowVersionStatus.ts b/src/client/workflow/models/WorkflowVersionStatus.ts
index 0c66d1dd6b28229891c5c7d5ceed3eefab291c4e..765e6881cbcd8211096130a094584eb7f04ffa1d 100644
--- a/src/client/workflow/models/WorkflowVersionStatus.ts
+++ b/src/client/workflow/models/WorkflowVersionStatus.ts
@@ -2,9 +2,7 @@
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-
 import type { Status } from './Status';
-
 export type WorkflowVersionStatus = {
     /**
      * Status of the workflow version
diff --git a/src/client/workflow/services/WorkflowCredentialsService.ts b/src/client/workflow/services/WorkflowCredentialsService.ts
index 1f9f891efb06fa6cd1b4304e817b59ef954d6cd7..cf305facb9a62fb2441bb3db98d42d53a76a0be4 100644
--- a/src/client/workflow/services/WorkflowCredentialsService.ts
+++ b/src/client/workflow/services/WorkflowCredentialsService.ts
@@ -4,13 +4,10 @@
 /* eslint-disable */
 import type { WorkflowCredentialsIn } from '../models/WorkflowCredentialsIn';
 import type { WorkflowCredentialsOut } from '../models/WorkflowCredentialsOut';
-
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class WorkflowCredentialsService {
-
     /**
      * Get the credentials of a workflow
      * Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.
@@ -37,7 +34,6 @@ export class WorkflowCredentialsService {
             },
         });
     }
-
     /**
      * Update the credentials of a workflow
      * Update the credentials for the repository of a workflow.
@@ -68,7 +64,6 @@ export class WorkflowCredentialsService {
             },
         });
     }
-
     /**
      * Delete the credentials of a workflow
      * Delete the credentials for the repository of a workflow.
@@ -95,5 +90,4 @@ export class WorkflowCredentialsService {
             },
         });
     }
-
 }
diff --git a/src/client/workflow/services/WorkflowExecutionService.ts b/src/client/workflow/services/WorkflowExecutionService.ts
index 199ba7b7ac8000a30397d7136a0cc7bec8056c1d..db4e486b8de62e08f85e7d965cc1fb4f667df7b4 100644
--- a/src/client/workflow/services/WorkflowExecutionService.ts
+++ b/src/client/workflow/services/WorkflowExecutionService.ts
@@ -6,13 +6,10 @@ import type { DevWorkflowExecutionIn } from '../models/DevWorkflowExecutionIn';
 import type { WorkflowExecutionIn } from '../models/WorkflowExecutionIn';
 import type { WorkflowExecutionOut } from '../models/WorkflowExecutionOut';
 import type { WorkflowExecutionStatus } from '../models/WorkflowExecutionStatus';
-
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class WorkflowExecutionService {
-
     /**
      * Start a new workflow execution
      * Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.
@@ -39,7 +36,6 @@ export class WorkflowExecutionService {
             },
         });
     }
-
     /**
      * Get all workflow executions
      * Get all workflow executions.
@@ -73,7 +69,6 @@ export class WorkflowExecutionService {
             },
         });
     }
-
     /**
      * Start a workflow execution with arbitrary git repository
      * Start a new workflow execution from an arbitrary git repository.
@@ -103,7 +98,6 @@ export class WorkflowExecutionService {
             },
         });
     }
-
     /**
      * Get a workflow execution
      * Get a specific workflow execution.
@@ -131,7 +125,6 @@ export class WorkflowExecutionService {
             },
         });
     }
-
     /**
      * Delete a workflow execution
      * Delete a specific workflow execution.
@@ -159,7 +152,6 @@ export class WorkflowExecutionService {
             },
         });
     }
-
     /**
      * Get the parameters of a workflow execution
      * Get the parameters of a specific workflow execution.
@@ -187,7 +179,6 @@ export class WorkflowExecutionService {
             },
         });
     }
-
     /**
      * Cancel a workflow execution
      * Cancel a running workflow execution.
@@ -215,5 +206,4 @@ export class WorkflowExecutionService {
             },
         });
     }
-
 }
diff --git a/src/client/workflow/services/WorkflowModeService.ts b/src/client/workflow/services/WorkflowModeService.ts
index f5e1926c3ffbe233d8fe9027c91683a71fd23f94..f0fa89dca30c50887a27346f3e647c0fda00c91e 100644
--- a/src/client/workflow/services/WorkflowModeService.ts
+++ b/src/client/workflow/services/WorkflowModeService.ts
@@ -3,13 +3,10 @@
 /* tslint:disable */
 /* eslint-disable */
 import type { WorkflowModeOut } from '../models/WorkflowModeOut';
-
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class WorkflowModeService {
-
     /**
      * Get workflow mode
      * Get a workflow mode
@@ -36,5 +33,4 @@ export class WorkflowModeService {
             },
         });
     }
-
 }
diff --git a/src/client/workflow/services/WorkflowService.ts b/src/client/workflow/services/WorkflowService.ts
index b173a102fe754904bcd8acfb703ef02616a7d5e5..9dc2f2ca53a4544e0e67abafcab7c8d6d375730e 100644
--- a/src/client/workflow/services/WorkflowService.ts
+++ b/src/client/workflow/services/WorkflowService.ts
@@ -13,13 +13,10 @@ import type { WorkflowStatistic } from '../models/WorkflowStatistic';
 import type { WorkflowUpdate } from '../models/WorkflowUpdate';
 import type { WorkflowVersion } from '../models/WorkflowVersion';
 import type { WorkflowVersionStatus } from '../models/WorkflowVersionStatus';
-
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class WorkflowService {
-
     /**
      * List workflows
      * List all workflows.
@@ -52,7 +49,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Create a new workflow
      * Create a new workflow.
@@ -82,7 +78,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Get anonymized workflow execution
      * Get the workflow executions with meta information and anonymized user IDs.
@@ -119,7 +114,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Get a workflow
      * Get a specific workflow.
@@ -151,7 +145,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Delete a workflow
      * Delete a workflow.
@@ -178,7 +171,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Get statistics for a workflow
      * Get the number of started workflow per day.
@@ -205,7 +197,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Update a workflow
      * Create a new workflow version.
@@ -236,7 +227,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Get all versions of a workflow
      * List all versions of a Workflow.
@@ -268,7 +258,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Get a workflow version
      * Get a specific version of a workflow.
@@ -299,7 +288,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Update status of workflow version
      * Update the status of a workflow version.
@@ -333,7 +321,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Deprecate a workflow version
      * Deprecate a workflow version.
@@ -364,7 +351,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Fetch documentation for a workflow version
      * Get the documentation for a specific workflow version.
@@ -403,7 +389,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Upload icon for workflow version
      * Upload an icon for the workflow version and returns the new icon URL.
@@ -437,7 +422,6 @@ export class WorkflowService {
             },
         });
     }
-
     /**
      * Delete icon of workflow version
      * Delete the icon of the workflow version.
@@ -467,5 +451,4 @@ export class WorkflowService {
             },
         });
     }
-
 }
diff --git a/src/client/workflow/services/WorkflowVersionService.ts b/src/client/workflow/services/WorkflowVersionService.ts
index 9553b053cc3ee6f33dd087620f8ad227758324ef..47eb077b1e3a64e7b8e444e74739f4da674e97e4 100644
--- a/src/client/workflow/services/WorkflowVersionService.ts
+++ b/src/client/workflow/services/WorkflowVersionService.ts
@@ -8,13 +8,10 @@ import type { IconUpdateOut } from '../models/IconUpdateOut';
 import type { Status } from '../models/Status';
 import type { WorkflowVersion } from '../models/WorkflowVersion';
 import type { WorkflowVersionStatus } from '../models/WorkflowVersionStatus';
-
 import type { CancelablePromise } from '../core/CancelablePromise';
 import { OpenAPI } from '../core/OpenAPI';
 import { request as __request } from '../core/request';
-
 export class WorkflowVersionService {
-
     /**
      * Get all versions of a workflow
      * List all versions of a Workflow.
@@ -46,7 +43,6 @@ export class WorkflowVersionService {
             },
         });
     }
-
     /**
      * Get a workflow version
      * Get a specific version of a workflow.
@@ -77,7 +73,6 @@ export class WorkflowVersionService {
             },
         });
     }
-
     /**
      * Update status of workflow version
      * Update the status of a workflow version.
@@ -111,7 +106,6 @@ export class WorkflowVersionService {
             },
         });
     }
-
     /**
      * Deprecate a workflow version
      * Deprecate a workflow version.
@@ -142,7 +136,6 @@ export class WorkflowVersionService {
             },
         });
     }
-
     /**
      * Fetch documentation for a workflow version
      * Get the documentation for a specific workflow version.
@@ -181,7 +174,6 @@ export class WorkflowVersionService {
             },
         });
     }
-
     /**
      * Upload icon for workflow version
      * Upload an icon for the workflow version and returns the new icon URL.
@@ -215,7 +207,6 @@ export class WorkflowVersionService {
             },
         });
     }
-
     /**
      * Delete icon of workflow version
      * Delete the icon of the workflow version.
@@ -245,5 +236,4 @@ export class WorkflowVersionService {
             },
         });
     }
-
 }
diff --git a/src/components/NavbarTop.vue b/src/components/NavbarTop.vue
index 42b2635ed4c48681a56ee6fbe2932ad36374a2fa..60447d3582179cccef337c69de480e684c108477 100644
--- a/src/components/NavbarTop.vue
+++ b/src/components/NavbarTop.vue
@@ -119,11 +119,6 @@ watch(
                   >Available Workflows
                 </router-link>
               </li>
-              <li>
-                <router-link class="dropdown-item" :to="{ name: 'resources' }"
-                  >Available Resources
-                </router-link>
-              </li>
               <li>
                 <router-link
                   class="dropdown-item"
@@ -154,6 +149,40 @@ watch(
               </li>
             </ul>
           </li>
+          <li class="nav-item dropdown">
+            <a
+              class="nav-link dropdown-toggle"
+              :class="{ 'text-black': workflowActive }"
+              id="resourceDropdown"
+              href="#"
+              role="button"
+              data-bs-toggle="dropdown"
+              aria-expanded="false"
+              data-bs-auto-close="true"
+            >
+              Resources
+            </a>
+            <ul
+              class="dropdown-menu shadow m-0"
+              aria-labelledby="workflowDropdown"
+            >
+              <li>
+                <router-link class="dropdown-item" :to="{ name: 'resources' }"
+                  >Available Resources
+                </router-link>
+              </li>
+              <li v-if="store.resourceMaintainer || store.admin">
+                <hr class="dropdown-divider" />
+              </li>
+              <li v-if="store.resourceMaintainer || store.admin">
+                <router-link
+                  class="dropdown-item"
+                  :to="{ name: 'resource-maintainer' }"
+                  >My Resources
+                </router-link>
+              </li>
+            </ul>
+          </li>
         </ul>
       </div>
       <div class="dropdown" v-if="store.authenticated && store.user != null">
diff --git a/src/components/transitions/ResourceCard.vue b/src/components/resources/ResourceCard.vue
similarity index 97%
rename from src/components/transitions/ResourceCard.vue
rename to src/components/resources/ResourceCard.vue
index 2bcc585495b07cd44ba13e84a43d64e3d8459e59..f3c9140924c3c5f9fb01e34e0649d8440c434d79 100644
--- a/src/components/transitions/ResourceCard.vue
+++ b/src/components/resources/ResourceCard.vue
@@ -93,7 +93,7 @@ const resourceVersions = computed<ResourceVersionOut[]>(
                   }}
                 </p>
                 <div>
-                  Path on Cluster: <br />{{ resourceVersion.cluster_path }}
+                  Nextflow Access Path: <br />{{ resourceVersion.cluster_path }}
                 </div>
               </div>
             </div>
diff --git a/src/components/resources/createResourceModal.vue b/src/components/resources/createResourceModal.vue
new file mode 100644
index 0000000000000000000000000000000000000000..27dc54ce04625c82776536b59505eb775c45618a
--- /dev/null
+++ b/src/components/resources/createResourceModal.vue
@@ -0,0 +1,205 @@
+<script setup lang="ts">
+import { reactive, onMounted, ref } from "vue";
+import BootstrapModal from "@/components/modals/BootstrapModal.vue";
+import { Modal } from "bootstrap";
+import { useResourceStore } from "@/stores/resources";
+import type { ResourceIn } from "@/client/resource";
+
+const resourceRepository = useResourceStore();
+
+const resourceCreateForm = ref<HTMLFormElement | undefined>(undefined);
+const resourceNameElement = ref<HTMLInputElement | undefined>(undefined);
+
+const resource = reactive<ResourceIn>({
+  name: "",
+  description: "",
+  release: "",
+  source: "",
+});
+
+const formState = reactive<{
+  validated: boolean;
+  resourceNameTaken: boolean;
+  loading: boolean;
+}>({
+  validated: false,
+  resourceNameTaken: false,
+  loading: false,
+});
+
+const props = defineProps<{
+  modalID: string;
+}>();
+
+let createResourceModal: Modal | null = null;
+
+onMounted(() => {
+  createResourceModal = new Modal("#" + props.modalID);
+});
+
+function createResource() {
+  formState.validated = true;
+  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+  formState.resourceNameTaken = false;
+  resource.description = resource.description.trim();
+  resource.name = resource.name.trim();
+  resourceNameElement.value?.setCustomValidity("");
+  if (resourceCreateForm.value?.checkValidity()) {
+    formState.loading = true;
+    resourceRepository
+      .createResource(resource)
+      .then(() => {
+        createResourceModal?.hide();
+        resource.name = "";
+        resource.description = "";
+        resource.source = "";
+        resource.release = "";
+        formState.resourceNameTaken = false;
+        formState.validated = false;
+      })
+      .catch((error) => {
+        if (
+          error.status === 400 &&
+          error.body["detail"] ===
+            `Resource with name '${resource.name}' already exists`
+        ) {
+          console.log(`Resource with name ${resource.name} already exists`);
+          formState.resourceNameTaken = true;
+          resourceNameElement.value?.setCustomValidity(
+            "Resource name is already taken",
+          );
+        }
+      })
+      .finally(() => {
+        formState.loading = false;
+      });
+  }
+}
+
+function modalClosed() {
+  formState.validated = false;
+  formState.resourceNameTaken = false;
+  resourceNameElement.value?.setCustomValidity("");
+}
+</script>
+
+<template>
+  <bootstrap-modal
+    :modalID="modalID"
+    :static-backdrop="true"
+    modal-label="Create Resource Modal"
+    v-on="{ 'hidden.bs.modal': modalClosed }"
+  >
+    <template v-slot:header> Create new Resource</template>
+    <template v-slot:body>
+      <form
+        id="resourceCreateForm"
+        :class="{ 'was-validated': formState.validated }"
+        ref="resourceCreateForm"
+      >
+        <div class="mb-3">
+          <label for="resourceNameInput" class="form-label"
+            >Resource Name</label
+          >
+          <div class="input-group">
+            <input
+              type="text"
+              class="form-control"
+              id="resourceNameInput"
+              required
+              minlength="3"
+              maxlength="32"
+              v-model="resource.name"
+              ref="resourceNameElement"
+            />
+            <div class="invalid-feedback">
+              <div v-if="formState.resourceNameTaken">
+                Resource name already taken.
+              </div>
+              <div>
+                Requirements
+                <ul>
+                  <li>At least 3 Characters long</li>
+                  <li>Unique in CloWM</li>
+                </ul>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="mb-3">
+          <label for="resourceDescriptionInput" class="form-label">
+            Description
+          </label>
+          <div class="input-group">
+            <textarea
+              class="form-control"
+              id="resourceDescriptionInput"
+              required
+              rows="3"
+              minlength="16"
+              maxlength="256"
+              v-model="resource.description"
+              placeholder="Describe the purpose of the resource"
+            ></textarea>
+            <div class="invalid-feedback">
+              Requirements
+              <ul>
+                <li>At least 16 Characters long</li>
+              </ul>
+            </div>
+          </div>
+        </div>
+        <div class="mb-3">
+          <label for="resourceSourceInput" class="form-label"> Source </label>
+          <div class="input-group">
+            <input
+              class="form-control"
+              id="resourceSourceInput"
+              required
+              minlength="8"
+              maxlength="264"
+              v-model="resource.source"
+              placeholder="The source of the resource (e.g. a link)"
+            />
+          </div>
+        </div>
+        <div class="mb-3">
+          <label for="resourceReleaseInput" class="form-label"> Release </label>
+          <div class="input-group">
+            <input
+              class="form-control"
+              id="resourceReleaseInput"
+              required
+              minlength="3"
+              maxlength="32"
+              v-model="resource.release"
+              placeholder="The name of the release"
+            />
+          </div>
+        </div>
+      </form>
+    </template>
+    <template v-slot:footer>
+      <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
+        Close
+      </button>
+      <button
+        type="submit"
+        form="resourceCreateForm"
+        class="btn btn-primary"
+        :disabled="formState.loading"
+        @click.prevent="createResource"
+      >
+        <span
+          v-if="formState.loading"
+          class="spinner-border spinner-border-sm"
+          role="status"
+          aria-hidden="true"
+        ></span>
+        Save
+      </button>
+    </template>
+  </bootstrap-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/router/index.ts b/src/router/index.ts
index 4a35bb585e152958e007e491992b47363e679511..1154704c207ec7c034944a1e8858640413d14b42 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,6 +1,9 @@
 import { createRouter, createWebHistory } from "vue-router";
 import DashboardView from "../views/DashboardView.vue";
 import LoginView from "../views/LoginView.vue";
+import { workflowRoutes } from "@/router/workflowRoutes";
+import { s3Routes } from "@/router/s3Routes";
+import { resourceRoutes } from "@/router/resourceRoutes";
 
 const router = createRouter({
   history: createWebHistory(import.meta.env.BASE_URL),
@@ -9,109 +12,7 @@ const router = createRouter({
       path: "/dashboard",
       name: "dashboard",
       component: DashboardView,
-      children: [
-        {
-          path: "object-storage/buckets",
-          name: "buckets",
-          component: () => import("../views/object-storage/BucketsView.vue"),
-          props: (route) => ({
-            bucketName: route.params.bucketName ?? undefined,
-          }),
-          children: [
-            {
-              path: ":bucketName/:subFolders*",
-              name: "bucket",
-              component: () => import("../views/object-storage/BucketView.vue"),
-              props: true,
-            },
-          ],
-        },
-        {
-          path: "object-storage/s3-keys",
-          name: "s3_keys",
-          component: () => import("../views/object-storage/S3KeysView.vue"),
-        },
-        {
-          path: "resources",
-          name: "resources",
-          component: () => import("../views/resources/ListResourcesView.vue"),
-        },
-        {
-          path: "workflow-executions",
-          name: "workflow-executions",
-          component: () =>
-            import("../views/workflows/ListWorkflowExecutionsView.vue"),
-        },
-        {
-          path: "workflows",
-          name: "workflows",
-          component: () => import("../views/workflows/ListWorkflowsView.vue"),
-        },
-        {
-          path: "developer/workflows",
-          name: "workflows-developer",
-          component: () => import("../views/workflows/MyWorkflowsView.vue"),
-          meta: {
-            requiresDeveloperRole: true,
-          },
-        },
-        {
-          path: "reviewer/workflows",
-          name: "workflows-reviewer",
-          component: () => import("../views/workflows/ReviewWorkflowsView.vue"),
-          meta: {
-            requiresReviewerRole: true,
-          },
-        },
-        {
-          path: "workflows/arbitrary",
-          name: "arbitrary-workflow",
-          component: () =>
-            import("../views/workflows/ArbitraryWorkflowView.vue"),
-          meta: {
-            requiresDeveloperRole: true,
-          },
-          props: (route) => ({
-            wid: route.query.wid,
-          }),
-        },
-        {
-          path: "workflows/:workflowId",
-          name: "workflow",
-          component: () => import("../views/workflows/WorkflowView.vue"),
-          props: (route) => ({
-            versionId: route.params.versionId ?? undefined,
-            workflowId: route.params.workflowId,
-            workflowModeId: route.query.workflowModeId ?? undefined,
-            developerView: route.query.developerView == "true" ?? false,
-          }),
-          children: [
-            {
-              path: "version/:versionId",
-              name: "workflow-version",
-              component: () =>
-                import("../views/workflows/WorkflowVersionView.vue"),
-              props: (route) => ({
-                versionId: route.params.versionId,
-                workflowId: route.params.workflowId,
-                activeTab: route.query.tab ?? "description",
-                workflowModeId: route.query.workflowModeId ?? undefined,
-              }),
-            },
-            {
-              path: "version/:versionId/start",
-              name: "workflow-start",
-              component: () =>
-                import("../views/workflows/StartWorkflowView.vue"),
-              props: (route) => ({
-                versionId: route.params.versionId,
-                workflowId: route.params.workflowId,
-                workflowModeId: route.query.workflowModeId ?? undefined,
-              }),
-            },
-          ],
-        },
-      ],
+      children: [...resourceRoutes, ...s3Routes, ...workflowRoutes],
     },
     {
       path: "/login",
diff --git a/src/router/resourceRoutes.ts b/src/router/resourceRoutes.ts
new file mode 100644
index 0000000000000000000000000000000000000000..24b7db150836690138f5637992354ad44dd12a67
--- /dev/null
+++ b/src/router/resourceRoutes.ts
@@ -0,0 +1,14 @@
+import type { RouteRecordRaw } from "vue-router";
+
+export const resourceRoutes: RouteRecordRaw[] = [
+  {
+    path: "resources",
+    name: "resources",
+    component: () => import("../views/resources/ListResourcesView.vue"),
+  },
+  {
+    path: "developer/resources",
+    name: "resource-maintainer",
+    component: () => import("../views/resources/MyResourcesView.vue"),
+  },
+];
diff --git a/src/router/s3Routes.ts b/src/router/s3Routes.ts
new file mode 100644
index 0000000000000000000000000000000000000000..30ff3e0799e723c28e0c9dc61d78ea3b503680cb
--- /dev/null
+++ b/src/router/s3Routes.ts
@@ -0,0 +1,25 @@
+import type { RouteRecordRaw } from "vue-router";
+
+export const s3Routes: RouteRecordRaw[] = [
+  {
+    path: "object-storage/buckets",
+    name: "buckets",
+    component: () => import("../views/object-storage/BucketsView.vue"),
+    props: (route) => ({
+      bucketName: route.params.bucketName ?? undefined,
+    }),
+    children: [
+      {
+        path: ":bucketName/:subFolders*",
+        name: "bucket",
+        component: () => import("../views/object-storage/BucketView.vue"),
+        props: true,
+      },
+    ],
+  },
+  {
+    path: "object-storage/s3-keys",
+    name: "s3_keys",
+    component: () => import("../views/object-storage/S3KeysView.vue"),
+  },
+];
diff --git a/src/router/workflowRoutes.ts b/src/router/workflowRoutes.ts
new file mode 100644
index 0000000000000000000000000000000000000000..05aab0ef40732d2b879ef9b3f80063e8fa340fe7
--- /dev/null
+++ b/src/router/workflowRoutes.ts
@@ -0,0 +1,76 @@
+import type { RouteRecordRaw } from "vue-router";
+
+export const workflowRoutes: RouteRecordRaw[] = [
+  {
+    path: "workflow-executions",
+    name: "workflow-executions",
+    component: () =>
+      import("../views/workflows/ListWorkflowExecutionsView.vue"),
+  },
+  {
+    path: "workflows",
+    name: "workflows",
+    component: () => import("../views/workflows/ListWorkflowsView.vue"),
+  },
+  {
+    path: "developer/workflows",
+    name: "workflows-developer",
+    component: () => import("../views/workflows/MyWorkflowsView.vue"),
+    meta: {
+      requiresDeveloperRole: true,
+    },
+  },
+  {
+    path: "reviewer/workflows",
+    name: "workflows-reviewer",
+    component: () => import("../views/workflows/ReviewWorkflowsView.vue"),
+    meta: {
+      requiresReviewerRole: true,
+    },
+  },
+  {
+    path: "workflows/arbitrary",
+    name: "arbitrary-workflow",
+    component: () => import("../views/workflows/ArbitraryWorkflowView.vue"),
+    meta: {
+      requiresDeveloperRole: true,
+    },
+    props: (route) => ({
+      wid: route.query.wid,
+    }),
+  },
+  {
+    path: "workflows/:workflowId",
+    name: "workflow",
+    component: () => import("../views/workflows/WorkflowView.vue"),
+    props: (route) => ({
+      versionId: route.params.versionId ?? undefined,
+      workflowId: route.params.workflowId,
+      workflowModeId: route.query.workflowModeId ?? undefined,
+      developerView: route.query.developerView == "true" ?? false,
+    }),
+    children: [
+      {
+        path: "version/:versionId",
+        name: "workflow-version",
+        component: () => import("../views/workflows/WorkflowVersionView.vue"),
+        props: (route) => ({
+          versionId: route.params.versionId,
+          workflowId: route.params.workflowId,
+          activeTab: route.query.tab ?? "description",
+          workflowModeId: route.query.workflowModeId ?? undefined,
+        }),
+      },
+      {
+        path: "version/:versionId/start",
+        name: "workflow-start",
+        component: () => import("../views/workflows/StartWorkflowView.vue"),
+        props: (route) => ({
+          versionId: route.params.versionId,
+          workflowId: route.params.workflowId,
+          workflowModeId: route.query.workflowModeId ?? undefined,
+        }),
+      },
+    ],
+  },
+];
diff --git a/src/stores/resources.ts b/src/stores/resources.ts
index 80f75810b618480cbb2b9013f2bc69d8e8063caf..ab5e18d1eb9c25978c0f6663daf896e6c65e5fb4 100644
--- a/src/stores/resources.ts
+++ b/src/stores/resources.ts
@@ -1,7 +1,8 @@
 import { defineStore } from "pinia";
-import type { ResourceOut } from "@/client/resource";
+import type { ResourceIn, ResourceOut } from "@/client/resource";
 import { ResourceService } from "@/client/resource";
 import { useAuthStore } from "@/stores/users";
+import { Status } from "@/client/resource";
 
 export const useResourceStore = defineStore({
   id: "resources",
@@ -17,6 +18,9 @@ export const useResourceStore = defineStore({
     resources(): ResourceOut[] {
       return Object.values(this.resourceMapping);
     },
+    ownResources(): ResourceOut[] {
+      return Object.values(this.ownResourceMapping);
+    },
   },
   actions: {
     fetchResources(onFinally?: () => void): Promise<ResourceOut[]> {
@@ -39,7 +43,10 @@ export const useResourceStore = defineStore({
       if (Object.keys(this.ownResourceMapping).length > 0) {
         onFinally?.();
       }
-      return ResourceService.resourceListResources(authStore.currentUID)
+      return ResourceService.resourceListResources(
+        authStore.currentUID,
+        Object.values(Status),
+      )
         .then((resources) => {
           const newMapping: Record<string, ResourceOut> = {};
           for (const resource of resources) {
@@ -50,5 +57,11 @@ export const useResourceStore = defineStore({
         })
         .finally(onFinally);
     },
+    async createResource(resource: ResourceIn): Promise<ResourceOut> {
+      const createdResource =
+        await ResourceService.resourceCreateResource(resource);
+      this.ownResourceMapping[createdResource.resource_id] = createdResource;
+      return createdResource;
+    },
   },
 });
diff --git a/src/stores/users.ts b/src/stores/users.ts
index d353f4c61cee2ad463428f387febed24a29a4cba..4d7b524b0cc6ae75a69161be7d74716e82035127 100644
--- a/src/stores/users.ts
+++ b/src/stores/users.ts
@@ -79,6 +79,10 @@ export const useAuthStore = defineStore({
       state.user?.roles?.includes(RoleEnum.DEVELOPER) ??
       state.decodedToken?.roles.includes(RoleEnum.DEVELOPER) ??
       false,
+    resourceMaintainer: (state) =>
+      state.user?.roles?.includes(RoleEnum.DB_MAINTAINER) ??
+      state.decodedToken?.roles.includes(RoleEnum.DB_MAINTAINER) ??
+      false,
     admin: (state) =>
       state.user?.roles?.includes(RoleEnum.ADMINISTRATOR) ??
       state.decodedToken?.roles.includes(RoleEnum.ADMINISTRATOR) ??
@@ -106,6 +110,8 @@ export const useAuthStore = defineStore({
     },
     updateUser(user: User) {
       this.user = user;
+      this.userMapping[user.uid] = user.display_name;
+      localStorage.setItem(user.uid, user.display_name);
     },
     logout() {
       S3ProxyOpenAPI.TOKEN = undefined;
diff --git a/src/views/resources/ListResourcesView.vue b/src/views/resources/ListResourcesView.vue
index a460bf142cda04a6c7fd466e002e8bac0cb5ae6a..db883daec9da9c50cc035da68053732ee012c99d 100644
--- a/src/views/resources/ListResourcesView.vue
+++ b/src/views/resources/ListResourcesView.vue
@@ -1,7 +1,7 @@
 <script setup lang="ts">
 import { computed, onMounted, reactive } from "vue";
 import { useResourceStore } from "@/stores/resources";
-import ResourceCard from "@/components/transitions/ResourceCard.vue";
+import ResourceCard from "@/components/resources/ResourceCard.vue";
 import CardTransitionGroup from "@/components/transitions/CardTransitionGroup.vue";
 import { useAuthStore } from "@/stores/users";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
diff --git a/src/views/resources/MyResourcesView.vue b/src/views/resources/MyResourcesView.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3b100fc4e7e7644881e96ba12f4119458e9e6ec6
--- /dev/null
+++ b/src/views/resources/MyResourcesView.vue
@@ -0,0 +1,50 @@
+<script setup lang="ts">
+import { onMounted, reactive } from "vue";
+import { useResourceStore } from "@/stores/resources";
+import CardTransitionGroup from "@/components/transitions/CardTransitionGroup.vue";
+import ResourceCard from "@/components/resources/ResourceCard.vue";
+import CreateResourceModal from "@/components/resources/createResourceModal.vue";
+
+const resourceRepository = useResourceStore();
+
+const resourceState = reactive<{
+  loading: boolean;
+}>({
+  loading: true,
+});
+
+onMounted(() => {
+  resourceRepository.fetchOwnResources(() => {
+    resourceState.loading = false;
+  });
+});
+</script>
+
+<template>
+  <create-resource-modal modal-i-d="createResourceModal" />
+  <div
+    class="row m-2 border-bottom mb-4 justify-content-between align-items-center pb-2"
+  >
+    <h2 class="w-fit">My Resources</h2>
+    <button
+      class="btn btn-lg btn-primary w-fit"
+      data-bs-toggle="modal"
+      data-bs-target="#createResourceModal"
+    >
+      Create
+    </button>
+  </div>
+  <CardTransitionGroup
+    class="d-flex flex-wrap align-items-center justify-content-between"
+  >
+    <resource-card
+      v-for="resource in resourceRepository.ownResources"
+      :key="resource.resource_id"
+      :resource="resource"
+      :loading="false"
+      style="min-width: 48%"
+    />
+  </CardTransitionGroup>
+</template>
+
+<style scoped></style>