diff --git a/.gitignore b/.gitignore
index 671fb0fee4dba749bd6cb2b15d03422c8ea29976..b97206eaa9037206fb36f521f938d8c355afb4da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,8 @@ target/
 # Client
 goofy-client/.vscode/
 goofy-client/apps/coverage/
+goofy-client/node/*
+goofy-client/temp/*
 
 .attach**
-.factorypath
\ No newline at end of file
+.factorypath
diff --git a/Jenkinsfile b/Jenkinsfile
index 9bb5c357a99b1682b45602c5849f3c3416fb054d..b3c044e277709d224670dd322fc4d6eb05ec2d72 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -94,17 +94,23 @@ pipeline {
                         sh 'mvn --version'
                         sh "mvn -s $MAVEN_SETTINGS -pl -goofy-client clean install spring-boot:build-image -Dspring-boot.build-image.imageName=docker.ozg-sh.de/goofy:${IMAGE_TAG} -Dspring-boot.build-image.publish -Dmaven.wagon.http.retryHandler.count=3"
 
-                       	try {
-                            if (isMasterBranch()) {
-        	                    dir('goofy-server'){
-                                    withSonarQubeEnv('sonarqube-ozg-sh'){
-                                        sh 'mvn -s $MAVEN_SETTINGS sonar:sonar'
-                                    }
-                                }
+ 						if (isMasterBranch()) {
+	                   		try {
+	    	                    dir('alfa-service'){
+	                                withSonarQubeEnv('sonarqube-ozg-sh'){
+	                                    sh 'mvn -s $MAVEN_SETTINGS sonar:sonar'
+	                                }
+	                            }
+	                            dir('alfa-xdomea'){
+	                                withSonarQubeEnv('sonarqube-ozg-sh'){
+	                                    sh 'mvn -s $MAVEN_SETTINGS sonar:sonar'
+	                                }
+	                            }
 	                        }
-                        } catch (Exception e) {
-                            unstable("SonarQube failed")
-                        }
+	                        catch (Exception e) {
+	                            unstable("SonarQube failed")
+	                        }
+	                    }
                     }
                 }
             }
diff --git a/alfa-service/pom.xml b/alfa-service/pom.xml
index b28e9df32cc6244f0c27bfadcef451c7f3e50a72..525cf2e219bd65e3edfade89158b536bd1fc71d8 100644
--- a/alfa-service/pom.xml
+++ b/alfa-service/pom.xml
@@ -32,7 +32,7 @@
 	<parent>
 		<groupId>de.itvsh.ozg</groupId>
 		<artifactId>goofy</artifactId>
-		<version>1.15.0-SNAPSHOT</version>
+		<version>1.17.0-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>alfa-service</artifactId>
@@ -43,6 +43,9 @@
 	<properties>
 		<maven.compiler.source>${java.version}</maven.compiler.source>
 		<maven.compiler.target>${java.version}</maven.compiler.target>
+
+		<!-- TODO: die Version über kop-common ziehen -->
+		<jjwt.version>0.11.5</jjwt.version>
 	</properties>
 
 	<dependencies>
@@ -51,7 +54,6 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-log4j2</artifactId>
 		</dependency>
-
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-web</artifactId>
@@ -64,29 +66,25 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-validation</artifactId>
 		</dependency>
-
 		<dependency>
 			<groupId>net.devh</groupId>
 			<artifactId>grpc-client-spring-boot-starter</artifactId>
 		</dependency>
-
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-actuator</artifactId>
 		</dependency>
-
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-security</artifactId>
 		</dependency>
-
 		<dependency>
-			<groupId>org.keycloak</groupId>
-			<artifactId>keycloak-spring-boot-starter</artifactId>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>org.keycloak</groupId>
-			<artifactId>keycloak-admin-client</artifactId>
+			<groupId>com.jayway.jsonpath</groupId>
+			<artifactId>json-path</artifactId>
 		</dependency>
 
 		<!-- jwt -->
@@ -96,7 +94,18 @@
 		</dependency>
 		<dependency>
 			<groupId>io.jsonwebtoken</groupId>
-			<artifactId>jjwt</artifactId>
+			<artifactId>jjwt-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>io.jsonwebtoken</groupId>
+			<artifactId>jjwt-impl</artifactId>
+			<version>${jjwt.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>io.jsonwebtoken</groupId>
+			<artifactId>jjwt-jackson</artifactId>
+			<version>${jjwt.version}</version>
+			<scope>runtime</scope>
 		</dependency>
 
 		<!-- own projects -->
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java
index 0103a54760c7db79f34c0ab0980a0b569383108b..9dda134b2ea6580936e80d068055309175b645ce 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java
@@ -25,7 +25,6 @@ package de.ozgcloud.alfa;
 
 import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
 
-import org.keycloak.adapters.springboot.KeycloakSpringBootProperties;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -37,23 +36,19 @@ import org.springframework.web.bind.annotation.RestController;
 public class EnvironmentController {
 
 	@Autowired
-	private KeycloakSpringBootProperties kcProperties;
+	private OAuth2Properties oAuth2Properties;
 
 	@Value("${goofy.production}")
 	private boolean production = true;
 
 	@GetMapping
 	public FrontendEnvironment getFrontendEnvironment() {
-		return FrontendEnvironment.builder()//
-				.production(production)//
-				.remoteHost(apiRoot())//
-				.authServer(kcProperties.getAuthServerUrl())//
-				.clientId(kcProperties.getResource())//
-				.realm(kcProperties.getRealm())
+		return FrontendEnvironment.builder()
+				.production(production)
+				.remoteHost(linkTo(RootController.class).toUri().toString())
+				.authServer(oAuth2Properties.getAuthServerUrl())
+				.clientId(oAuth2Properties.getResource())
+				.realm(oAuth2Properties.getRealm())
 				.build();
 	}
-
-	private String apiRoot() {
-		return linkTo(RootController.class).toUri().toString();
-	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/GrpcConfiguration.java b/alfa-service/src/main/java/de/ozgcloud/alfa/GrpcConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..97cac2f8ea30484287afa30ab96bf522d1034bd9
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/GrpcConfiguration.java
@@ -0,0 +1,23 @@
+package de.ozgcloud.alfa;
+
+import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * A workaround for @GrpcClient to work i.e. inject dependency until full Spring 3 support is available.
+ * https://github.com/yidongnan/grpc-spring-boot-starter/pull/775
+ */
+@Configuration
+@ImportAutoConfiguration({
+		net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration.class,
+		net.devh.boot.grpc.client.autoconfigure.GrpcClientMetricAutoConfiguration.class,
+		net.devh.boot.grpc.client.autoconfigure.GrpcClientHealthAutoConfiguration.class,
+		net.devh.boot.grpc.client.autoconfigure.GrpcClientSecurityAutoConfiguration.class,
+		net.devh.boot.grpc.client.autoconfigure.GrpcClientTraceAutoConfiguration.class,
+		net.devh.boot.grpc.client.autoconfigure.GrpcDiscoveryClientAutoConfiguration.class,
+
+		net.devh.boot.grpc.common.autoconfigure.GrpcCommonCodecAutoConfiguration.class,
+		net.devh.boot.grpc.common.autoconfigure.GrpcCommonTraceAutoConfiguration.class
+})
+public class GrpcConfiguration {
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/JwtAuthConverter.java b/alfa-service/src/main/java/de/ozgcloud/alfa/JwtAuthConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..70397ac1de728d4d94369b5b227b0228750c3897
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/JwtAuthConverter.java
@@ -0,0 +1,85 @@
+package de.ozgcloud.alfa;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.commons.collections.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.lang.NonNull;
+import org.springframework.security.authentication.AbstractAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.oauth2.jwt.Jwt;
+import org.springframework.security.oauth2.jwt.JwtClaimNames;
+import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
+import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;
+import org.springframework.stereotype.Component;
+
+@Component
+public class JwtAuthConverter implements Converter<Jwt, AbstractAuthenticationToken> {
+
+	private final JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
+
+	private static final String SIMPLE_GRANT_AUTHORITY_PREFIX = "ROLE_";
+	static final String RESOURCE_ACCESS_KEY = "resource_access";
+	static final String ROLES_KEY = "roles";
+
+	@Autowired
+	private OAuth2Properties oAuth2Properties;
+
+	@Override
+	public AbstractAuthenticationToken convert(@NonNull Jwt jwt) {
+		return new JwtAuthenticationToken(jwt, getAuthorities(jwt), getPrincipleClaimName(jwt));
+	}
+
+	String getPrincipleClaimName(Jwt jwt) {
+		return MapUtils.getString(jwt.getClaims(), getClaimName());
+	}
+
+	private String getClaimName() {
+		return Optional.ofNullable(oAuth2Properties.getPrincipleAttribute()).orElse(JwtClaimNames.SUB);
+	}
+
+	Set<GrantedAuthority> getAuthorities(Jwt jwt) {
+		return Stream.concat(jwtGrantedAuthoritiesConverter.convert(jwt).stream(), extractResourceRoles(jwt).stream()).collect(Collectors.toSet());
+	}
+
+	Collection<SimpleGrantedAuthority> extractResourceRoles(Jwt jwt) {
+		var resourceAccess = getResourceAccess(jwt);
+		if (resourceAccess.isEmpty()) {
+			return Collections.emptySet();
+		}
+		if (Objects.isNull(resourceAccess.get(oAuth2Properties.getResource()))) {
+			return Collections.emptySet();
+		}
+		return extractRoles(getClaimMapFromMap(resourceAccess, oAuth2Properties.getResource()));
+	}
+
+	private Map<String, Object> getResourceAccess(Jwt jwt) {
+		return jwt.getClaimAsMap(RESOURCE_ACCESS_KEY);
+	}
+
+	@SuppressWarnings("unchecked")
+	private Map<String, Object> getClaimMapFromMap(Map<String, Object> claimMap, String claimName) {
+		return MapUtils.getMap(claimMap, claimName);
+	}
+
+	Set<SimpleGrantedAuthority> extractRoles(Map<String, Object> resource) {
+		if (!resource.containsKey(ROLES_KEY)) {
+			return Collections.emptySet();
+		}
+		return getRoles(resource).stream().map(role -> new SimpleGrantedAuthority(SIMPLE_GRANT_AUTHORITY_PREFIX + role)).collect(Collectors.toSet());
+	}
+
+	@SuppressWarnings("unchecked")
+	private Collection<String> getRoles(Map<String, Object> resource) {
+		return (Collection<String>) resource.get(ROLES_KEY);
+	}
+}
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/OAuth2Properties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/OAuth2Properties.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a8d79d91213599bfcc0e9ff7213ff83a9ff53c2
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/OAuth2Properties.java
@@ -0,0 +1,36 @@
+package de.ozgcloud.alfa;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+@Configuration
+@ConfigurationProperties(prefix = OAuth2Properties.PREFIX)
+public class OAuth2Properties {
+
+	static final String PREFIX = "ozgcloud.oauth2";
+
+	/**
+	 * OAuth2 auth server url
+	 */
+	private String authServerUrl;
+
+	/**
+	 * OAuth2 realm
+	 */
+	private String realm;
+
+	/**
+	 * OAuth2 resource
+	 */
+	private String resource;
+
+	/**
+	 * OAuth2 principle attribute
+	 */
+	private String principleAttribute;
+}
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/RequestIdFilter.java b/alfa-service/src/main/java/de/ozgcloud/alfa/RequestIdFilter.java
index c99af4d374c060118ff2930849ef4eccf40d99dc..83b33e364ebd220e94962637bc6fedc545ad2efb 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/RequestIdFilter.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/RequestIdFilter.java
@@ -25,10 +25,10 @@ package de.ozgcloud.alfa;
 
 import java.io.IOException;
 
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.logging.log4j.CloseableThreadContext;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/SecurityConfiguration.java b/alfa-service/src/main/java/de/ozgcloud/alfa/SecurityConfiguration.java
index ca8c0c09f524b0ad77df52c18d25d0451c331b69..42f7e4158e24894ebc33b10354c346c5efb3c8eb 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/SecurityConfiguration.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/SecurityConfiguration.java
@@ -23,16 +23,20 @@
  */
 package de.ozgcloud.alfa;
 
-import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
-import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
-import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
+import java.util.Optional;
+
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.http.HttpMethod;
+import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
-import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer;
 import org.springframework.security.config.http.SessionCreationPolicy;
-import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
+import org.springframework.security.web.SecurityFilterChain;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 import org.springframework.security.web.authentication.session.NullAuthenticatedSessionStrategy;
 import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
@@ -42,48 +46,57 @@ import org.springframework.security.web.header.writers.frameoptions.XFrameOption
 
 import de.ozgcloud.alfa.common.downloadtoken.DownloadTokenAuthenticationFilter;
 
-@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
-@KeycloakConfiguration
-public class SecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter {
+@Configuration
+@EnableWebSecurity
+@EnableMethodSecurity(securedEnabled = true)
+public class SecurityConfiguration {
+
+	@Autowired
+	private JwtAuthConverter jwtAuthConverter;
 
 	@Autowired
-	private DownloadTokenAuthenticationFilter downloadTokenFilter;
+	private SpringJwtProperties springJwtProperties;
+
+	@Bean
+	SecurityFilterChain securityFilterChain(HttpSecurity http, DownloadTokenAuthenticationFilter downloadTokenFilter) throws Exception {
+		http.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()));
 
-	@Override
-	protected void configure(HttpSecurity http) throws Exception {
-		super.configure(http);
-		http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
+		http.sessionManagement(management -> management.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
 
-		http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
-				.and().authorizeRequests()//
-				.antMatchers(HttpMethod.GET, "/api/environment").permitAll()//
-				.antMatchers(HttpMethod.GET, "/assets/**").permitAll()//
-				.antMatchers(HttpMethod.GET, "/vorgang/**").permitAll()//
-				.antMatchers(HttpMethod.GET, "/meine/**").permitAll()//
-				.antMatchers(HttpMethod.GET, "/alle/**").permitAll()//
-				.antMatchers(HttpMethod.GET, "/unassigned/**").permitAll()//
-				.antMatchers("/api").authenticated()//
-				.antMatchers("/api/**").authenticated()//
-				.antMatchers("/actuator").permitAll()//
-				.antMatchers("/actuator/**").permitAll()//
-				.antMatchers("/").permitAll()//
-				.antMatchers("/*").permitAll()//
-				.anyRequest().denyAll();
+		http.authorizeHttpRequests(authorize -> authorize
+				.requestMatchers(HttpMethod.GET, "/api/environment").permitAll()
+				.requestMatchers(HttpMethod.GET, "/assets/**").permitAll()
+				.requestMatchers(HttpMethod.GET, "/vorgang/**").permitAll()
+				.requestMatchers(HttpMethod.GET, "/meine/**").permitAll()
+				.requestMatchers(HttpMethod.GET, "/alle/**").permitAll()
+				.requestMatchers(HttpMethod.GET, "/unassigned/**").permitAll()
+				.requestMatchers("/api").authenticated()
+				.requestMatchers("/api/**").authenticated()
+				.requestMatchers("/actuator").permitAll()
+				.requestMatchers("/actuator/**").permitAll()
+				.requestMatchers("/").permitAll()
+				.requestMatchers("/*").permitAll()
+				.anyRequest().denyAll());
 
-		http.headers().addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsMode.SAMEORIGIN));
+		http.oauth2ResourceServer(this::setOAuth2ResourceServer);
+		http.headers(headers -> headers.addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsMode.SAMEORIGIN)));
 		http.addFilterBefore(downloadTokenFilter, UsernamePasswordAuthenticationFilter.class);
+
+		return http.build();
 	}
 
-	@Autowired
-	public void configureGlobal(AuthenticationManagerBuilder auth) {
-		KeycloakAuthenticationProvider keyCloakAuthProvider = keycloakAuthenticationProvider();
-		keyCloakAuthProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
-		auth.authenticationProvider(keyCloakAuthProvider);
+	private void setOAuth2ResourceServer(OAuth2ResourceServerConfigurer<HttpSecurity> configurer) {
+		configurer.jwt().jwtAuthenticationConverter(jwtAuthConverter);
+		Optional.ofNullable(springJwtProperties.getJwkSetUri()).ifPresent(jwkSetUri -> configurer.jwt().jwkSetUri(jwkSetUri));
 	}
 
-	@Override
+	@Bean
 	protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
 		return new NullAuthenticatedSessionStrategy();
 	}
 
+	@Bean
+	AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
+		return http.getSharedObject(AuthenticationManagerBuilder.class).build();
+	}
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/SpringJwtProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/SpringJwtProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..9b81c0654242a2132f92ce8a1c2e509981951c00
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/SpringJwtProperties.java
@@ -0,0 +1,21 @@
+package de.ozgcloud.alfa;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+@Configuration
+@ConfigurationProperties(prefix = SpringJwtProperties.PREFIX)
+public class SpringJwtProperties {
+
+	static final String PREFIX = "spring.security.oauth2.resourceserver.jwt";
+
+	/**
+	 * Jwt jwk set uri
+	 */
+	private String jwkSetUri = null;
+}
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/WebConfig.java b/alfa-service/src/main/java/de/ozgcloud/alfa/WebConfig.java
index 2074b2e67f74c77f5b00ff6c9a8f6b6f8e0bd7ed..a0669a9539fecfa3fb4bb46020f5c85f9f133dde 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/WebConfig.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/WebConfig.java
@@ -26,9 +26,6 @@ package de.ozgcloud.alfa;
 import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 
-import org.keycloak.adapters.KeycloakConfigResolver;
-import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.io.Resource;
 import org.springframework.http.CacheControl;
@@ -36,6 +33,8 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 import org.springframework.web.servlet.resource.PathResourceResolver;
 
+import lombok.NoArgsConstructor;
+
 @Configuration
 public class WebConfig implements WebMvcConfigurer {
 
@@ -43,7 +42,6 @@ public class WebConfig implements WebMvcConfigurer {
 
 	@Override
 	public void addResourceHandlers(ResourceHandlerRegistry registry) {
-
 		registry.addResourceHandler("/*.js", "/*.css", "/*.ttf", "/*.woff", "/*.woff2", "/*.eot",
 				"/**/*.svg", "/*.svf", "/*.otf", "/*.ico", "/**/*.png")
 				.addResourceLocations(RESOURCE_LOCATION)
@@ -56,18 +54,20 @@ public class WebConfig implements WebMvcConfigurer {
 				.setCacheControl(CacheControl.noStore())
 				.setUseLastModified(false)
 				.resourceChain(true)
-				.addResolver(new PathResourceResolver() {
-					@Override
-					protected Resource getResource(String resourcePath, Resource location) throws IOException {
-						Resource requestedResource = location.createRelative(resourcePath);
-						return requestedResource.exists() && requestedResource.isReadable() ? requestedResource
-								: super.getResource("index.html", location);
-					}
-				});
+				.addResolver(new OzgCloudPathResourceResolver());
 	}
 
-	@Bean
-	public KeycloakConfigResolver keyCloakConfigResolver() {
-		return new KeycloakSpringBootConfigResolver();
+	@NoArgsConstructor
+	static class OzgCloudPathResourceResolver extends PathResourceResolver {
+
+		@Override
+		protected Resource getResource(String resourcePath, Resource location) throws IOException {
+			var requestedResource = location.createRelative(resourcePath);
+
+			if (requestedResource.exists() && requestedResource.isReadable()) {
+				return requestedResource;
+			}
+			return super.getResource("index.html", location);
+		}
 	}
-}
+}
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java
index 1aaabfc98f32b49742f2f709b6a967f18799242d..f4f9ed3147666758a818a8e00a6ba3150b8d2263 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java
@@ -20,7 +20,7 @@ public class FeatureToggleProperties {
 	private boolean vorgangExport = false;
 
 	/**
-	 * Enable/Disable Bescheid creation feature
+	 * Enable/Disable Bescheid creation feature.
 	 */
 	private boolean createBescheid = false;
 }
diff --git a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/_button-with-spinner.theme.scss b/alfa-service/src/main/java/de/ozgcloud/alfa/common/GermanDateTimeFormatter.java
similarity index 58%
rename from goofy-client/libs/ui/src/lib/ui/button-with-spinner/_button-with-spinner.theme.scss
rename to alfa-service/src/main/java/de/ozgcloud/alfa/common/GermanDateTimeFormatter.java
index d1a8569431b12864c1c52fbaefa64dffe88e2cff..97dc0511e8c1d58ffd0de06b34820df0dfe23f03 100644
--- a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/_button-with-spinner.theme.scss
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/GermanDateTimeFormatter.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
  * Ministerpräsidenten des Landes Schleswig-Holstein
  * Staatskanzlei
@@ -21,14 +21,26 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@use 'sass:map';
-@use '@angular/material' as mat;
+package de.ozgcloud.alfa.common;
 
-@mixin button-with-spinner($theme) {
-	$color-config: mat.get-color-config($theme);
-	$primary: map.get($color-config, 'primary');
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
 
-	goofy-client-button-with-spinner .mat-primary svg path {
-		fill: mat.get-color-from-palette($primary);
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import lombok.NonNull;
+
+@Component
+public class GermanDateTimeFormatter {
+
+	private static final DateTimeFormatter DATE_TIME_ZONE = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss z").withLocale(Locale.GERMANY);
+
+	@Autowired
+	private SystemProperties systemProperties;
+
+	public String formatZonedDateTime(@NonNull ZonedDateTime zonedDateTime) {
+		return DATE_TIME_ZONE.format(zonedDateTime.withZoneSameInstant(systemProperties.getTimeZone()));
 	}
 }
diff --git a/goofy-client/apps/goofy-e2e/src/support/pre-merge.ts b/alfa-service/src/main/java/de/ozgcloud/alfa/common/SystemProperties.java
similarity index 64%
rename from goofy-client/apps/goofy-e2e/src/support/pre-merge.ts
rename to alfa-service/src/main/java/de/ozgcloud/alfa/common/SystemProperties.java
index 710c4513d9884794cf3050d31326c01490336a34..d58bada4d2c41ca587bf689f646d4524134c8a86 100644
--- a/goofy-client/apps/goofy-e2e/src/support/pre-merge.ts
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/SystemProperties.java
@@ -21,8 +21,26 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-const fs = require('fs')
+package de.ozgcloud.alfa.common;
 
-if (fs.existsSync(`apps/goofy-e2e/reports/${process.env.REPORT_FOLDER}/mochawesome-report/.jsons`)) {
-	fs.rename(`apps/goofy-e2e/reports/${process.env.REPORT_FOLDER}/mochawesome-report/.jsons`, `apps/goofy-e2e/reports/${process.env.REPORT_FOLDER}/mochawesome-report/jsons`, () => { })
-}
\ No newline at end of file
+import java.time.ZoneId;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+@Configuration
+@ConfigurationProperties(prefix = SystemProperties.PREFIX)
+public class SystemProperties {
+
+	static final String PREFIX = "ozgcloud.system";
+
+	/**
+	 * Timezone to be used in application.
+	 */
+	private ZoneId timeZone = ZoneId.of("Europe/Berlin");
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileMaxSizeConstraint.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileMaxSizeConstraint.java
index 0f252193a005ef714be422942761728f397165c5..4e2e344b837e957f0804d7cd7a48c2bdd607817e 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileMaxSizeConstraint.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileMaxSizeConstraint.java
@@ -30,8 +30,8 @@ import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
-import javax.validation.Constraint;
-import javax.validation.Payload;
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
 
 import de.ozgcloud.alfa.common.ValidationMessageCodes;
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java
index 46c008ecb1d6ea122f163eb50dce6d7cd5efa26e..c475c5c3262880ad20da74131e8940592c4a5ede 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java
@@ -25,7 +25,6 @@ package de.ozgcloud.alfa.common.binaryfile;
 
 import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
 
-import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.springframework.hateoas.CollectionModel;
@@ -51,7 +50,6 @@ public class BinaryFileModelAssembler implements RepresentationModelAssembler<Oz
 	}
 
 	public CollectionModel<EntityModel<OzgFile>> toCollectionModel(Stream<OzgFile> entities) {
-		return CollectionModel.of(entities.map(this::toModel).collect(Collectors.toList()),
-				linkTo(BinaryFileController.class).withSelfRel());
+		return CollectionModel.of(entities.map(this::toModel).toList(), linkTo(BinaryFileController.class).withSelfRel());
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileService.java
index 74bfd67e7f22ec26d200d2c43e729a9c151cd54c..eebbd2caea67e481ca652f08743a50d023d09752 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileService.java
@@ -28,7 +28,7 @@ import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Stream;
 
-import javax.validation.Valid;
+import jakarta.validation.Valid;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandler.java
index ad7639749de0b76fa04e88485ae985ba110f6718..ee46850a3953a45a759529e3ba3513766bfc62a8 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandler.java
@@ -39,7 +39,7 @@ public class DownloadAuthenticationHandler {
 
 	boolean check(FileId fileId, Authentication auth) {
 		if (auth instanceof UsernamePasswordAuthenticationToken userPasswordToken) {
-			GoofyUserWithFileId user = (GoofyUserWithFileId) userPasswordToken.getPrincipal();
+			var user = (GoofyUserWithFileId) userPasswordToken.getPrincipal();
 			return Objects.nonNull(fileId) && fileId.equals(user.getFileId()) && auth.isAuthenticated();
 		}
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidator.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidator.java
index 6aa3dbce4860ce92368a052da6ecc0374b5ec821..1bef03838dd01d3f8da8b215395e119ea6d546a3 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidator.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidator.java
@@ -26,8 +26,8 @@ package de.ozgcloud.alfa.common.binaryfile;
 import java.util.Map;
 import java.util.Optional;
 
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
 
 import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandHelper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandHelper.java
index 142c457fc85fa9686b15ccdbec16b14c11d9a268..deb37af64aa82dab029a84cfce1e2e864b80d756 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandHelper.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandHelper.java
@@ -11,15 +11,12 @@ public class CommandHelper {
 	static final Predicate<Command> IS_DONE = command -> command.getStatus() == CommandStatus.FINISHED
 			|| command.getStatus() == CommandStatus.REVOKED || command.getStatus() == CommandStatus.ERROR;
 
-	static final Predicate<Command> IS_PENDING = command -> {
-		return command.getStatus() == CommandStatus.PENDING
-				|| command.getStatus() == CommandStatus.REVOKE_PENDING;
-	};
+	static final Predicate<Command> IS_PENDING = command -> command.getStatus() == CommandStatus.PENDING
+			|| command.getStatus() == CommandStatus.REVOKE_PENDING;
 
 	public static final Predicate<Command> IS_REVOKEABLE = command -> command.getOrder().isRevokeable()
 			&& command.getStatus() == CommandStatus.FINISHED;
 
 	public static final Predicate<Command> IS_LOESCHANFORDERUNG = command -> command.getOrder() == CommandOrder.VORGANG_ZUM_LOESCHEN_MARKIEREN
 			|| command.getOrder() == CommandOrder.LOESCH_ANFORDERUNG_ZURUECKNEHMEN;
-
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java
index ea7534a4f95a24c47197ac3662ab60bd87362bb5..638a672caa20cd5268b4218db07f69e0e810182c 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java
@@ -26,7 +26,7 @@ package de.ozgcloud.alfa.common.command;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.validation.Valid;
+import jakarta.validation.Valid;
 
 import org.apache.commons.collections.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CreateCommand.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CreateCommand.java
index 3cb5adcf3fcfa15f82dbd6228eeb607714691a85..0f8887ca869483fc91e817df3e986669cf29c940 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CreateCommand.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CreateCommand.java
@@ -23,7 +23,7 @@
  */
 package de.ozgcloud.alfa.common.command;
 
-import javax.validation.Valid;
+import jakarta.validation.Valid;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrder.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrder.java
index da13800709784f1a2c7906d3bfba20def3cd4a62..f998dfe648a4457c8247c56631934ea36eeed1ec 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrder.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrder.java
@@ -7,8 +7,8 @@ import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
-import javax.validation.Constraint;
-import javax.validation.Payload;
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
 
 @Constraint(validatedBy = { RequiredOrderValidator.class })
 @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE })
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrderValidator.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrderValidator.java
index 79c52429309481d71020d72bb26c3949e8bb0cc7..ef8a8897172582847e3cdc9377a5f5b4122a8342 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrderValidator.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrderValidator.java
@@ -1,7 +1,7 @@
 package de.ozgcloud.alfa.common.command;
 
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
 
 public class RequiredOrderValidator implements ConstraintValidator<RequiredOrder, CreateCommand> {
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilter.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilter.java
index 297aa8e7a22308f54ca8a3781c92e3742eeb6adf..e2824c6edfb29aababf2e32ef78a04364acdb468 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilter.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilter.java
@@ -25,13 +25,12 @@ package de.ozgcloud.alfa.common.downloadtoken;
 
 import java.io.IOException;
 
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpStatus;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
@@ -52,7 +51,7 @@ public class DownloadTokenAuthenticationFilter extends OncePerRequestFilter {
 		try {
 			downloadTokenService.handleToken(request, getDownloadToken(request));
 		} catch (TechnicalException e) {
-			response.setStatus(HttpStatus.SC_UNAUTHORIZED);
+			response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
 			return;
 		}
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenProperties.java
index 8e63cd4b96fe65a1ef4b937c301c0f6b1ffd782a..d07c0a7956c415e8c80adeadd5205aa634e32ec3 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenProperties.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenProperties.java
@@ -23,7 +23,7 @@
  */
 package de.ozgcloud.alfa.common.downloadtoken;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenService.java
index fa4276a91aebf8d0fae0b1ea4ae5c7aa14a08442..466881c91649dc8b37de5ec46057b33d5e717c89 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenService.java
@@ -27,7 +27,7 @@ import static de.ozgcloud.alfa.JwtTokenUtil.*;
 
 import java.util.Optional;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -90,12 +90,12 @@ class DownloadTokenService {
 		Optional<Claims> claimsOptional = jwtTokenUtil.getAllClaimsFromToken(token);
 		var downloadUserBuilder = GoofyUserWithFileId.builder();
 		claimsOptional.ifPresent(claims -> downloadUserBuilder.user(
-				UserProfile.builder()
-						.id(UserId.from(claims.get(USERID_CLAIM, String.class)))
-						.firstName(claims.get(FIRSTNAME_CLAIM, String.class))
-						.lastName(claims.get(LASTNAME_CLAIM, String.class))
-						.authorities(jwtTokenUtil.getRolesFromToken(token))
-						.organisationseinheitIds(jwtTokenUtil.getOrganisationseinheitIdsFromToken(token)).build())
+						UserProfile.builder()
+								.id(UserId.from(claims.get(USERID_CLAIM, String.class)))
+								.firstName(claims.get(FIRSTNAME_CLAIM, String.class))
+								.lastName(claims.get(LASTNAME_CLAIM, String.class))
+								.authorities(jwtTokenUtil.getRolesFromToken(token))
+								.organisationseinheitIds(jwtTokenUtil.getOrganisationseinheitIdsFromToken(token)).build())
 				.fileId(FileId.from(claims.get(FILEID_CLAIM, String.class))));
 
 		return downloadUserBuilder.build();
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/errorhandling/ExceptionController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/errorhandling/ExceptionController.java
index 0772ce937792cb74d362034fea4ea1e4d58792c0..018624fea26e30f86f059b898038ce02efdf0059 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/errorhandling/ExceptionController.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/errorhandling/ExceptionController.java
@@ -33,10 +33,10 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Stream;
 
-import javax.validation.ConstraintViolation;
-import javax.validation.ConstraintViolationException;
-import javax.validation.Path;
-import javax.validation.metadata.ConstraintDescriptor;
+import jakarta.validation.ConstraintViolation;
+import jakarta.validation.ConstraintViolationException;
+import jakarta.validation.Path;
+import jakarta.validation.metadata.ConstraintDescriptor;
 
 import org.hibernate.validator.engine.HibernateConstraintViolation;
 import org.springframework.core.annotation.Order;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserHelper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserHelper.java
index c3752745433b597fec75c1eea29995c7efda3075..b0414c8fc1f7a12e718c0a8aeec96ebeedd8468b 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserHelper.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserHelper.java
@@ -34,26 +34,20 @@ import org.springframework.security.authentication.AuthenticationTrustResolverIm
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.oauth2.jwt.Jwt;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public class CurrentUserHelper {
-	static final String ROLE_PREFIX = "ROLE_";
 
-	public static final Predicate<String> HAS_ROLE = CurrentUserHelper::hasRole;
+	static final String ROLE_PREFIX = "ROLE_";
+	private static final String SUB_CLAIM_KEY = "sub";
 
 	private static final AuthenticationTrustResolver TRUST_RESOLVER = new AuthenticationTrustResolverImpl();
-	private static final Predicate<Authentication> TRUSTED = auth -> !TRUST_RESOLVER.isAnonymous(auth);
-
-	public static Authentication getAuthentication() {
-		return findAuthentication().orElseThrow(() -> new IllegalStateException("No authenticated User found"));
-	}
-
-	public static Optional<Authentication> findAuthentication() {
-		return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()).filter(TRUSTED);
-	}
+	private static final Predicate<Authentication> IS_TRUSTED = auth -> !TRUST_RESOLVER.isAnonymous(auth);
+	private static final Predicate<String> IS_ROLE_PREFIX_MISSING = role -> !role.startsWith(ROLE_PREFIX);
 
 	public static boolean hasRole(String role) {
 		var auth = getAuthentication();
@@ -61,46 +55,44 @@ public class CurrentUserHelper {
 		if ((Objects.isNull(auth)) || (Objects.isNull(auth.getPrincipal()))) {
 			return false;
 		}
-		Collection<? extends GrantedAuthority> authorities = auth.getAuthorities();
-		return containsRole(authorities, role);
-
+		return containsRole(auth.getAuthorities(), role);
 	}
 
 	public static boolean containsRole(Collection<? extends GrantedAuthority> authorities, String role) {
-		String roleToCheck;
-
-		if (Objects.nonNull(role) && !role.startsWith(ROLE_PREFIX)) {
-			roleToCheck = ROLE_PREFIX + role;
-		} else {
-			roleToCheck = role;
-		}
-
 		if (Objects.isNull(authorities)) {
 			return false;
 		}
+		return containsRole(prepareRoleForCheck(role), authorities);
+	}
 
-		return containsRole(roleToCheck, authorities);
+	static boolean containsRole(String role, Collection<? extends GrantedAuthority> authorities) {
+		return authorities.stream().anyMatch(a -> isAuthorityEquals(role, a.getAuthority()));
 	}
 
-	public static String prepareRoleForCheck(String role) {
-		if ((Objects.nonNull(role)) && (!role.startsWith(ROLE_PREFIX))) {
-			return ROLE_PREFIX + role;
-		} else {
-			return role;
-		}
+	private static boolean isAuthorityEquals(String role, String authority) {
+		return StringUtils.equalsIgnoreCase(role, authority) || StringUtils.equalsIgnoreCase(prepareRoleForCheck(role), authority);
 	}
 
-	public static boolean containsRole(String role, Collection<? extends GrantedAuthority> authorities) {
-		return authorities.stream().anyMatch(a -> isAuthorityEquals(role, a.getAuthority()));
+	static String prepareRoleForCheck(String roleToCheck) {
+		return Optional.ofNullable(roleToCheck)
+				.filter(IS_ROLE_PREFIX_MISSING)
+				.map(role -> String.format("%s%s", ROLE_PREFIX, role))
+				.orElse(roleToCheck);
 	}
 
-	private static boolean isAuthorityEquals(String role, String authority) {
-		String roleToCheck = prepareRoleForCheck(role);
-		return StringUtils.equalsIgnoreCase(role, authority) || StringUtils.equalsIgnoreCase(roleToCheck, authority);
+	public static UserId getCurrentUserId() {
+		return UserId.from(getSubClaim());
 	}
 
-	static UserId getCurrentUserId() {
-		return UserId.from(getAuthentication().getName());
+	private static String getSubClaim() {
+		return ((Jwt) getAuthentication().getPrincipal()).getClaim(SUB_CLAIM_KEY);
 	}
 
+	public static Authentication getAuthentication() {
+		return findAuthentication().orElseThrow(() -> new IllegalStateException("No authenticated User found"));
+	}
+
+	private static Optional<Authentication> findAuthentication() {
+		return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()).filter(IS_TRUSTED);
+	}
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java
index 94b9c3900b2f7decee285d35e220fd28463a5fe5..6ba0fc106713431e94c8974c21f50b93b6ca03a6 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java
@@ -25,17 +25,14 @@ package de.ozgcloud.alfa.common.user;
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
-import org.keycloak.KeycloakPrincipal;
-import org.keycloak.representations.AccessToken;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
 import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.oauth2.jwt.Jwt;
 import org.springframework.stereotype.Service;
 
 import de.itvsh.kop.common.errorhandling.TechnicalException;
@@ -50,6 +47,10 @@ public class CurrentUserService {
 
 	static final String USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID = "organisationseinheitId";
 
+	static final String KEYCLOAK_USER_PREFERRED_USERNAME = "preferred_username";
+	static final String KEYCLOAK_USER_GIVEN_NAME = "given_name";
+	static final String KEYCLOAK_USER_FAMILY_NAME = "family_name";
+
 	@Autowired
 	private UserService userService;
 	@Autowired
@@ -65,44 +66,47 @@ public class CurrentUserService {
 		return CurrentUserHelper.containsRole(reachableRoles, role);
 	}
 
-	public Collection<GrantedAuthority> getAuthorities() {
-		return Collections.unmodifiableCollection(new HashSet<GrantedAuthority>(CurrentUserHelper.getAuthentication().getAuthorities()));
-	}
-
 	public UserProfile getUser() {
-		var dlUser = getDownloadUser();
-		if (dlUser.isPresent()) {
-			return dlUser.get();
-		}
-
-		Optional<AccessToken> token = getCurrentSecurityToken();
+		return getDownloadUser().orElseGet(this::buildUserProfile);
+	}
 
+	private UserProfile buildUserProfile() {
 		var userBuilder = UserProfile.builder()
 				.id(getUserId())
 				.authorities(getAuthorities());
 
-		token.ifPresent(t -> userBuilder.userName(t.getPreferredUsername())
-				.firstName(t.getGivenName())
-				.lastName(t.getFamilyName())
-				.organisationseinheitIds(getOrganisationseinheitId(t.getOtherClaims())));
+		getCurrentSecurityToken().ifPresent(token -> userBuilder
+				.userName(token.getClaimAsString(KEYCLOAK_USER_PREFERRED_USERNAME))
+				.firstName(token.getClaimAsString(KEYCLOAK_USER_GIVEN_NAME))
+				.lastName(token.getClaimAsString(KEYCLOAK_USER_FAMILY_NAME))
+				.organisationseinheitIds(getOrganisationsEinheitIds(token)));
 
 		return userBuilder.build();
 	}
 
+	public Collection<GrantedAuthority> getAuthorities() {
+		return Collections.unmodifiableCollection(CurrentUserHelper.getAuthentication().getAuthorities());
+	}
+
 	public UserId getUserId() {
 		return findUserId()
 				.orElseThrow(() -> new TechnicalException("Cannot find internal UserId. Check sync with UserManager or Token Mapper in keycloak."));
 	}
 
 	public Optional<UserId> findUserId() {
-		return Optional.ofNullable(
-						getSingleClaimValue(ATTRIBUTE_NAME_USER_ID).map(UserId::from)
-								.orElseGet(() -> userService.getInternalId(CurrentUserHelper.getCurrentUserId()).orElse(null)))
+		return Optional.ofNullable(getSingleClaimValue(ATTRIBUTE_NAME_USER_ID)
+				.map(UserId::from)
+				.orElseGet(this::getInternalId))
 				.filter(Objects::nonNull);
 	}
 
-	List<String> getOrganisationseinheitId(Map<String, Object> claims) {
-		return Optional.ofNullable(claims.get(USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID))
+	private UserId getInternalId() {
+		return userService.getInternalId(CurrentUserHelper.getCurrentUserId()).orElse(null);
+	}
+
+	List<String> getOrganisationsEinheitIds(Jwt jwt) {
+		return Optional.ofNullable(jwt)
+				.map(token -> token.getClaim(USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID))
 				.map(col -> (Collection<?>) col).orElse(Collections.emptyList()) // NOSONAR - Collection.class::cast has type-safty issue
 				.stream().map(Object::toString).toList();
 	}
@@ -114,19 +118,19 @@ public class CurrentUserService {
 				.map(GoofyUserWithFileId::getUser);
 	}
 
-	Optional<AccessToken> getCurrentSecurityToken() {
-		Object principal = CurrentUserHelper.getAuthentication().getPrincipal();
+	Optional<String> getSingleClaimValue(String attributeName) {
+		return getCurrentSecurityToken()
+				.map(token -> token.getClaim(attributeName))
+				.map(String.class::cast);
+	}
+
+	Optional<Jwt> getCurrentSecurityToken() {
+		var principal = CurrentUserHelper.getAuthentication().getPrincipal();
 
-		if (principal instanceof KeycloakPrincipal<?> kcPrincipal) {
-			return Optional.of(kcPrincipal.getKeycloakSecurityContext().getToken());
+		if (principal instanceof Jwt kcPrincipal) {
+			return Optional.of(kcPrincipal);
 		}
 
 		return Optional.empty();
 	}
-
-	Optional<String> getSingleClaimValue(String attributeName) {
-		return getCurrentSecurityToken()
-				.map(token -> token.getOtherClaims().get(attributeName))
-				.map(String.class::cast);
-	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieCommandHandler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieCommandHandler.java
index dc735be8bf8f3da848fd631fa28612ff23a444fb..fe54b77f7a60a44ac005f05864c7819587701b36 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieCommandHandler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieCommandHandler.java
@@ -27,8 +27,8 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.function.Predicate;
 
-import org.apache.commons.codec.binary.StringUtils;
 import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/Kommentar.java b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/Kommentar.java
index a522e29cf9e9fd05ca47cc1b663b835235d2a5b0..1dde8e3c04207e104bddf8f3a5986879e6dbc666 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/Kommentar.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/Kommentar.java
@@ -28,8 +28,8 @@ import static de.ozgcloud.alfa.common.ValidationMessageCodes.*;
 import java.time.ZonedDateTime;
 import java.util.List;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarCommand.java b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarCommand.java
index a6945fac38dcd6aec6466cb2649f248a8e38801b..7f6e99db26f4255bc06827e0f0ccfd64545b77f4 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarCommand.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarCommand.java
@@ -23,7 +23,7 @@
  */
 package de.ozgcloud.alfa.kommentar;
 
-import javax.validation.Valid;
+import jakarta.validation.Valid;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarService.java
index 8edacd2a909f462b4bd23b20707318bb44acb1f0..4bd41879a07fffedf0e715c4d3adb65ca36575db 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarService.java
@@ -26,7 +26,7 @@ package de.ozgcloud.alfa.kommentar;
 import java.time.ZonedDateTime;
 import java.util.stream.Stream;
 
-import javax.validation.Valid;
+import jakarta.validation.Valid;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungService.java
index d215118ece078659764cff242d4a87101a9bf4a1..d478b7f56b218436f5c30404ad132c4261b331ae 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungService.java
@@ -3,7 +3,7 @@ package de.ozgcloud.alfa.loeschanforderung;
 import java.util.List;
 import java.util.Optional;
 
-import javax.validation.Valid;
+import jakarta.validation.Valid;
 
 import org.apache.commons.collections.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMail.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMail.java
index 722d7f5b9f2b4e96daa4f228ab42101371d04bb9..0b5a606b86e6ab51a6cd027b4e8caecf8f4320e0 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMail.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMail.java
@@ -29,8 +29,8 @@ import java.time.ZonedDateTime;
 import java.util.List;
 import java.util.Map;
 
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Size;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfModel.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfModel.java
index 011cfc7be512df6257e987a66cc80c8a0926e952..47457f9b4040d2c3a47f01843b797a1131e227d2 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfModel.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfModel.java
@@ -25,9 +25,9 @@ package de.ozgcloud.alfa.postfach;
 
 import java.util.List;
 
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlElementWrapper;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
@@ -76,7 +76,7 @@ class PostfachNachrichtPdfModel {
 	@Getter
 	@Builder
 	static class Nachricht {
-		
+
 		@XmlElement
 		private boolean isFirst;
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfService.java
index 6a71d24ad93dd318d8064f7692b2e81f70a339f3..1ab1d3efdd79fd8b6e2790f6329efcda55278dff 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfService.java
@@ -26,8 +26,6 @@ package de.ozgcloud.alfa.postfach;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.time.format.DateTimeFormatter;
-import java.util.Locale;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Stream;
@@ -40,6 +38,7 @@ import org.springframework.stereotype.Service;
 
 import de.itvsh.kop.common.errorhandling.TechnicalException;
 import de.itvsh.kop.common.pdf.PdfService;
+import de.ozgcloud.alfa.common.GermanDateTimeFormatter;
 import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
 import de.ozgcloud.alfa.common.user.UserProfile;
 import de.ozgcloud.alfa.postfach.PostfachMail.Direction;
@@ -56,11 +55,12 @@ class PostfachNachrichtPdfService {
 
 	static final String FALLBACK_ANTRAGSTELLER_NAME = "Antragsteller";
 
-	private static final DateTimeFormatter CREATED_AT_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss O").withLocale(Locale.GERMANY);
-
 	@Autowired
 	private PdfService pdfService;
 
+	@Autowired
+	private GermanDateTimeFormatter germanDateTimeFormatter;
+
 	private boolean isFirstNachricht;
 
 	@Value(PostfachNachrichtPdfService.PDF_TEMPLATE_PATH)
@@ -111,7 +111,7 @@ class PostfachNachrichtPdfService {
 				.isFirst(isFirstNachricht())
 				.subject(postfachMail.getSubject())
 				.mailBody(postfachMail.getMailBody())
-				.createdAt(CREATED_AT_FORMATTER.format(postfachMail.getCreatedAt()))
+				.createdAt(germanDateTimeFormatter.formatZonedDateTime(postfachMail.getCreatedAt()))
 				.createdBy(buildAbsenderName(postfachMail, antragsteller))
 				.attachments(postfachMail.getAttachmentNames())
 				.build();
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/system/SystemStatusService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/system/SystemStatusService.java
index 2659fe7ee8dfa9ae928f6d8b4ef645454b827c38..b188e77aade4147f71521677815a9c569c6bc5d1 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/system/SystemStatusService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/system/SystemStatusService.java
@@ -43,4 +43,5 @@ public class SystemStatusService {
 			return false;
 		}
 	}
-}
+
+}
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/EingangHeader.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/EingangHeader.java
index 9b701e231c2108190bd93c7ac969ab7a80cc89e0..2a52a44273b9131774cdeab95bf968d1948c8678 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/EingangHeader.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/EingangHeader.java
@@ -41,4 +41,5 @@ public class EingangHeader {
 	private String customerId;
 	private String client;
 	private String clientId;
+	private String formEngineName;
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java
index 4d20537f80561f22639956d9ec43f3c69f4cbb09..b4baa520ea36698f124cd3259fc29c8e8902aa2b 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java
@@ -25,7 +25,7 @@ package de.ozgcloud.alfa.vorgang;
 
 import java.util.Optional;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..b0413eb8dacc873c3cdeb3d98ba2ae1532b0302a
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java
@@ -0,0 +1,36 @@
+package de.ozgcloud.alfa.vorgang;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Configuration
+@ConfigurationProperties(prefix = VorgangProperties.PREFIX)
+class VorgangProperties {
+
+	public static final String PREFIX = "ozgcloud.vorgang";
+
+	/**
+	 * Konfiguriert für welche Art von Anträgen der Button zur Erstellung von Bescheiden angezeigt wird. Der Art eines Antrags wird basierend auf form
+	 * id und form engine name bestimmt.
+	 */
+	private List<VorgangProperty> bescheid = Collections.emptyList();
+
+	@Builder
+	@Setter
+	@Getter
+	static class VorgangProperty {
+
+		private String formId;
+		private String formEngineName;
+
+	}
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java
index 7d0a94767df5b81c01c7392cc13e4159dd9bb069..d3fcfa918b4198653bf1f71b27dad7f3d037e09e 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java
@@ -23,12 +23,14 @@
  */
 package de.ozgcloud.alfa.vorgang;
 
+import static java.util.Optional.*;
 import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
 
 import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Predicate;
 
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.hateoas.EntityModel;
 import org.springframework.hateoas.Link;
@@ -37,7 +39,9 @@ import org.springframework.hateoas.server.RepresentationModelProcessor;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.alfa.attachment.AttachmentController;
+import de.ozgcloud.alfa.common.FeatureToggleProperties;
 import de.ozgcloud.alfa.common.ModelBuilderFactory;
+import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController;
 import de.ozgcloud.alfa.common.user.CurrentUserService;
 import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
 import de.ozgcloud.alfa.common.user.UserRole;
@@ -45,6 +49,7 @@ import de.ozgcloud.alfa.historie.HistorieController;
 import de.ozgcloud.alfa.kommentar.KommentarController.KommentarByVorgangController;
 import de.ozgcloud.alfa.postfach.PostfachMailController;
 import de.ozgcloud.alfa.representation.RepresentationController;
+import de.ozgcloud.alfa.vorgang.VorgangProperties.VorgangProperty;
 import de.ozgcloud.alfa.vorgang.forwarding.ForwardingController;
 
 @Component
@@ -56,11 +61,15 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity
 	static final LinkRelation REL_POSTFACH_MAILS = LinkRelation.of("postfachMails");
 	static final LinkRelation REL_VORGANG_FORWARDING = LinkRelation.of("forwarding");
 	static final LinkRelation REL_HISTORIE = LinkRelation.of("historie");
+	static final LinkRelation REL_BESCHEID = LinkRelation.of("createBescheid");
 
 	static final String REL_SEARCH_USER = "search-user-profiles";
 	static final String USER_PROFILE_SEARCH_DELETED_PARAM = "deleted";
 	static final String USER_PROFILE_SEARCH_ORGANISATIONS_EINHEIT_ID_PARAM = "organisationsEinheitId";
 
+	private static final Predicate<EingangHeader> HAS_FORM_ID_WITH_ENGINE_NAME = eingangHeader -> ObjectUtils
+			.allNotNull(eingangHeader.getFormEngineName(), eingangHeader.getFormId());
+
 	@Autowired
 	private PostfachMailController postfachMailController;
 	@Autowired
@@ -70,6 +79,11 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity
 	@Autowired
 	private UserManagerUrlProvider userManagerUrlProvider;
 
+	@Autowired
+	private FeatureToggleProperties featureToggleProperties;
+	@Autowired
+	private VorgangProperties vorgangProperties;
+
 	private static final Predicate<VorgangWithEingang> HAS_ATTACHMENTS = vorgangWithEingang -> vorgangWithEingang.getEingang()
 			.getNumberOfAttachments() > 0;
 
@@ -99,6 +113,9 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity
 				.addLink(linkTo(methodOn(HistorieController.class).getAll(vorgang.getId())).withRel(REL_HISTORIE))
 				.ifMatch(() -> userManagerUrlProvider.isConfiguredForSearchUserProfile() && hasOrganisationsEinheitId(vorgang))
 				.addLink(() -> buildSearchUserProfilesLink(vorgang))
+				.ifMatch(() -> isCreateBescheidEnabled(vorgang))
+				.addLink(linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(),
+						null)).withRel(REL_BESCHEID))
 				.buildModel();
 	}
 
@@ -124,4 +141,24 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity
 	private String getOrganisationsEinheitId(VorgangWithEingang vorgang) {
 		return vorgang.getEingang().getZustaendigeStelle().getOrganisationseinheitenId();
 	}
+
+	boolean isCreateBescheidEnabled(VorgangWithEingang vorgang) {
+		return featureToggleProperties.isCreateBescheid() && hasVorgangCreateBescheidEnabled(vorgang);
+	}
+
+	boolean hasVorgangCreateBescheidEnabled(VorgangWithEingang vorgang) {
+		return ofNullable(vorgang.getEingang())
+				.map(Eingang::getHeader)
+				.filter(HAS_FORM_ID_WITH_ENGINE_NAME)
+				.map(this::isCreateBescheidEnabled)
+				.orElse(false);
+	}
+
+	private boolean isCreateBescheidEnabled(EingangHeader eingangHeader) {
+		return vorgangProperties.getBescheid().stream().filter(prop -> isFormIdAndFormEngineNameMatching(eingangHeader, prop)).count() > 0;
+	}
+
+	private boolean isFormIdAndFormEngineNameMatching(EingangHeader eingangHeader, VorgangProperty prop) {
+		return prop.getFormId().equals(eingangHeader.getFormId()) && prop.getFormEngineName().equals(eingangHeader.getFormEngineName());
+	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessor.java
index cc435d9a3aa02dab51ee9977b0fb512a98c8d7a3..4cec547359805d66ef6ffb1e63f005e34c941f96 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessor.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessor.java
@@ -33,7 +33,6 @@ import org.springframework.hateoas.LinkRelation;
 import org.springframework.hateoas.server.RepresentationModelProcessor;
 import org.springframework.stereotype.Component;
 
-import de.ozgcloud.alfa.common.FeatureToggleProperties;
 import de.ozgcloud.alfa.common.ModelBuilderFactory;
 import de.ozgcloud.alfa.common.command.CommandController;
 import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController;
@@ -48,7 +47,6 @@ public class VorgangWithEingangCommandProzessor implements RepresentationModelPr
 
 	static final LinkRelation REL_VORGANG_FORWARD = LinkRelation.of("forward");
 	static final LinkRelation REL_PENDING_COMMANDS = LinkRelation.of("pending-commands");
-	static final LinkRelation REL_BESCHEID = LinkRelation.of("createBescheid");
 
 	@Autowired
 	private CurrentUserService userService;
@@ -59,9 +57,6 @@ public class VorgangWithEingangCommandProzessor implements RepresentationModelPr
 	@Autowired
 	private ModelBuilderFactory<VorgangWithEingang> modelBuilderFactory;
 
-	@Autowired
-	private FeatureToggleProperties featureToggle;
-
 	@Override
 	public EntityModel<VorgangWithEingang> process(EntityModel<VorgangWithEingang> model) {
 		var vorgang = model.getContent();
@@ -75,9 +70,6 @@ public class VorgangWithEingangCommandProzessor implements RepresentationModelPr
 								null)).withRel(REL_VORGANG_FORWARD))
 				.ifMatch(this::existsPendingCommands)
 				.addLink(linkTo(methodOn(CommandController.class).getPendingCommands(true, vorgang.getId())).withRel(REL_PENDING_COMMANDS))
-				.ifMatch(() -> featureToggle.isCreateBescheid())
-				.addLink(linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(),
-						null)).withRel(REL_BESCHEID))
 				.buildModel();
 	}
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingController.java
index 3bdb5f803bd644ba90d4680c2bfc97e4e6650d52..6748c2b4b8a62eaf4b145fae0c37082a05ca7e07 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingController.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingController.java
@@ -24,7 +24,7 @@
 package de.ozgcloud.alfa.vorgang.forwarding;
 
 import java.util.List;
-import java.util.stream.Collectors;
+import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,6 +45,9 @@ public class ForwardingController {
 
 	static final String PARAM_VORGANG_ID = "vorgangId";
 
+	static final Predicate<Forwarding> IS_FAILED_FORWARDING = forwarding -> forwarding.getStatus() == Status.FAILED
+			|| forwarding.getStatus() == Status.SEND_ERROR;
+
 	@Autowired
 	private ForwardingService service;
 	@Autowired
@@ -56,9 +59,7 @@ public class ForwardingController {
 	}
 
 	public List<Forwarding> findFailedForwardings(String vorgangId) {
-		return findByVorgang(vorgangId)
-				.filter(forwarding -> forwarding.getStatus() == Status.FAILED || forwarding.getStatus() == Status.SEND_ERROR)
-				.collect(Collectors.toList());
+		return findByVorgang(vorgangId).filter(IS_FAILED_FORWARDING).toList();
 	}
 
 	public Stream<Forwarding> findByVorgang(String vorgangId) {
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingLandesnetzInfoService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingLandesnetzInfoService.java
index 2221f8b9ccb32f3a468b398151be6722d152a568..0f011886bd0a3faf917b2119476b283b8949e5e2 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingLandesnetzInfoService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingLandesnetzInfoService.java
@@ -27,7 +27,7 @@ import java.util.Collections;
 import java.util.Objects;
 import java.util.Set;
 
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingModelAssembler.java
index f4efb25b9dbd5a7e197af6ac832fa7f7ef1700d7..95690e00bc8ec35baea0aff9f99f85540de0d322 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingModelAssembler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingModelAssembler.java
@@ -25,7 +25,7 @@ package de.ozgcloud.alfa.vorgang.forwarding;
 
 import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
 
-import java.util.stream.Collectors;
+import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import org.springframework.hateoas.CollectionModel;
@@ -50,28 +50,34 @@ class ForwardingModelAssembler implements RepresentationModelAssembler<Forwardin
 
 	static final LinkRelation REL_ERROR = LinkRelation.of("error");
 
+	static final Predicate<Forwarding> IS_SENT = forwarding -> forwarding.getStatus() == Status.SENT;
+	static final Predicate<Forwarding> IS_SUCCESSFULL = forwarding -> forwarding.getStatus() == Status.SUCCESSFULL;
+	static final Predicate<Forwarding> IS_SENT_OR_SUCCESSFULL = forwarding -> forwarding.getStatus() == Status.SENT
+			|| forwarding.getStatus() == Status.SUCCESSFULL;
+	static final Predicate<Forwarding> IS_FAILED = forwarding -> forwarding.getStatus() == Status.FAILED;
+	static final Predicate<Forwarding> IS_SEND_ERROR = forwarding -> forwarding.getStatus() == Status.SEND_ERROR;
+
 	@Override
 	public EntityModel<Forwarding> toModel(Forwarding entity) {
 		var selfLink = linkTo(ForwardingController.class).slash(entity.getId());
 
 		return ModelBuilder.fromEntity(entity)
 				.addLink(linkTo(ForwardingController.class).slash(entity.getId()).withSelfRel())
-				.ifMatch(forwarding -> forwarding.getStatus() == Status.SENT)
+				.ifMatch(IS_SENT)
 				.addLinks(buildMarkAsSuccessLink(entity))
-				.ifMatch(forwarding -> forwarding.getStatus() == Status.SENT || forwarding.getStatus() == Status.SUCCESSFULL)
+				.ifMatch(IS_SENT_OR_SUCCESSFULL)
 				.addLinks(buildMarkAsFailLink(entity))
-				.ifMatch(forwarding -> forwarding.getStatus() == Status.FAILED)
+				.ifMatch(IS_FAILED)
 				.addLink(selfLink.withRel(REL_FAILED))
-				.ifMatch(forwarding -> forwarding.getStatus() == Status.SUCCESSFULL)
+				.ifMatch(IS_SUCCESSFULL)
 				.addLink(selfLink.withRel(REL_SUCCESSFULL))
-				.ifMatch(forwarding -> forwarding.getStatus() == Status.SEND_ERROR)
+				.ifMatch(IS_SEND_ERROR)
 				.addLink(selfLink.withRel(REL_ERROR))
 				.buildModel();
 	}
 
 	public CollectionModel<EntityModel<Forwarding>> toCollectionModel(Stream<Forwarding> entities) {
-		return CollectionModel.of(entities.map(this::toModel).collect(Collectors.toList()),
-				linkTo(ForwardingController.class).withSelfRel());
+		return CollectionModel.of(entities.map(this::toModel).toList(), linkTo(ForwardingController.class).withSelfRel());
 	}
 
 	public Link buildMarkAsSuccessLink(Forwarding forwarding) {
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordSizeConstraint.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordSizeConstraint.java
index 7a09abea36f1a4233b26f4487885a884b56dbc26..5910b2d2754dead2289ec19ea5869df79d28ea31 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordSizeConstraint.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordSizeConstraint.java
@@ -30,8 +30,8 @@ import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
-import javax.validation.Constraint;
-import javax.validation.Payload;
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
 
 import de.ozgcloud.alfa.common.ValidationMessageCodes;
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidator.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidator.java
index 30ee0e6cb971cd815b9ab4aeba9a626cfe2572c9..38ffb406bb2bd60125442acfb55734510a99fd2e 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidator.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidator.java
@@ -23,8 +23,8 @@
  */
 package de.ozgcloud.alfa.vorgang.forwarding;
 
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
 
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/RedirectRequest.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/RedirectRequest.java
index 832f4b088c63a02a1f7d8a3eb5a10ad1a0489d1a..8ffde941d1a0a2f2747f5eace6246448131c43b0 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/RedirectRequest.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/RedirectRequest.java
@@ -25,8 +25,8 @@ package de.ozgcloud.alfa.vorgang.forwarding;
 
 import static de.ozgcloud.alfa.common.ValidationMessageCodes.*;
 
-import javax.validation.constraints.Email;
-import javax.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotEmpty;
 
 import org.springframework.validation.annotation.Validated;
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/Wiedervorlage.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/Wiedervorlage.java
index bcb6b368af74344e0d18efe48f7bdb20a12cb6e3..08871f86e4d81489b0589e0caba54435c6a6f263 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/Wiedervorlage.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/Wiedervorlage.java
@@ -29,9 +29,9 @@ import java.time.LocalDate;
 import java.time.ZonedDateTime;
 import java.util.List;
 
-import javax.validation.constraints.FutureOrPresent;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.FutureOrPresent;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommand.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommand.java
index f44964506366e8a82b60939dd1493db4393b0d79..398f2b6e0905fa5bcae4d27cc9a0703ab569a0dc 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommand.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommand.java
@@ -23,7 +23,7 @@
  */
 package de.ozgcloud.alfa.wiedervorlage;
 
-import javax.validation.Valid;
+import jakarta.validation.Valid;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java
index 9c496fa1f0b95ab94b73be62dec0d9a05a5f3fe2..660aeefbe8e6a5d1425fd04d4d3b9cedee1a6e8a 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java
@@ -31,7 +31,7 @@ import java.util.Optional;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
-import javax.validation.Valid;
+import jakarta.validation.Valid;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
diff --git a/alfa-service/src/main/resources/fop/postfach-nachrichten.xsl b/alfa-service/src/main/resources/fop/postfach-nachrichten.xsl
index b030aacd5e9d4f8127ce23fe7a65b7cf5402da04..7442f94c340789ee9a8929ce29d935df370fcac8 100644
--- a/alfa-service/src/main/resources/fop/postfach-nachrichten.xsl
+++ b/alfa-service/src/main/resources/fop/postfach-nachrichten.xsl
@@ -75,7 +75,7 @@
 	
 	<xsl:template name="nachricht">
 		
-			<fo:block font-size="11pt"  margin-bottom="2mm">
+			<fo:block font-size="11pt"  margin-bottom="2mm" linefeed-treatment="preserve">
 				<xsl:if test="isFirst='false'">
 					<fo:leader leader-pattern="rule" leader-length="175mm" rule-style="solid" rule-thickness="1pt"/>
 				</xsl:if>
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java
index 145d1e512f80ce0538074b74fde6272c7269e12a..7ef79567ddc28f389673dc545eab8832d6f26916 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java
@@ -29,12 +29,14 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.keycloak.adapters.springboot.KeycloakSpringBootProperties;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
+import lombok.SneakyThrows;
+
 class EnvironmentControllerTest {
 
 	private final String PATH = "/api/environment";
@@ -42,7 +44,7 @@ class EnvironmentControllerTest {
 	@InjectMocks
 	private EnvironmentController controller;
 	@Mock
-	private KeycloakSpringBootProperties kcProperties;
+	private OAuth2Properties oAuth2Properties;
 
 	private MockMvc mockMvc;
 
@@ -52,22 +54,30 @@ class EnvironmentControllerTest {
 	}
 
 	@Test
-	void loadEnvironment() throws Exception {
-		mockMvc.perform(get(PATH)).andExpect(status().isOk());
+	void shouldReturnOk() throws Exception {
+		var response = doRequest();
+
+		response.andExpect(status().isOk());
 	}
 
 	@Test
 	void shouldHaveProductionTrueAsDefault() throws Exception {
-		mockMvc.perform(get(PATH)).andExpect(status().is2xxSuccessful())//
-				.andExpect(jsonPath("$.production").value(true));
+		var response = doRequest();
+
+		response.andExpect(jsonPath("$.production").value(true));
 	}
 
 	@Test
 	void shouldHaveClientId() throws Exception {
 		var client = "goofy";
+		when(oAuth2Properties.getResource()).thenReturn(client);
+		var response = doRequest();
 
-		when(kcProperties.getResource()).thenReturn(client);
+		response.andExpect(jsonPath("$.clientId").value(client));
+	}
 
-		mockMvc.perform(get(PATH)).andExpect(jsonPath("$.clientId").value(client));
+	@SneakyThrows
+	private ResultActions doRequest() {
+		return mockMvc.perform(get(PATH));
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/JwtAuthConverterTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtAuthConverterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..273deca7fae29bbefd8ffaa6f9f1aec98e7a56af
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtAuthConverterTest.java
@@ -0,0 +1,232 @@
+package de.ozgcloud.alfa;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.oauth2.jwt.Jwt;
+import org.springframework.security.oauth2.jwt.JwtClaimNames;
+import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
+
+import com.thedeanda.lorem.LoremIpsum;
+
+class JwtAuthConverterTest {
+
+	@Spy
+	@InjectMocks
+	private final JwtAuthConverter converter = new JwtAuthConverter();
+	@Mock
+	private OAuth2Properties oAuth2Properties;
+
+	@DisplayName("Convert")
+	@Nested
+	class TestConvert {
+
+		@Mock
+		private Jwt jwt;
+
+		@BeforeEach
+		void mock() {
+			doReturn(StringUtils.EMPTY).when(converter).getPrincipleClaimName(any());
+			doReturn(Collections.emptySet()).when(converter).getAuthorities(any());
+		}
+
+		@Test
+		void shouldGetAuthrorities() {
+			converter.convert(jwt);
+
+			verify(converter).getAuthorities(jwt);
+		}
+
+		@Test
+		void shouldGetPrincipleClaimName() {
+			converter.convert(jwt);
+
+			verify(converter).getPrincipleClaimName(jwt);
+		}
+
+		@Test
+		void shouldReturnJwtAuthenticationToken() {
+			var token = converter.convert(jwt);
+
+			assertThat(token).isInstanceOf(JwtAuthenticationToken.class);
+		}
+	}
+
+	@DisplayName("Get principle claim name")
+	@Nested
+	class TestGetPrincipleClaimName {
+
+		private final String subClaimValue = LoremIpsum.getInstance().getWords(1);
+		private final String principleClaimKey = LoremIpsum.getInstance().getWords(1);
+		private final String principleClaimValue = LoremIpsum.getInstance().getWords(1);
+		private final Map<String, Object> claimMap = Map.of(JwtClaimNames.SUB, subClaimValue, principleClaimKey, principleClaimValue);
+		private final Jwt jwt = JwtTestFactory.create(claimMap);
+
+		@DisplayName("if principle attribute is set")
+		@Nested
+		class TestIfPrincipleAttributeIsSet {
+
+			@BeforeEach
+			void mock() {
+				when(oAuth2Properties.getPrincipleAttribute()).thenReturn(null);
+			}
+
+			@Test
+			void shouleReturnPrincipleAttributeClaimValue() {
+				var principleClaimName = converter.getPrincipleClaimName(jwt);
+
+				assertThat(principleClaimName).isEqualTo(subClaimValue);
+			}
+		}
+
+		@DisplayName("if principle attribute is not set")
+		@Nested
+		class TestIfPrincipleAttributeNotSet {
+
+			@BeforeEach
+			void mock() {
+				when(oAuth2Properties.getPrincipleAttribute()).thenReturn(principleClaimKey);
+			}
+
+			@Test
+			void shouldReturnSubClaimValue() {
+				var principleClaimName = converter.getPrincipleClaimName(jwt);
+
+				assertThat(principleClaimName).isEqualTo(principleClaimValue);
+			}
+		}
+	}
+
+	@DisplayName("Get authorities")
+	@Nested
+	class TestGetAuthorities {
+
+		private final static String SCOPE_CLAIM_KEY = "scope";
+		private final static String SCOPE_CLAIM_VALUE = "dummyClaimValue";
+		private final Jwt jwt = JwtTestFactory.create(Map.of(SCOPE_CLAIM_KEY, SCOPE_CLAIM_VALUE));
+
+		@BeforeEach
+		void mock() {
+			doReturn(Collections.emptyList()).when(converter).extractResourceRoles(any());
+		}
+
+		@Test
+		void shouldConvertJwt() {
+			var authorities = converter.getAuthorities(jwt);
+
+			assertThat(authorities).extracting(GrantedAuthority::toString)
+					.contains(String.format("%s_%s", SCOPE_CLAIM_KEY.toUpperCase(), SCOPE_CLAIM_VALUE));
+		}
+
+		@Test
+		void shouldExtractRoles() {
+			converter.getAuthorities(jwt);
+
+			verify(converter).extractResourceRoles(jwt);
+		}
+	}
+
+	@DisplayName("Extract resource roles")
+	@Nested
+	class TestExtractResourceRoles {
+
+		private final Map<String, Object> claimsMap = Map.of(JwtAuthConverter.RESOURCE_ACCESS_KEY, Map.of("dummyKey", "dummyValue"));
+		private final Jwt jwt = JwtTestFactory.create(claimsMap);
+
+		@Test
+		void shouldReturnEmptySetOnMissingResourceAccess() {
+			var claimsMap = Map.<String, Object>of(JwtAuthConverter.RESOURCE_ACCESS_KEY, Collections.emptyMap());
+			var jwt = JwtTestFactory.create(claimsMap);
+
+			var resourceRoles = converter.extractResourceRoles(jwt);
+
+			assertThat(resourceRoles).isEmpty();
+		}
+
+		@DisplayName("on existing resource access")
+		@Nested
+		class TestOnExistingResourceAccess {
+
+			@Test
+			void shouldCallProperties() {
+				converter.extractResourceRoles(jwt);
+
+				verify(oAuth2Properties).getResource();
+			}
+
+			@Test
+			void shouldReturnEmptySetOnMissingResourceId() {
+				when(oAuth2Properties.getResource()).thenReturn(null);
+
+				var resourceRoles = converter.extractResourceRoles(jwt);
+
+				assertThat(resourceRoles).isEmpty();
+			}
+
+			@DisplayName("and existing resourceId")
+			@Nested
+			class TestAndExistingResourceId {
+
+				private final static String RESOURCE_ID = "dummyResourceId";
+				private final Map<String, Object> authoritiesMap = Map.of(JwtAuthConverter.RESOURCE_ACCESS_KEY,
+						Map.of(RESOURCE_ID, Collections.emptyMap()));
+				private final Jwt jwt = JwtTestFactory.create(authoritiesMap);
+
+				@BeforeEach
+				void mock() {
+					doReturn(Collections.emptySet()).when(converter).extractRoles(any());
+					when(oAuth2Properties.getResource()).thenReturn(RESOURCE_ID);
+				}
+
+				@Test
+				void shouldExtractRoles() {
+					converter.extractResourceRoles(jwt);
+
+					verify(converter).extractRoles(any());
+				}
+			}
+
+		}
+	}
+
+	@DisplayName("Extract roles")
+	@Nested
+	class TestExtractRoles {
+
+		@Test
+		void shouldReturnMappedRoleIfRolesExist() {
+			var authorities = converter.extractRoles(Map.of(JwtAuthConverter.ROLES_KEY, List.of("dummy")));
+
+			assertThat(authorities).extracting(SimpleGrantedAuthority::toString).containsExactly("ROLE_dummy");
+		}
+
+		@Test
+		void shouldReturnEmptySetIfNoRoleExists() {
+			var authorities = converter.extractRoles(Map.of(JwtAuthConverter.ROLES_KEY, Collections.emptyList()));
+
+			assertThat(authorities).isEmpty();
+		}
+
+		@Test
+		void shouldReturnEmptySetIfRolesEntryNotExists() {
+			var authorities = converter.extractRoles(Collections.emptyMap());
+
+			assertThat(authorities).isEmpty();
+		}
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3f4ea31829b65c243d3349c2837fe29a3b18aa0
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTestFactory.java
@@ -0,0 +1,23 @@
+package de.ozgcloud.alfa;
+
+import java.time.Instant;
+import java.util.Map;
+
+import org.springframework.security.oauth2.jwt.Jwt;
+
+import com.thedeanda.lorem.LoremIpsum;
+
+public class JwtTestFactory {
+
+	public static final String TOKEN_VALUE = LoremIpsum.getInstance().getWords(1);
+	private static final Instant ISSUE_AT = Instant.now();
+	private static final Instant EXPIRES_AT = Instant.now();
+
+	public static final String DUMMY_HEADER_KEY = "dummyHeaderKey";
+	private static final String DUMMY_HEADER_VALUE = "dummyHeaderValue";
+	private static final Map<String, Object> HEADERS = Map.of(DUMMY_HEADER_KEY, DUMMY_HEADER_VALUE);
+
+	public static Jwt create(Map<String, Object> claims) {
+		return new Jwt(TOKEN_VALUE, ISSUE_AT, EXPIRES_AT, HEADERS, claims);
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTokenUtilTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTokenUtilTest.java
index b9105b305f4a32c1ff3820116743cd3a478903ce..3f1cec61922fc4b62939c88a165ad734fe72a023 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTokenUtilTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTokenUtilTest.java
@@ -59,7 +59,7 @@ class JwtTokenUtilTest {
 	@Mock
 	private DownloadTokenProperties downloadTokenProperties;
 
-	private static final String TOKEN_SECRET = "t0pS3cr3t";
+	private static final String TOKEN_SECRET = "t0pS3cr3t".repeat(8);
 	private static final int TOKEN_VALIDITY = 60000;
 
 	@BeforeEach
@@ -121,7 +121,7 @@ class JwtTokenUtilTest {
 
 		@Test
 		void shouldThrowExceptionOnInvalidToken() {
-			var token = buildToken(UUID.randomUUID().toString(), "invalid_token", TOKEN_VALIDITY);
+			var token = buildToken(UUID.randomUUID().toString(), "invalid_token".repeat(5), TOKEN_VALIDITY);
 
 			assertThrows(JWTVerificationException.class, () -> jwtTokenUtil.verifyToken(token));
 		}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/RequestIdFilterTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/RequestIdFilterTest.java
index bfaf794ff0962158e404c7af8d1f89720bc384a4..fbcb5735ea29412d836659128ecbcb8505f35fa5 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/RequestIdFilterTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/RequestIdFilterTest.java
@@ -29,10 +29,10 @@ import static org.mockito.Mockito.*;
 
 import java.io.IOException;
 
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/TestSecurityConfiguration.java b/alfa-service/src/test/java/de/ozgcloud/alfa/TestSecurityConfiguration.java
deleted file mode 100644
index 9ea7dbf43b0ffb08b194e501e39bdd26da99d539..0000000000000000000000000000000000000000
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/TestSecurityConfiguration.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-package de.ozgcloud.alfa;
-
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.annotation.Order;
-import org.springframework.security.config.annotation.web.WebSecurityConfigurer;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.builders.WebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-
-@Configuration
-@Order(50)
-public class TestSecurityConfiguration extends WebSecurityConfigurerAdapter implements WebSecurityConfigurer<WebSecurity> {
-
-	@Override
-	protected void configure(HttpSecurity http) throws Exception {
-		super.configure(http);
-
-		http.csrf().disable();
-	}
-}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentMapperTest.java
index edbb0974441a4e7cd7e7cb6195e99ba967be05a6..52a761ef966ccc1fd29f2340975353fb0bc063f6 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentMapperTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentMapperTest.java
@@ -1,26 +1,33 @@
 package de.ozgcloud.alfa.attachment;
 
-import org.assertj.core.api.Assertions;
+import static org.assertj.core.api.Assertions.*;
+
 import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.Lists;
 
 import de.ozgcloud.alfa.common.binaryfile.FileId;
 
-public class AttachmentMapperTest {
+class AttachmentMapperTest {
 
 	@Test
 	void shouldMapAttachmentsToEmptyList() {
-		Assertions.assertThat(AttachmentMapper.mapAttachments(null)).isEmpty();
+		var attachments = AttachmentMapper.mapAttachments(null);
+
+		assertThat(attachments).isEmpty();
 	}
 
 	@Test
 	void shouldMapAttachmentsToList() {
-		Assertions.assertThat(AttachmentMapper.mapAttachments(Lists.newArrayList("a1", "a2"))).containsExactly(FileId.from("a1"), FileId.from("a2"));
+		var attachments = AttachmentMapper.mapAttachments(Lists.newArrayList("a1", "a2"));
+
+		assertThat(attachments).containsExactly(FileId.from("a1"), FileId.from("a2"));
 	}
 
 	@Test
 	void shouldMapOneElementToList() {
-		Assertions.assertThat(AttachmentMapper.mapAttachments("a1")).containsExactly(FileId.from("a1"));
+		var attachments = AttachmentMapper.mapAttachments("a1");
+
+		assertThat(attachments).containsExactly(FileId.from("a1"));
 	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/GermanDateTimeFormatterTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/GermanDateTimeFormatterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c4b738d8cefe6f0d736c870827df8c44d7d6ded
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/GermanDateTimeFormatterTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.alfa.common;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+class GermanDateTimeFormatterTest {
+
+	@Mock
+	private SystemProperties properties;
+
+	@InjectMocks
+	private GermanDateTimeFormatter germanDateTimeFormatter;
+
+	@ParameterizedTest
+	@MethodSource("provideDataForFormatZonedDateTime")
+	void shouldFormatZonedDateTime(ZonedDateTime date, String zoneId, String expected) {
+		when(properties.getTimeZone()).thenReturn(ZoneId.of(zoneId));
+
+		assertThat(germanDateTimeFormatter.formatZonedDateTime(date)).isEqualTo(expected);
+	}
+
+	private static Stream<Arguments> provideDataForFormatZonedDateTime() {
+		return Stream.of(
+				Arguments.of(zonedDateTime(2023, 9, 25, 10, "UTC"), "Europe/Berlin", "25.09.2023 12:00:00 MESZ"),
+				Arguments.of(zonedDateTime(2023, 9, 25, 23, "UTC"), "Europe/Berlin", "26.09.2023 01:00:00 MESZ"),
+				Arguments.of(zonedDateTime(2023, 12, 1, 10, "UTC"), "Europe/Berlin", "01.12.2023 11:00:00 MEZ"),
+				Arguments.of(zonedDateTime(2023, 9, 25, 10, "UTC"), "America/Los_Angeles", "25.09.2023 03:00:00 PDT"),
+				Arguments.of(zonedDateTime(2023, 9, 25, 4, "UTC"), "America/Los_Angeles", "24.09.2023 21:00:00 PDT"),
+				Arguments.of(zonedDateTime(2023, 12, 1, 10, "UTC"), "America/Los_Angeles", "01.12.2023 02:00:00 PST"),
+				Arguments.of(zonedDateTime(2023, 12, 1, 10, "America/Los_Angeles"), "Europe/Berlin", "01.12.2023 19:00:00 MEZ")
+		);
+	}
+
+	private static ZonedDateTime zonedDateTime(int year, int month, int dayOfMonth, int hour, String zoneID) {
+		return ZonedDateTime.of(year, month, dayOfMonth, hour, 0, 0, 0, ZoneId.of(zoneID));
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileControllerITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileControllerITCase.java
index e3a8457b6e01b8680b547ed55596152657b3afa6..b83901c79d420a68c3ebd4741782e0f22b0c7a36 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileControllerITCase.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileControllerITCase.java
@@ -26,6 +26,7 @@ package de.ozgcloud.alfa.common.binaryfile;
 import static de.ozgcloud.alfa.JwtTokenUtil.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 
@@ -112,7 +113,8 @@ class BinaryFileControllerITCase {
 		}
 
 		void setTokenToSecuriyContext(String token) throws Exception {
-			mockMvc.perform(get(DownloadTokenController.DOWNLOAD_TOKEN_PATH + "?" + DownloadTokenController.PARAM_TOKEN + "=" + token))
+			mockMvc.perform(get(DownloadTokenController.DOWNLOAD_TOKEN_PATH + "?" + DownloadTokenController.PARAM_TOKEN + "=" + token)
+					.with(csrf()))
 					.andExpect(status().isOk());
 		}
 	}
@@ -130,10 +132,10 @@ class BinaryFileControllerITCase {
 		}
 
 		@Test
-		void shouldGet401WhenUnautorised() throws Exception {
+		void shouldGet403WhenUnautorised() throws Exception {
 			when(authentication.isAuthenticated()).thenReturn(Boolean.FALSE);
 
-			performRequest().andExpect(status().isUnauthorized());
+			performRequest().andExpect(status().isForbidden());
 		}
 
 		@Test
@@ -145,7 +147,7 @@ class BinaryFileControllerITCase {
 	}
 
 	ResultActions performRequest() throws Exception {
-		return mockMvc.perform(get(BinaryFileController.PATH + "/" + fileId.toString()));
+		return mockMvc.perform(get(BinaryFileController.PATH + "/" + fileId.toString()).with(csrf()));
 	}
 
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileITCase.java
index 5d090e6c206eb25921d3bec103a9da73aa23eb3c..6a10133bb7a092eeae2289d4fe9002a4f608820c 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileITCase.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileITCase.java
@@ -25,6 +25,7 @@ package de.ozgcloud.alfa.common.binaryfile;
 
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 
@@ -116,7 +117,7 @@ class BinaryFileITCase {
 		}
 
 		private ResultActions callEndpoint(MockMultipartFile file, String field) throws Exception {
-			return mockMvc.perform(multipart(SINGLE_PATH, VorgangHeaderTestFactory.ID, field).file(file));
+			return mockMvc.perform(multipart(SINGLE_PATH, VorgangHeaderTestFactory.ID, field).file(file).with(csrf()));
 		}
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandlerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandlerTest.java
index 155ac009c8fc0b9604f993dd188a71fde2ed1355..d9cc748ca8211b95706ca0ad8af73fea013a1693 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandlerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandlerTest.java
@@ -29,9 +29,10 @@ import static org.mockito.Mockito.*;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
-import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
+import org.mockito.Mock;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
+import org.springframework.security.oauth2.jwt.Jwt;
 
 class DownloadAuthenticationHandlerTest {
 
@@ -40,18 +41,22 @@ class DownloadAuthenticationHandlerTest {
 	@Nested
 	class TestAuthorizationKeycloak {
 
+		@Mock
+		private Jwt jwt;
+
 		private Authentication authentication = mock(Authentication.class);
 
 		@BeforeEach
 		void init() {
 			when(authentication.isAuthenticated()).thenReturn(Boolean.TRUE);
-			KeycloakAuthenticationToken keycloakToken = mock(KeycloakAuthenticationToken.class);
-			when(authentication.getPrincipal()).thenReturn(keycloakToken);
+			when(authentication.getPrincipal()).thenReturn(jwt);
 		}
 
 		@Test
 		void shouldAuthenticate() {
-			assertThat(downloadAuthorizationHandler.check(FileId.createNew(), authentication)).isTrue();
+			var check = downloadAuthorizationHandler.check(FileId.createNew(), authentication);
+
+			assertThat(check).isTrue();
 		}
 	}
 
@@ -69,23 +74,32 @@ class DownloadAuthenticationHandlerTest {
 
 		@Test
 		void shouldAuthenticate() {
-			assertThat(downloadAuthorizationHandler.check(fileId, authentication)).isTrue();
+			var check = downloadAuthorizationHandler.check(fileId, authentication);
+
+			assertThat(check).isTrue();
 		}
 
 		@Test
 		void shouldNotAuthenticateWrongFileId() {
-			assertThat(downloadAuthorizationHandler.check(FileId.createNew(), authentication)).isFalse();
+			var check = downloadAuthorizationHandler.check(FileId.createNew(), authentication);
+
+			assertThat(check).isFalse();
 		}
 
 		@Test
 		void shouldNotAuthenticateNoFileId() {
-			assertThat(downloadAuthorizationHandler.check(null, authentication)).isFalse();
+			var check = downloadAuthorizationHandler.check(null, authentication);
+
+			assertThat(check).isFalse();
 		}
 
 		@Test
 		void shouldNotAuthenticate() {
 			when(authentication.isAuthenticated()).thenReturn(Boolean.FALSE);
-			assertThat(downloadAuthorizationHandler.check(fileId, authentication)).isFalse();
+
+			var check = downloadAuthorizationHandler.check(fileId, authentication);
+
+			assertThat(check).isFalse();
 		}
 	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidatorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidatorTest.java
index 4ffb8a1e0758d81027e2160f48c8617b3d187a75..ad74b10d3b54551e3cf1171d5e1093f1148957e1 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidatorTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidatorTest.java
@@ -30,7 +30,7 @@ import static org.mockito.Mockito.*;
 import java.util.Collections;
 import java.util.Map;
 
-import javax.validation.ConstraintValidatorContext;
+import jakarta.validation.ConstraintValidatorContext;
 
 import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandITCase.java
index 6720703ad4c10512df430355ae65a52841d97e7e..301aa043ce57a76ace03a859b7e79b7c3be90f8a 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandITCase.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandITCase.java
@@ -26,6 +26,7 @@ package de.ozgcloud.alfa.common.command;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 
@@ -88,7 +89,7 @@ public class CommandITCase {
 		}
 
 		private void createCommand() throws Exception {
-			mockMvc.perform(post(buildUrl()).content(createContent()).contentType(MediaType.APPLICATION_JSON))
+			mockMvc.perform(post(buildUrl()).with(csrf()).content(createContent()).contentType(MediaType.APPLICATION_JSON))
 					.andExpect(status().isCreated());
 		}
 
@@ -298,6 +299,7 @@ public class CommandITCase {
 		ResultActions doRequest(String content) throws Exception {
 			return mockMvc.perform(post("/api/vorgangs/" + CommandTestFactory.VORGANG_ID + "/relations/" + CommandTestFactory.RELATION_ID + "/"
 					+ CommandTestFactory.RELATION_VERSION + "/commands")
+							.with(csrf())
 							.contentType(MediaType.APPLICATION_JSON)
 							.content(content));
 		}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/RequiredOrderValidatorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/RequiredOrderValidatorTest.java
index 58c1d44963fd8fa89d42943b42b601ae900550b5..6319e02a44ff12556ba1c5be98143fb13476d430 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/RequiredOrderValidatorTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/RequiredOrderValidatorTest.java
@@ -3,7 +3,7 @@ package de.ozgcloud.alfa.common.command;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
-import javax.validation.ConstraintValidatorContext;
+import jakarta.validation.ConstraintValidatorContext;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java
index d4754cd7b9f14b02c81f64b645509b9404e9f8d2..d2647b285fc74570cee9c0448eae40b7c37f13ab 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java
@@ -81,7 +81,7 @@ class DownloadTokenAuthenticationFilterITCase {
 
 	@Test
 	void shouldReturnUnauthorised() throws Exception {
-		String token = DownloadTokenTestFactory.createToken("badSecret", downloadTokenProperties.getValidity());
+		String token = DownloadTokenTestFactory.createToken("badSecret".repeat(8), downloadTokenProperties.getValidity());
 
 		performRequest(DownloadTokenController.DOWNLOAD_TOKEN_PATH + "?" + DownloadTokenController.PARAM_TOKEN + "=" + token)
 				.andExpect(status().isUnauthorized());
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterTest.java
index 4a8a712a21b6fad31ecd2a78ca3b68042946ed02..1d3e7c76ea1c13c1364338baf4d0839c39b7c223 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterTest.java
@@ -29,10 +29,10 @@ import static org.mockito.Mockito.*;
 import java.io.IOException;
 import java.util.UUID;
 
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenServiceTest.java
index b8fa3484dac7c506414fc628c6682dffdddef280..24bf8ab7f626e0e52f8d6a89b164e3dccb2e7934 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenServiceTest.java
@@ -33,8 +33,8 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionControllerTest.java
index 376bfbc299b60769cfe5231ce72b01ef67133d79..53fcd7d7e86047df2a8a4450c903de8c652bcb19 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionControllerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionControllerTest.java
@@ -29,7 +29,7 @@ import static org.mockito.Mockito.*;
 import java.util.Collections;
 import java.util.Map;
 
-import javax.validation.ConstraintViolationException;
+import jakarta.validation.ConstraintViolationException;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionTestFactory.java
index 3f3af3bc7782ad9930753a12d7ab7c3a6d6c52e1..d96c42787390b1b99df6bd412efce278c3dd7335 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionTestFactory.java
@@ -29,9 +29,9 @@ import static org.mockito.Mockito.*;
 import java.util.Map;
 import java.util.UUID;
 
-import javax.validation.ConstraintViolation;
-import javax.validation.Path;
-import javax.validation.metadata.ConstraintDescriptor;
+import jakarta.validation.ConstraintViolation;
+import jakarta.validation.Path;
+import jakarta.validation.metadata.ConstraintDescriptor;
 
 import org.hibernate.validator.engine.HibernateConstraintViolation;
 
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserHelperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserHelperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3ceac882e23c0f86a8dfb20d11131808060ab4a
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserHelperTest.java
@@ -0,0 +1,40 @@
+package de.ozgcloud.alfa.common.user;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+class CurrentUserHelperTest {
+
+	@DisplayName("Prepare role for check")
+	@Nested
+	class TestPrepareRoleForCheck {
+
+		@Test
+		void shouldAddPrefixIfMissing() {
+			var roleWithoutPrefix = UserRole.VERWALTUNG_USER;
+
+			var role = CurrentUserHelper.prepareRoleForCheck(roleWithoutPrefix);
+
+			assertThat(role).isEqualTo(String.format("%s%s", CurrentUserHelper.ROLE_PREFIX, UserRole.VERWALTUNG_USER));
+		}
+
+		@Test
+		void shouldReturnRoleIfPrefixAlreadyExists() {
+			var roleWithPrefix = String.format("ROLE_%s", UserRole.VERWALTUNG_USER);
+
+			var role = CurrentUserHelper.prepareRoleForCheck(roleWithPrefix);
+
+			assertThat(role).isEqualTo(roleWithPrefix);
+		}
+
+		@Test
+		void shouldReturnPassingRoleIfNonNull() {
+			var role = CurrentUserHelper.prepareRoleForCheck(null);
+
+			assertThat(role).isNull();
+		}
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserServiceTest.java
index f22c42b6cb253d3b2a1956e9f741d1aaa7c6a076..e363dc185c06592f6e7e11e35f25c131bd6a83d6 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserServiceTest.java
@@ -32,10 +32,14 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
-import org.keycloak.representations.AccessToken;
+import org.mockito.Mock;
 import org.mockito.Spy;
+import org.springframework.security.oauth2.jwt.Jwt;
+
+import de.ozgcloud.alfa.JwtTestFactory;
 
 class CurrentUserServiceTest {
 
@@ -45,34 +49,39 @@ class CurrentUserServiceTest {
 	@Nested
 	class TestGetOrganisationseinheit {
 
+		@Mock
+		private Jwt jwt;
+
 		@Test
 		void shouldReturnOrganisationseinheitIdsFromMap() {
-			Map<String, Object> claims = Map.of(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID, List.of("1", "2"));
+			when(jwt.getClaim(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID)).thenReturn(List.of("1", "2"));
 
-			var result = service.getOrganisationseinheitId(claims);
+			var result = service.getOrganisationsEinheitIds(jwt);
 
-			assertThat(result).contains("1").contains("2");
+			assertThat(result).containsExactly("1", "2");
 		}
 
 		@Test
 		void shouldReturnOrgaIdAsString() {
-			var result = service.getOrganisationseinheitId(Map.of(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID, List.of("1", 2)));
+			when(jwt.getClaim(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID)).thenReturn(List.of("1", 2));
+
+			var result = service.getOrganisationsEinheitIds(jwt);
 
-			assertThat(result).contains("1").contains("2");
+			assertThat(result).containsExactly("1", "2");
 		}
 
 		@Test
 		void shouldReturnEmptyList() {
-			Map<String, Object> claims = Map.of(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID, Collections.emptyList());
+			when(jwt.getClaim(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID)).thenReturn(Collections.emptyList());
 
-			var result = service.getOrganisationseinheitId(claims);
+			var result = service.getOrganisationsEinheitIds(jwt);
 
 			assertThat(result).isEmpty();
 		}
 
 		@Test
 		void shouldReturnEmptyListIfNotExists() {
-			var result = service.getOrganisationseinheitId(Collections.emptyMap());
+			var result = service.getOrganisationsEinheitIds(null);
 
 			assertThat(result).isEmpty();
 		}
@@ -80,6 +89,7 @@ class CurrentUserServiceTest {
 
 	@Nested
 	class TestGetUserId {
+
 		@Test
 		void shouldReturnValueFromClaim() {
 			doReturn(Optional.of(UserProfileTestFactory.ID.toString())).when(service).getSingleClaimValue(any());
@@ -90,31 +100,43 @@ class CurrentUserServiceTest {
 		}
 	}
 
+	@DisplayName("Get single claim value")
 	@Nested
 	class TestGetSingleClaimValue {
 
-		private static final String ATTRIBUTE_NAME = "userId";
-		private static final String ATTRIBUTE_VALUE = "deadbeef";
+		@DisplayName("on existing claim")
+		@Nested
+		class TestOnExistingClaim {
 
-		@Test
-		void shouldReturnUserAttribute() {
-			var token = new AccessToken();
-			token.setOtherClaims(ATTRIBUTE_NAME, ATTRIBUTE_VALUE);
-			doReturn(Optional.of(token)).when(service).getCurrentSecurityToken();
+			private static final String ATTRIBUTE_NAME = "userId";
+			private static final String ATTRIBUTE_VALUE = "deadbeef";
+			private static final Map<String, Object> CLAIMS = Map.of(ATTRIBUTE_NAME, ATTRIBUTE_VALUE);
 
-			var attribute = service.getSingleClaimValue(ATTRIBUTE_NAME);
+			@Test
+			void shouldReturnUserAttribute() {
+				doReturn(Optional.of(JwtTestFactory.create(CLAIMS))).when(service).getCurrentSecurityToken();
 
-			assertThat(attribute).isPresent().hasValue(ATTRIBUTE_VALUE);
+				var attribute = service.getSingleClaimValue(ATTRIBUTE_NAME);
+
+				assertThat(attribute).isPresent().hasValue(ATTRIBUTE_VALUE);
+			}
 		}
 
-		@Test
-		void shouldReturnEmpty() {
-			var token = new AccessToken();
-			doReturn(Optional.of(token)).when(service).getCurrentSecurityToken();
+		@DisplayName("on missing claim")
+		@Nested
+		class TestOnMissingClaim {
+
+			private static final String ATTRIBUTE_NAME = "non_existing_claim";
+			private static final Map<String, Object> CLAIMS = Collections.<String, Object>singletonMap("dummyClaim", "DummyClaimValue");
+
+			@Test
+			void shouldReturnEmpty() {
+				doReturn(Optional.of(JwtTestFactory.create(CLAIMS))).when(service).getCurrentSecurityToken();
 
-			var attribute = service.getSingleClaimValue(ATTRIBUTE_NAME);
+				var attribute = service.getSingleClaimValue(ATTRIBUTE_NAME);
 
-			assertThat(attribute).isEmpty();
+				assertThat(attribute).isEmpty();
+			}
 		}
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarCommandITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarCommandITCase.java
index deff95fefd19822253e20a1cd819b4bb594af93d..426a7478778d7515642180f96a63bfcbd775db45 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarCommandITCase.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarCommandITCase.java
@@ -26,6 +26,7 @@ package de.ozgcloud.alfa.kommentar;
 import static de.ozgcloud.alfa.kommentar.KommentarCommandTestFactory.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 
@@ -129,9 +130,10 @@ class KommentarCommandITCase {
 		}
 
 		private ResultActions doRequestByKommentarId(String content) throws Exception {
-			return mockMvc.perform(post(KommentarCommandController.KOMMENTAR_COMMANDS, KommentarTestFactory.ID, KommentarTestFactory.VERSION)
-					.contentType(MediaType.APPLICATION_JSON)
-					.content(content));
+			return mockMvc
+					.perform(post(KommentarCommandController.KOMMENTAR_COMMANDS, KommentarTestFactory.ID, KommentarTestFactory.VERSION).with(csrf())
+							.contentType(MediaType.APPLICATION_JSON)
+							.content(content));
 		}
 	}
 
@@ -145,7 +147,7 @@ class KommentarCommandITCase {
 		void initTest() {
 			when(remoteService.getById(any())).thenReturn(KommentarTestFactory.create());
 			when(commandRemoteService.createCommand(any())).thenReturn(CommandTestFactory.create());
-			
+
 			doReturn(UserProfileTestFactory.ID).when(userService).getUserId();
 		}
 
@@ -201,7 +203,7 @@ class KommentarCommandITCase {
 
 		private ResultActions doRequestByVorgangId(String content) throws Exception {
 			return mockMvc.perform(post(KommentarCommandByVorgangController.KOMMENTAR_COMMANDS_BY_VORGANG, VorgangHeaderTestFactory.ID,
-					RELATION_ID_ON_CREATE)
+					RELATION_ID_ON_CREATE).with(csrf())
 							.contentType(MediaType.APPLICATION_JSON)
 							.content(content));
 		}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandControllerITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandControllerITCase.java
index 4ab04b7ef7a132ff4be843f5a8dacf7291e3ebbf..ad33e02b65e595b745d94a65b9f1ede29f7449fe 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandControllerITCase.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandControllerITCase.java
@@ -2,6 +2,7 @@ package de.ozgcloud.alfa.loeschanforderung;
 
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 
@@ -124,6 +125,7 @@ class LoeschAnforderungCommandControllerITCase {
 				commandOrder.name());
 
 		return mockMvc.perform(post(LoeschAnforderungCommandController.BASE_PATH, LoeschAnforderungTestFactory.ID)
+				.with(csrf())
 				.content(requestBody).contentType(MediaType.APPLICATION_JSON).characterEncoding(StandardCharsets.UTF_8.name()));
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceITCase.java
index 6788d51ca049d5cbf99a15cfcc6c3670f0857ce1..74d9ef6eda8bc319a8fd7dabdfad2065bbb0d109 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceITCase.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceITCase.java
@@ -30,6 +30,8 @@ import static org.mockito.Mockito.*;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.OutputStream;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Stream;
@@ -45,6 +47,7 @@ import org.springframework.boot.test.mock.mockito.MockBean;
 import de.ozgcloud.alfa.common.user.UserId;
 import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
 import de.ozgcloud.alfa.common.user.UserService;
+import de.ozgcloud.alfa.vorgang.AntragstellerTestFactory;
 import de.ozgcloud.alfa.vorgang.EingangTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
@@ -118,6 +121,21 @@ class PostfachNachrichtPdfServiceITCase {
 		}
 	}
 
+	@DisplayName("Map Postfach-Nachricht")
+	@Nested
+	class TestMapPostfachNachricht {
+
+		private final ZonedDateTime createdAt = ZonedDateTime.of(2023, 9, 25, 10, 0, 0, 0, ZoneId.of("UTC"));
+		private final PostfachNachrichtPdfData pdfData = PostfachNachrichtPdfDataTestFactory.createBuilder().createdAt(createdAt).build();
+
+		@Test
+		void shouldMapCreatedAtWithCorrectTimezoneAndFormatting() {
+			var nachricht = service.mapPostfachNachricht(pdfData, AntragstellerTestFactory.create());
+
+			assertThat(nachricht.getCreatedAt()).isEqualTo("25.09.2023 12:00:00 MESZ");
+		}
+	}
+
 	private VorgangWithEingang buildVorgangAntragstellerNotSet() {
 		return VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build()).build();
 	}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceTest.java
index 454c45619a589c2481f4ea86688ef005cbd3d83a..e470d8adc1fdde352d4baaf6e11e2a7bec5ed3b5 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceTest.java
@@ -30,7 +30,6 @@ import static org.mockito.Mockito.*;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.time.ZonedDateTime;
 import java.util.stream.Stream;
 
 import org.apache.commons.lang3.StringUtils;
@@ -46,6 +45,7 @@ import org.springframework.test.util.ReflectionTestUtils;
 
 import de.itvsh.kop.common.errorhandling.TechnicalException;
 import de.itvsh.kop.common.pdf.PdfService;
+import de.ozgcloud.alfa.common.GermanDateTimeFormatter;
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileTestFactory;
 import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
 import de.ozgcloud.alfa.postfach.PostfachMail.Direction;
@@ -62,6 +62,8 @@ class PostfachNachrichtPdfServiceTest {
 	private PostfachNachrichtPdfService service;
 	@Mock
 	private PdfService pdfService;
+	@Mock
+	private GermanDateTimeFormatter germanDateTimeFormatter;
 
 	@DisplayName("Get all as pdf")
 	@Nested
@@ -239,17 +241,19 @@ class PostfachNachrichtPdfServiceTest {
 
 				@Test
 				void shouldMapNachrichtCreatedAt() {
+					var expected = "formatted date";
+					when(germanDateTimeFormatter.formatZonedDateTime(PostfachMailTestFactory.CREATED_AT)).thenReturn(expected);
+
 					var nachricht = mapNachricht();
 
-					assertThat(nachricht.getCreatedAt()).isEqualTo("01.01.2000 01:00:00 GMT");
+					assertThat(nachricht.getCreatedAt()).isEqualTo(expected);
 				}
 
 				@Test
-				void shouldFormatTimeIn24hFormat() {
-					var pdfNachricht = mapNachricht(
-							PostfachNachrichtPdfDataTestFactory.createBuilder().createdAt(ZonedDateTime.parse("2019-12-31T13:00:00Z")).build());
+				void shouldCallDateFormatter() {
+					mapNachricht();
 
-					assertThat(pdfNachricht.getCreatedAt()).isEqualTo("31.12.2019 13:00:00 GMT");
+					verify(germanDateTimeFormatter).formatZonedDateTime(PostfachMailTestFactory.CREATED_AT);
 				}
 
 				@Test
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderMapperTest.java
index a046aa542c3610d65ecd1cf7b27121e5f078e5d6..343dcaf5ce9b50d92c72d67721a6d465aae719ee 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderMapperTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderMapperTest.java
@@ -50,6 +50,13 @@ class EingangHeaderMapperTest {
 			assertThat(eingang.getRequestId()).isEqualTo(GrpcEingangHeaderTestFactory.REQUEST_ID);
 		}
 
+		@Test
+		void shouldMapFormEngineName() {
+			var eingang = callMapper();
+
+			assertThat(eingang.getFormEngineName()).isEqualTo(GrpcEingangHeaderTestFactory.FORM_ENGINE_NAME);
+		}
+
 		private EingangHeader callMapper() {
 			return mapper.toEingangHeader(GrpcEingangHeaderTestFactory.create());
 		}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderTestFactory.java
index 0ddbf2ebebda91c5f0ecc570d4ebf90084c953ba..12e4e885ceaaedd594d36bdbc5181e48bfe61fe6 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderTestFactory.java
@@ -29,12 +29,14 @@ public class EingangHeaderTestFactory {
 
 	public static final String CREATED_AT_STR = "2020-01-10T10:30:00Z";
 	public static final ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR);
+	public static final String FORM_ENGINE_NAME = "AFM";
+	public static final String FORM_ID = "test-form-id";
 
 	public static EingangHeader create() {
 		return createBuilder().build();
 	}
 
 	public static EingangHeader.EingangHeaderBuilder createBuilder() {
-		return EingangHeader.builder().createdAt(CREATED_AT);
+		return EingangHeader.builder().createdAt(CREATED_AT).formEngineName(FORM_ENGINE_NAME).formId(FORM_ID);
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcAntragstellerTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcAntragstellerTestFactory.java
index cf104ab5b8253e561da74e000b3f60f2131240a9..019daf75b2e632d7755af94667a76015a9bd2f0b 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcAntragstellerTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcAntragstellerTestFactory.java
@@ -36,7 +36,7 @@ public class GrpcAntragstellerTestFactory {
 	public final static String ANREDE = "HERR/FRAU";
 	public final static String NACHNAME = LoremIpsum.getInstance().getLastName();
 	public final static String VORNAME = LoremIpsum.getInstance().getFirstName();
-	public final static String GEBURTSDATUM_STR = "1995-03-21";
+	public final static String GEBURTSDATUM_STR = "21.03.1995";
 	public final static String GEBURTSORT = LoremIpsum.getInstance().getCountry();
 	public final static String GEBURTSNAME = LoremIpsum.getInstance().getFirstName();
 	public final static String EMAIL = LoremIpsum.getInstance().getEmail();
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcEingangHeaderTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcEingangHeaderTestFactory.java
index ffb62f0b4e0b5465c7c45bf8dc1223d297e03386..3f19726f0c68a31b94efe606aff29d9d08c6bad6 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcEingangHeaderTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcEingangHeaderTestFactory.java
@@ -42,6 +42,7 @@ public class GrpcEingangHeaderTestFactory {
 	private final static String CUSTOMER_ID = UUID.randomUUID().toString();
 	private final static String CLIENT = LoremIpsum.getInstance().getName();
 	private final static String CLIENT_ID = UUID.randomUUID().toString();
+	public final static String FORM_ENGINE_NAME = "AFM";
 
 	public static GrpcEingangHeader create() {
 		return createBuilder().build();
@@ -57,6 +58,7 @@ public class GrpcEingangHeaderTestFactory {
 				.setCustomer(CUSTOMER)
 				.setCustomerId(CUSTOMER_ID)
 				.setClient(CLIENT)
-				.setClientId(CLIENT_ID);
+				.setClientId(CLIENT_ID)
+				.setFormEngineName(FORM_ENGINE_NAME);
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerITCase.java
index 473a8024ca56fb58511cc4ba6687a52144144332..73ec41f37345ef2368d37163b748d3efbfaf0e1d 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerITCase.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerITCase.java
@@ -25,6 +25,7 @@ package de.ozgcloud.alfa.vorgang;
 
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 
@@ -52,6 +53,7 @@ import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemTestFactory;
 import de.ozgcloud.alfa.common.clientattribute.ClientAttributeService;
 import de.ozgcloud.alfa.common.command.CommandController;
 import de.ozgcloud.alfa.common.errorhandling.ResourceNotFoundException;
+import de.ozgcloud.alfa.common.user.CurrentUserService;
 import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
 import de.ozgcloud.alfa.common.user.UserService;
 import de.ozgcloud.alfa.postfach.PostfachMailController;
@@ -81,29 +83,23 @@ class VorgangControllerITCase {
 	@MockBean
 	private VorgangAttachedItemService vorgangAttachedItemService;
 
-	@Autowired
-	private MockMvc mockMvc;
-
+	@MockBean
+	private CurrentUserService currentUserService;
 	@MockBean
 	private UserService userService;
 
-	@BeforeEach
-	void prepareUserService() {
-		when(userService.getInternalId(any())).thenReturn(Optional.of(UserProfileTestFactory.INTERNAL_ID));
-	}
+	@Autowired
+	private MockMvc mockMvc;
 
 	@BeforeEach
-	void prepareStatisticController() {
+	void mock() {
+		when(currentUserService.getUser()).thenReturn(UserProfileTestFactory.create());
+		when(userService.getInternalId(any())).thenReturn(Optional.of(UserProfileTestFactory.INTERNAL_ID));
 		when(statisticController.getVorgaengeStatistic()).thenReturn(StatisticTestFactory.create());
-	}
-
-	@BeforeEach
-	void prepareVorgangAttachedItemService() {
 		when(vorgangAttachedItemService.findLoeschAnforderung(anyString())).thenReturn(Stream.of(VorgangAttachedItemTestFactory.create()));
 	}
 
 	@DisplayName("Vorganglist by page and limit")
-	@WithMockUser
 	@Nested
 	class TestVorgangListByPage {
 
@@ -119,12 +115,16 @@ class VorgangControllerITCase {
 
 		@Test
 		void shouldReturnResult() throws Exception {
-			doRequest().andExpect(jsonPath("$._embedded.vorgangHeaderList[0].nextFrist").value(WiedervorlageTestFactory.FRIST_STR));
+			var response = doRequest();
+
+			response.andExpect(jsonPath("$._embedded.vorgangHeaderList[0].nextFrist").value(WiedervorlageTestFactory.FRIST_STR));
 		}
 
 		@Test
 		void shouldReturnStatusOk() throws Exception {
-			doRequest().andExpect(status().isOk());
+			var response = doRequest();
+
+			response.andExpect(status().isOk());
 		}
 
 		private ResultActions doRequest() throws Exception {
@@ -143,43 +143,56 @@ class VorgangControllerITCase {
 
 				@Test
 				void shouldContainsNeu() throws Exception {
-					doRequest().andExpect(jsonPath(BY_STATUS_PATH + "neu").value(ByStatusTestFactory.NEU_COUNT));
+					var response = doRequest();
+
+					response.andExpect(jsonPath(BY_STATUS_PATH + "neu").value(ByStatusTestFactory.NEU_COUNT));
 				}
 
 				@Test
 				void shouldContainsAngenommen() throws Exception {
-					doRequest().andExpect(jsonPath(BY_STATUS_PATH + "angenommen").value(ByStatusTestFactory.ANGENOMMEN_COUNT));
+					var response = doRequest();
+
+					response.andExpect(jsonPath(BY_STATUS_PATH + "angenommen").value(ByStatusTestFactory.ANGENOMMEN_COUNT));
 				}
 
 				@Test
 				void shouldContainsInBearbeitung() throws Exception {
-					doRequest().andExpect(jsonPath(BY_STATUS_PATH + "inBearbeitung").value(ByStatusTestFactory.IN_BEARBEITUNG_COUNT));
+					var response = doRequest();
+
+					response.andExpect(jsonPath(BY_STATUS_PATH + "inBearbeitung").value(ByStatusTestFactory.IN_BEARBEITUNG_COUNT));
 				}
 
 				@Test
 				void shouldContainsBeschieden() throws Exception {
-					doRequest().andExpect(jsonPath(BY_STATUS_PATH + "beschieden").value(ByStatusTestFactory.BESCHIEDEN_COUNT));
+					var response = doRequest();
+
+					response.andExpect(jsonPath(BY_STATUS_PATH + "beschieden").value(ByStatusTestFactory.BESCHIEDEN_COUNT));
 				}
 
 				@Test
 				void shouldContainsAbgeschlossen() throws Exception {
-					doRequest().andExpect(jsonPath(BY_STATUS_PATH + "abgeschlossen").value(ByStatusTestFactory.ABGESCHLOSSEN_COUNT));
+					var response = doRequest();
+
+					response.andExpect(jsonPath(BY_STATUS_PATH + "abgeschlossen").value(ByStatusTestFactory.ABGESCHLOSSEN_COUNT));
 				}
 
 				@Test
 				void shouldContainsVerworfen() throws Exception {
-					doRequest().andExpect(jsonPath(BY_STATUS_PATH + "verworfen").value(ByStatusTestFactory.VERWORFEN_COUNT));
+					var response = doRequest();
+
+					response.andExpect(jsonPath(BY_STATUS_PATH + "verworfen").value(ByStatusTestFactory.VERWORFEN_COUNT));
 				}
 			}
 
 			@Test
 			void shouldContainsWiedervorlagen() throws Exception {
-				doRequest().andExpect(jsonPath("$.statistic.wiedervorlagen").value(StatisticTestFactory.COUNT_WIEDERVORLAGEN));
+				var response = doRequest();
+
+				response.andExpect(jsonPath("$.statistic.wiedervorlagen").value(StatisticTestFactory.COUNT_WIEDERVORLAGEN));
 			}
 		}
 	}
 
-	@WithMockUser
 	@Nested
 	class TestGetSingleVorgang {
 
@@ -189,26 +202,31 @@ class VorgangControllerITCase {
 		void shouldReturnNotFound() throws Exception {
 			when(remoteService.findVorgangWithEingang(anyString(), any())).thenThrow(new ResourceNotFoundException(Vorgang.class, StringUtils.EMPTY));
 
-			doRequest().andExpect(status().isNotFound());
+			var response = doRequest();
+
+			response.andExpect(status().isNotFound());
 		}
 
 		@Test
 		void shouldFormatDateTime() throws Exception {
 			when(remoteService.findVorgangWithEingang(anyString(), any())).thenReturn(VorgangWithEingangTestFactory.create());
 
-			doRequest().andExpect(status().isOk()).andExpect(jsonPath("$.createdAt").value(VorgangHeaderTestFactory.CREATED_AT_STR));
+			var response = doRequest();
+
+			response.andExpect(status().isOk()).andExpect(jsonPath("$.createdAt").value(VorgangHeaderTestFactory.CREATED_AT_STR));
 		}
 
 		@Test
 		void shouldHaveAnnehmenLink() throws Exception {
 			when(remoteService.findVorgangWithEingang(anyString(), any())).thenReturn(VorgangWithEingangTestFactory.create());
 
-			doRequest().andExpect(jsonPath("$._links.annehmen.href")
+			var response = doRequest();
+
+			response.andExpect(jsonPath("$._links.annehmen.href")
 					.value("http://localhost/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/relations/" + VorgangHeaderTestFactory.ID + "/"
 							+ VorgangHeaderTestFactory.VERSION + "/commands"));
 		}
 
-		@WithMockUser
 		@Nested
 		class TestLinkToAssignedUser {
 
@@ -216,7 +234,9 @@ class VorgangControllerITCase {
 			void shouldReturnStatusOk() throws Exception {
 				when(remoteService.findVorgangWithEingang(anyString(), any())).thenReturn(VorgangWithEingangTestFactory.create());
 
-				doRequest().andExpect(status().is2xxSuccessful());
+				var response = doRequest();
+
+				response.andExpect(status().is2xxSuccessful());
 			}
 
 			// FIXME
@@ -224,9 +244,10 @@ class VorgangControllerITCase {
 			void shouldBePresentIfAssigned() throws Exception {
 				when(remoteService.findVorgangWithEingang(anyString(), any())).thenReturn(VorgangWithEingangTestFactory.create());
 
-				doRequest()
-						.andExpect(jsonPath("$._links.assignedTo.href")
-								.value(StringEndsWith.endsWith("/api/userProfiles/" + UserProfileTestFactory.ID)));
+				var response = doRequest();
+
+				response.andExpect(jsonPath("$._links.assignedTo.href")
+						.value(StringEndsWith.endsWith("/api/userProfiles/" + UserProfileTestFactory.ID)));
 			}
 
 			@Test
@@ -234,33 +255,42 @@ class VorgangControllerITCase {
 				when(remoteService.findVorgangWithEingang(anyString(), any()))
 						.thenReturn(VorgangWithEingangTestFactory.createBuilder().assignedTo(null).build());
 
-				doRequest().andExpect(jsonPath("$._links.assignedTo.href").doesNotExist());
+				var response = doRequest();
+
+				response.andExpect(jsonPath("$._links.assignedTo.href").doesNotExist());
 			}
 		}
 
 		private ResultActions doRequest() throws Exception {
-			return mockMvc.perform(get(PATH, VorgangHeaderTestFactory.ID));
+			return mockMvc.perform(get(PATH, VorgangHeaderTestFactory.ID).with(csrf()));
 		}
 	}
 
 	@Nested
 	class TestClientAttribute {
+
 		@Test
 		void shouldReturnNoContent() throws Exception {
-			mockMvc
-					.perform(put("http://localhost/api/vorgangs/{0}/hasNewPostfachNachricht", VorgangHeaderTestFactory.ID)
-							.contentType(MediaType.APPLICATION_JSON)
-							.content("{\"hasNewPostfachNachricht\":false}"))
-					.andExpect(status().isNoContent());
+			var content = VorgangHeaderTestFactory.createHasNewPostfachNachrichtContent(false);
+
+			var response = doRequest(content);
+
+			response.andExpect(status().isNoContent());
 		}
 
 		@Test
 		void shouldReturnUnprocessableEntity() throws Exception {
-			mockMvc
-					.perform(put("http://localhost/api/vorgangs/{0}/hasNewPostfachNachricht", VorgangHeaderTestFactory.ID)
-							.contentType(MediaType.APPLICATION_JSON)
-							.content("{\"hasNewPostfachNachricht\":true}"))
-					.andExpect(status().isUnprocessableEntity());
+			var content = VorgangHeaderTestFactory.createHasNewPostfachNachrichtContent(true);
+
+			var response = doRequest(content);
+
+			response.andExpect(status().isUnprocessableEntity());
+		}
+
+		private ResultActions doRequest(String content) throws Exception {
+			return mockMvc.perform(put("/api/vorgangs/{0}/hasNewPostfachNachricht", VorgangHeaderTestFactory.ID).with(csrf())
+					.contentType(MediaType.APPLICATION_JSON)
+					.content(content));
 		}
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderTestFactory.java
index e60afed35c82377a91797c6bad99867691bff275..2eb1d65bc814907ccc77bbf9e645c64e69f9b005 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderTestFactory.java
@@ -28,6 +28,7 @@ import java.util.UUID;
 
 import com.thedeanda.lorem.LoremIpsum;
 
+import de.itvsh.kop.common.test.TestUtils;
 import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
 import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
 
@@ -57,4 +58,8 @@ public class VorgangHeaderTestFactory {
 				.createdAt(CREATED_AT)
 				.assignedTo(UserProfileTestFactory.ID);
 	}
+
+	public static String createHasNewPostfachNachrichtContent(boolean hasNewPostfachNachricht) {
+		return TestUtils.loadTextFile("jsonTemplates/command/hasNewPostfachNachricht.json.tmpl", String.valueOf(hasNewPostfachNachricht));
+	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangPropertyTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangPropertyTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..4886c79aceafd2b31cfc686644538322b85d50c7
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangPropertyTestFactory.java
@@ -0,0 +1,17 @@
+package de.ozgcloud.alfa.vorgang;
+
+import de.ozgcloud.alfa.vorgang.VorgangProperties.VorgangProperty;
+
+public class VorgangPropertyTestFactory {
+
+	public static VorgangProperty create() {
+		return createBuilder().build();
+	}
+
+	public static VorgangProperty.VorgangPropertyBuilder createBuilder() {
+		return VorgangProperty.builder()
+				.formEngineName(EingangHeaderTestFactory.FORM_ENGINE_NAME)
+				.formId(EingangHeaderTestFactory.FORM_ID);
+	}
+
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessorTest.java
index 39d5c24c9007f0bed116a63adf55717c23c403b9..4f8a572126d5ed91c75b0a2662e7a285e8183030 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessorTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessorTest.java
@@ -27,6 +27,9 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.util.Collections;
+import java.util.List;
+
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
@@ -35,11 +38,13 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.EnumSource;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.Spy;
 import org.springframework.hateoas.EntityModel;
 import org.springframework.hateoas.Link;
 import org.springframework.hateoas.LinkRelation;
 import org.springframework.web.util.UriComponentsBuilder;
 
+import de.ozgcloud.alfa.common.FeatureToggleProperties;
 import de.ozgcloud.alfa.common.ModelBuilder;
 import de.ozgcloud.alfa.common.ModelBuilderFactory;
 import de.ozgcloud.alfa.common.user.CurrentUserService;
@@ -50,6 +55,7 @@ import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
 
 class VorgangWithEingangProzessorTest {
 
+	@Spy
 	@InjectMocks
 	private VorgangWithEingangProzessor processor;
 	@Mock
@@ -60,6 +66,10 @@ class VorgangWithEingangProzessorTest {
 	private ModelBuilderFactory<EntityModel<VorgangWithEingang>> modelBuilderFactory;
 	@Mock
 	private UserManagerUrlProvider userManagerUrlProvider;
+	@Mock
+	private FeatureToggleProperties featureToggleProperties;
+	@Mock
+	private VorgangProperties vorgangProperties;
 
 	private final String userManagerUrlTemplate = "UserManagerUrlTemplate/%s";
 
@@ -278,4 +288,213 @@ class VorgangWithEingangProzessorTest {
 			return VorgangWithEingangTestFactory.createBuilder().eingang(eingang).build();
 		}
 	}
+
+	@Nested
+	class TestHasVorgangCreateBescheidEnabled {
+
+		@Nested
+		class TestOnEmptyBescheidProperties {
+
+			@BeforeEach
+			void setUp() {
+				when(vorgangProperties.getBescheid()).thenReturn(Collections.emptyList());
+			}
+
+			@Test
+			void shouldReturnFalse() {
+				var hasEnabled = callProcessor(VorgangWithEingangTestFactory.create());
+
+				assertThat(hasEnabled).isFalse();
+			}
+
+		}
+
+		@Nested
+		class TestOnBescheidPropertiesSet {
+
+			@BeforeEach
+			void setUp() {
+				when(vorgangProperties.getBescheid()).thenReturn(List.of(VorgangPropertyTestFactory.create()));
+			}
+
+			@Test
+			void shouldReturnFalseIfFormEngineNameNotEquals() {
+				var vorgang = createVorgang(EingangTestFactory.createBuilder()
+						.header(EingangHeaderTestFactory.createBuilder()
+								.formEngineName("different").build())
+						.build());
+
+				var hasEnabled = callProcessor(vorgang);
+
+				assertThat(hasEnabled).isFalse();
+			}
+
+			@Test
+			void shouldReturnTrue() {
+				var hasEnabled = callProcessor(VorgangWithEingangTestFactory.create());
+
+				assertThat(hasEnabled).isTrue();
+			}
+		}
+
+		@Test
+		void shouldReturnFalseOnEmptyEingang() {
+			var vorgangWithEmptyEingang = createVorgang(null);
+
+			var hasEnabled = callProcessor(vorgangWithEmptyEingang);
+
+			assertThat(hasEnabled).isFalse();
+		}
+
+		@Test
+		void shouldReturnFalseOnEmptyEingangHeader() {
+			var vorgangWithEmptyEingangHeader = EingangTestFactory.createBuilder().header(null).build();
+
+			var hasEnabled = callProcessor(createVorgang(vorgangWithEmptyEingangHeader));
+
+			assertThat(hasEnabled).isFalse();
+		}
+
+		@Test
+		void shouldReturnFalseOnEmptyFormEngineName() {
+			var vorgangWithEmptyFormEngineName = createVorgang(
+					EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder().formEngineName(null).build()).build());
+
+			var hasEnabled = callProcessor(vorgangWithEmptyFormEngineName);
+
+			assertThat(hasEnabled).isFalse();
+		}
+
+		@Test
+		void shouldReturnFalseOnEmptyFormId() {
+			var vorgangWithEmptyFormId = createVorgang(
+					EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder().formId(null).build()).build());
+
+			var hasEnabled = callProcessor(vorgangWithEmptyFormId);
+
+			assertThat(hasEnabled).isFalse();
+		}
+
+		private boolean callProcessor(VorgangWithEingang vorgang) {
+			return processor.hasVorgangCreateBescheidEnabled(vorgang);
+		}
+
+		private VorgangWithEingang createVorgang(Eingang eingang) {
+			return VorgangWithEingangTestFactory.createBuilder().eingang(eingang).build();
+		}
+
+	}
+
+	@Nested
+	class TestIsCreateBescheidEnabled {
+
+		@Nested
+		class TestFeatureToggleDisabled {
+
+			@BeforeEach
+			void setUp() {
+				when(featureToggleProperties.isCreateBescheid()).thenReturn(false);
+			}
+
+			@Test
+			void shouldCallFeatureToggleProperties() {
+				callProcessor(VorgangWithEingangTestFactory.create());
+
+				verify(featureToggleProperties).isCreateBescheid();
+			}
+
+			@Test
+			void shouldNotCallHasVorgangCreateBescheidEnabled() {
+				var vorgang = VorgangWithEingangTestFactory.create();
+
+				callProcessor(vorgang);
+
+				verify(processor, never()).hasVorgangCreateBescheidEnabled(vorgang);
+			}
+
+			@Test
+			void shouldReturnFalse() {
+				var isEnabled = callProcessor(VorgangWithEingangTestFactory.create());
+
+				assertThat(isEnabled).isFalse();
+			}
+		}
+
+		@Nested
+		class TestFeatureToggleEnabled {
+
+			private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
+			@BeforeEach
+			void setUp() {
+				when(featureToggleProperties.isCreateBescheid()).thenReturn(true);
+			}
+
+			@Test
+			void shouldCallFeatureToggleProperties() {
+				callProcessor(vorgang);
+
+				verify(featureToggleProperties).isCreateBescheid();
+			}
+
+			@Test
+			void shouldCallHasVorgangCreateBescheidEnabled() {
+				callProcessor(vorgang);
+
+				verify(processor).hasVorgangCreateBescheidEnabled(vorgang);
+			}
+
+			@Test
+			void shouldReturnTrue() {
+				doReturn(true).when(processor).hasVorgangCreateBescheidEnabled(vorgang);
+
+				var isEnabled = callProcessor(vorgang);
+
+				assertThat(isEnabled).isTrue();
+			}
+
+			@Test
+			void shouldReturnFalse() {
+				doReturn(false).when(processor).hasVorgangCreateBescheidEnabled(vorgang);
+
+				var isEnabled = callProcessor(vorgang);
+
+				assertThat(isEnabled).isFalse();
+			}
+		}
+
+		private boolean callProcessor(VorgangWithEingang vorgang) {
+			return processor.isCreateBescheidEnabled(vorgang);
+		}
+
+	}
+
+	@Nested
+	class TestCreateBescheidLink {
+
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+		private final EntityModel<VorgangWithEingang> vorgangEntityModel = EntityModel.of(vorgang);
+
+		@Test
+		void shouldHaveCreateBescheidLink() {
+			doReturn(true).when(processor).isCreateBescheidEnabled(vorgang);
+
+			var processed = processor.process(vorgangEntityModel);
+
+			assertThat(processed.getLink(VorgangWithEingangProzessor.REL_BESCHEID)).isPresent().get()
+					.extracting(Link::getHref)
+					.isEqualTo("/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/relations/" + VorgangHeaderTestFactory.ID + "/"
+							+ VorgangHeaderTestFactory.VERSION + "/commands");
+		}
+
+		@Test
+		void shouldHaveNoLinkIfDisabled() {
+			doReturn(false).when(processor).isCreateBescheidEnabled(vorgang);
+
+			var processed = processor.process(vorgangEntityModel);
+
+			assertThat(processed.getLink(VorgangWithEingangProzessor.REL_BESCHEID)).isEmpty();
+		}
+	}
+
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessorTest.java
index 05c47ac3c9b646deefa33bc01322ef722b5ceda9..c26d538bfd416f1cebaf9ea37d160ef27101138e 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessorTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessorTest.java
@@ -69,7 +69,6 @@ class VorgangWithEingangCommandProzessorTest {
 	private ForwardingController forwardingController;
 	@Mock
 	private ModelBuilderFactory<EntityModel<VorgangWithEingang>> modelBuilderFactory;
-
 	@Mock
 	private FeatureToggleProperties featureToggle;
 
@@ -235,36 +234,5 @@ class VorgangWithEingangCommandProzessorTest {
 				.thenAnswer(
 						vorgangWithEingang -> ModelBuilder.fromModel(vorgangWithEingang.getArgument(0))
 								.withUserManagerUrl(userManagerUrlTemplate));
-
-	}
-
-	@Nested
-	class TestCreateBescheidLink {
-
-		@BeforeEach
-		void activateFeature() {
-			when(featureToggle.isCreateBescheid()).thenReturn(true);
-
-			mockModelBuilderFactory();
-		}
-
-		@Test
-		void shouldHaveCreateBescheidLink() {
-			var processed = processor.process(vorgangEntityModel);
-
-			assertThat(processed.getLink(VorgangWithEingangCommandProzessor.REL_BESCHEID)).isPresent().get()
-					.extracting(Link::getHref)
-					.isEqualTo("/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/relations/" + VorgangHeaderTestFactory.ID + "/"
-							+ VorgangHeaderTestFactory.VERSION + "/commands");
-		}
-
-		@Test
-		void shouldHaveNoLinkIfDisabled() {
-			when(featureToggle.isCreateBescheid()).thenReturn(false);
-
-			var processed = processor.process(vorgangEntityModel);
-
-			assertThat(processed.getLink(VorgangWithEingangCommandProzessor.REL_BESCHEID)).isEmpty();
-		}
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidatorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidatorTest.java
index 1899552eb91bc8feb8b42996b09aacec84dbfa0b..1a5a0a2227b498f3c2360fcacaae5af12f7ac7f3 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidatorTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidatorTest.java
@@ -27,8 +27,8 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import javax.validation.ConstraintValidatorContext;
-import javax.validation.ConstraintValidatorContext.ConstraintViolationBuilder;
+import jakarta.validation.ConstraintValidatorContext;
+import jakarta.validation.ConstraintValidatorContext.ConstraintViolationBuilder;
 
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandITCase.java
index b2948594597319e749674a7af63ece47d55d6ffc..c47e51a4d16204d0e660a16d8f93df57b612655c 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandITCase.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandITCase.java
@@ -26,12 +26,13 @@ package de.ozgcloud.alfa.wiedervorlage;
 import static de.ozgcloud.alfa.wiedervorlage.WiedervorlageCommandTestFactory.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 
 import java.time.LocalDate;
 
-import org.assertj.core.internal.bytebuddy.utility.RandomString;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
@@ -125,7 +126,7 @@ class WiedervorlageCommandITCase {
 			@DisplayName("for 41 character in Betreff")
 			@Test
 			void createCommandWithLongBetreff() throws Exception {
-				var content = buildContentWithBetreff(RandomString.make(41));
+				var content = buildContentWithBetreff(RandomStringUtils.random(41));
 
 				doRequest(content).andExpect(status().isUnprocessableEntity());
 			}
@@ -165,6 +166,7 @@ class WiedervorlageCommandITCase {
 		private ResultActions doRequest(String content) throws Exception {
 			return mockMvc.perform(
 					post(WiedervorlageCommandController.WIEDERVORLAGE_COMMANDS, WiedervorlageTestFactory.ID, WiedervorlageTestFactory.VERSION)
+							.with(csrf())
 							.contentType(MediaType.APPLICATION_JSON)
 							.content(content));
 		}
@@ -181,7 +183,7 @@ class WiedervorlageCommandITCase {
 		void initTest() {
 			when(commandRemoteService.createCommand(any())).thenReturn(CommandTestFactory.create());
 			when(wiedervorlageRemoteService.getById(anyString())).thenReturn(WiedervorlageTestFactory.create());
-			
+
 			doReturn(UserProfileTestFactory.ID).when(userService).getUserId();
 		}
 
@@ -229,7 +231,7 @@ class WiedervorlageCommandITCase {
 			@DisplayName("for 41 character in Betreff")
 			@Test
 			void createCommandWithLongBetreff() throws Exception {
-				var content = buildContentWithBetreff(RandomString.make(41));
+				var content = buildContentWithBetreff(RandomStringUtils.random(41));
 
 				doRequest(content).andExpect(status().isUnprocessableEntity());
 			}
@@ -267,8 +269,9 @@ class WiedervorlageCommandITCase {
 		private ResultActions doRequest(String content) throws Exception {
 			return mockMvc.perform(post(WiedervorlageCommandByVorgangController.WIEDERVORLAGE_COMMANDS_BY_VORGANG, VorgangHeaderTestFactory.ID,
 					RELATION_ID_ON_CREATE)
-							.contentType(MediaType.APPLICATION_JSON)
-							.content(content));
+					.with(csrf())
+					.contentType(MediaType.APPLICATION_JSON)
+					.content(content));
 		}
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/resources/application.yml b/alfa-service/src/test/resources/application.yml
index a46d7989678c79a6f2338deb269565b88e026824..90b792d47554dae05fae77dd26ed00e58bf90ed2 100644
--- a/alfa-service/src/test/resources/application.yml
+++ b/alfa-service/src/test/resources/application.yml
@@ -4,7 +4,19 @@ logging:
     '[de.itvsh]': INFO
     '[de.ozgcloud]': INFO,
     '[org.springframework.security]': WARN
-    '[org.keycloak.adapters]': WARN
+
+
+ozgcloud:
+   keycloak:
+      auth-server-url: https://sso.dev.by.ozg-cloud.de
+      realm: by-kiel-dev
+      resource: ${jwt.auth.converter.resource-id}
+      
+jwt:
+  auth:
+    converter:
+      resource-id: alfa
+      principle-attribute: preferred_username  
 
 spring:
   mvc:
@@ -19,7 +31,13 @@ spring:
     multipart:
       max-file-size: 2GB
       max-request-size: 2GB
-
+  security:
+    oauth2:
+      resourceserver:
+        jwt:
+          issuer-uri: ${ozgcloud.keycloak.auth-server-url}/realms/${ozgcloud.keycloak.realm}
+          jwk-set-uri: ${spring.security.oauth2.resourceserver.jwt.issuer-uri}/protocol/openid-connect/certs
+            
 server:
   http2:
     enabled: true
@@ -51,14 +69,7 @@ management:
 
 goofy:
   production: true
-
-keycloak:
-  auth-server-url: http://localhost:8088
-  realm: sh-kiel-dev
-  resource: sh-kiel-dev-goofy
-  public-client: true
-  use-resource-role-mappings: true
-
+    
 grpc:
   client:
     pluto:
@@ -71,7 +82,7 @@ grpc:
 kop:
   auth:
     token:
-      secret: XPPWagXn3rDwKG6Ywoir
+      secret: XPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6Ywoir
       validity: 60000
   upload:
     maxFileSize:
diff --git a/alfa-service/src/test/resources/jsonTemplates/command/hasNewPostfachNachricht.json.tmpl b/alfa-service/src/test/resources/jsonTemplates/command/hasNewPostfachNachricht.json.tmpl
new file mode 100644
index 0000000000000000000000000000000000000000..419bb5bcbb5a8951482425d305d39aa40a9dd9e0
--- /dev/null
+++ b/alfa-service/src/test/resources/jsonTemplates/command/hasNewPostfachNachricht.json.tmpl
@@ -0,0 +1,3 @@
+{
+	"hasNewPostfachNachricht": %s
+}
\ No newline at end of file
diff --git a/alfa-xdomea/pom.xml b/alfa-xdomea/pom.xml
index 5f3125ca788e8e8fed9fda3bf0a355e89c5b3b0e..a9cd7ff41b85e50447fadb03e0535b1adca8ae52 100644
--- a/alfa-xdomea/pom.xml
+++ b/alfa-xdomea/pom.xml
@@ -32,18 +32,18 @@
 	<parent>
 		<groupId>de.itvsh.ozg</groupId>
 		<artifactId>goofy</artifactId>
-		<version>1.15.0-SNAPSHOT</version>
+		<version>1.17.0-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>alfa-xdomea</artifactId>
-	<name>XDomea</name>
+	<name>Alfa XDomea</name>
+	<description>Alfa XDomea implementation</description>
 	<packaging>jar</packaging>
 
 	<properties>
 		<maven.compiler.source>${java.version}</maven.compiler.source>
 		<maven.compiler.target>${java.version}</maven.compiler.target>
-		<jaxb2-maven-plugin.version>2.5.0</jaxb2-maven-plugin.version>
-		
+		<jaxb2-maven-plugin.version>3.1.0</jaxb2-maven-plugin.version>
 	</properties>
 
 	<dependencies>
@@ -105,6 +105,25 @@
 					<skip>true</skip>
 				</configuration>
 			</plugin>
+			<plugin>
+				<groupId>org.jacoco</groupId>
+				<artifactId>jacoco-maven-plugin</artifactId>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-failsafe-plugin</artifactId>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+			</plugin>
 		</plugins>
 		<resources>
 			<resource>
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401Creator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401Creator.java
new file mode 100644
index 0000000000000000000000000000000000000000..5cd4aff65c9effe27e31907215043143e2123e5b
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401Creator.java
@@ -0,0 +1,26 @@
+package de.ozgcloud.alfa.export;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.xoev.xdomea.AbgabeAbgabe0401;
+
+@Component
+class AbgabeAbgabe0401Creator {
+
+	@Autowired
+	private SchriftgutobjektCreator schriftgutobjektCreator;
+
+	@Autowired
+	private AnwendungsspezifischeErweiterungTypeCreator anwendungsspezifischeErweiterungTypeCreator;
+
+	public AbgabeAbgabe0401 create(VorgangWithEingang vorgang) {
+		var erweiterung = anwendungsspezifischeErweiterungTypeCreator.create(vorgang);
+
+		var abgabe = new AbgabeAbgabe0401();
+		abgabe.getSchriftgutobjekt().add(schriftgutobjektCreator.create(vorgang, erweiterung));
+		return abgabe;
+	}
+
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapper.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapper.java
deleted file mode 100644
index d5ee46e846d26ad3e68a75b8c3f10363f0b3caa7..0000000000000000000000000000000000000000
--- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapper.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package de.ozgcloud.alfa.export;
-
-import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-import org.mapstruct.ReportingPolicy;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
-import de.xoev.xdomea.AnwendungsspezifischeErweiterungType;
-
-@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN)
-abstract class AnwendungsspezifischeErweiterungMapper {
-
-	@Autowired
-	FeldGruppeMapper feldGruppeMapper;
-
-	static final String KENNUNG = "IDOZGCloud1234567";
-	static final String NAME = "Anwendungsspezifische Erweiterung OZGCloud Basis";
-
-	@Mapping(target = "beschreibung", ignore = true)
-	@Mapping(target = "versionsdatum", ignore = true)
-	@Mapping(target = "versionsnummer", ignore = true)
-	@Mapping(target = "feld", ignore = true)
-	@Mapping(target = "kennung", constant = KENNUNG)
-	@Mapping(target = "name", constant = NAME)
-	@Mapping(target = "feldgruppe", expression = "java(List.of(feldGruppeMapper.map(vorgang)))")
-	abstract AnwendungsspezifischeErweiterungType map(VorgangWithEingang vorgang);
-}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..d981a15c7542d2ba1e5a46c4094d43bb8e7b9223
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreator.java
@@ -0,0 +1,27 @@
+package de.ozgcloud.alfa.export;
+
+import java.util.Collections;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.xoev.xdomea.AnwendungsspezifischeErweiterungType;
+
+@Component
+class AnwendungsspezifischeErweiterungTypeCreator {
+
+	static final String KENNUNG = "IDOZGCloud1234567";
+	static final String NAME = "Anwendungsspezifische Erweiterung OZGCloud Basis";
+
+	@Autowired
+	private FeldGruppeTypeCreator feldGruppeTypeCreator;
+
+	public AnwendungsspezifischeErweiterungType create(VorgangWithEingang vorgang) {
+		var anwendungsspezifischeErweiterung = new AnwendungsspezifischeErweiterungType();
+		anwendungsspezifischeErweiterung.setKennung(KENNUNG);
+		anwendungsspezifischeErweiterung.setName(NAME);
+		anwendungsspezifischeErweiterung.getFeldgruppe().addAll(Collections.singleton(feldGruppeTypeCreator.create(vorgang)));
+		return anwendungsspezifischeErweiterung;
+	}
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateConverter.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..b41173ea1bcc9246309dce3ca752d24dc4dbb715
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateConverter.java
@@ -0,0 +1,30 @@
+package de.ozgcloud.alfa.export;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+import java.util.Optional;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.springframework.stereotype.Component;
+
+import de.itvsh.kop.common.errorhandling.TechnicalException;
+
+@Component
+class DateConverter {
+
+	private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy", Locale.GERMAN);
+
+	public Optional<XMLGregorianCalendar> convertGermanFormatToISO(String dateStr) {
+		try {
+			return Optional.of(DatatypeFactory.newInstance().newXMLGregorianCalendar(LocalDate.parse(dateStr, DATE_TIME_FORMATTER).toString()));
+		} catch (DatatypeConfigurationException e) {
+			throw new TechnicalException(String.format("Error converting date %s to ISO.", dateStr), e);
+		} catch (Exception e) {
+			return Optional.empty();
+		}
+	}
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateiformatCode.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateiformatCode.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7f4b8f86717fb9646e9a32f8b1b28318297c278
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateiformatCode.java
@@ -0,0 +1,24 @@
+package de.ozgcloud.alfa.export;
+
+import de.xoev.xdomea.DateiformatCodeType;
+
+enum DateiformatCode {
+	PDF("vCBzR", "018");
+
+	static final String LIST_URI = "urn:xoev-de:xdomea:codeliste:dateiformat";
+	final String listVersionID;
+	final String code;
+
+	DateiformatCode(String listVersionID, String code) {
+		this.listVersionID = listVersionID;
+		this.code = code;
+	}
+
+	public DateiformatCodeType createDateiformatCodeType() {
+		var dateiformatCode = new DateiformatCodeType();
+		dateiformatCode.setCode(code);
+		dateiformatCode.setListURI(LIST_URI);
+		dateiformatCode.setListVersionID(listVersionID);
+		return dateiformatCode;
+	}
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DokumentTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DokumentTypeCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..a44e9a8383bdf6088410d5131356b11d739230f2
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DokumentTypeCreator.java
@@ -0,0 +1,74 @@
+package de.ozgcloud.alfa.export;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.vorgang.Eingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.xoev.xdomea.AllgemeineMetadatenType;
+import de.xoev.xdomea.DokumentType;
+import de.xoev.xdomea.IdentifikationObjektType;
+import de.xoev.xdomea.MediumCodeType;
+
+@Component
+class DokumentTypeCreator {
+
+	static final String ALLGEMEINE_METADATEN_MEDIUM_CODE = "001";
+
+	@Autowired
+	private ExportFileService exportFileService;
+
+	@Autowired
+	private UUIDConverter uuidConverter;
+
+	@Autowired
+	private VersionTypeCreator versionTypeCreator;
+
+	public Stream<DokumentType> create(VorgangWithEingang vorgang) {
+		var ozgFiles = Optional.ofNullable(vorgang.getEingang()).map(Eingang::getId).map(exportFileService::getAllPdfs).map(Stream::toList)
+				.orElse(Collections.emptyList());
+		List<DokumentType> dokumenten = new ArrayList<>(ozgFiles.size());
+		for (var i = 0; i < ozgFiles.size(); i++) {
+			dokumenten.add(createDokumentType(i + 1, vorgang, ozgFiles.get(i)));
+		}
+		return dokumenten.stream();
+	}
+
+	DokumentType createDokumentType(int dokumentOrdinalNumber, VorgangWithEingang vorgang, OzgFile ozgFile) {
+		var dokument = new DokumentType();
+		dokument.setIdentifikation(createIdentifikation(dokumentOrdinalNumber, ozgFile.getId().toString()));
+		dokument.setAllgemeineMetadaten(createAllgemeineMetadaten(ozgFile));
+		dokument.getVersion().add(versionTypeCreator.create(vorgang, ozgFile));
+		return dokument;
+	}
+
+	IdentifikationObjektType createIdentifikation(int dokumentOrdinalNumber, String fileId) {
+		var identifikation = new IdentifikationObjektType();
+		identifikation.setID(uuidConverter.fromObjectId(fileId));
+		identifikation.setNummerImUebergeordnetenContainer(Long.valueOf(dokumentOrdinalNumber));
+		return identifikation;
+	}
+
+	AllgemeineMetadatenType createAllgemeineMetadaten(OzgFile ozgFile) {
+		var allgemeineMetadaten = new AllgemeineMetadatenType();
+		allgemeineMetadaten.setBetreff(ozgFile.getName());
+		allgemeineMetadaten.setKennzeichen(StringUtils.EMPTY);
+		allgemeineMetadaten.setBemerkung(StringUtils.EMPTY);
+		allgemeineMetadaten.setMedium(createMediumCode());
+		return allgemeineMetadaten;
+	}
+
+	private MediumCodeType createMediumCode() {
+		var mediumCode = new MediumCodeType();
+		mediumCode.setCode(ALLGEMEINE_METADATEN_MEDIUM_CODE);
+		return mediumCode;
+	}
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportData.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportData.java
new file mode 100644
index 0000000000000000000000000000000000000000..c6e4888c0865072a025a6cf2ecf2729c408dd078
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportData.java
@@ -0,0 +1,22 @@
+package de.ozgcloud.alfa.export;
+
+import java.util.stream.Stream;
+
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@Getter
+class ExportData {
+
+	private VorgangWithEingang vorgang;
+	private String exportFilename;
+	private String xmlFileContent;
+	private Stream<OzgFile> exportFiles;
+
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFileService.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFileService.java
new file mode 100644
index 0000000000000000000000000000000000000000..31a4a322a44b9b086bd3cc29b27e4746e99446c5
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFileService.java
@@ -0,0 +1,37 @@
+package de.ozgcloud.alfa.export;
+
+import java.io.OutputStream;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+
+import de.ozgcloud.alfa.common.binaryfile.BinaryFileService;
+import de.ozgcloud.alfa.common.binaryfile.FileId;
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.file.OzgFileService;
+
+@Service
+class ExportFileService {
+
+	private static final Predicate<OzgFile> IS_PDF_FILE = file -> file.getContentType().equals(MediaType.APPLICATION_PDF_VALUE);
+
+	@Autowired
+	private OzgFileService ozgFileService;
+
+	@Autowired
+	private BinaryFileService binaryFileService;
+
+	public Stream<OzgFile> getAllPdfs(String eingangId) {
+		var representations = ozgFileService.getRepresentationsByEingang(eingangId);
+		var attachments = ozgFileService.getAttachmentsByEingang(eingangId);
+		return Stream.concat(representations, attachments).filter(IS_PDF_FILE);
+	}
+
+	public void writeOzgFile(FileId fileId, OutputStream outputStream) {
+		binaryFileService.writeFileContent(fileId, outputStream);
+	}
+
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFilenameGenerator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFilenameGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..13471e6d59b8ffd385aad5532c1c9bd982172c04
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFilenameGenerator.java
@@ -0,0 +1,17 @@
+package de.ozgcloud.alfa.export;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.common.file.OzgFile;
+
+@Component
+class ExportFilenameGenerator {
+
+	@Autowired
+	private UUIDConverter uuidConverter;
+
+	public String generateExportFilename(OzgFile ozgFile) {
+		return String.format("%s_%s", uuidConverter.fromObjectId(ozgFile.getId().toString()), ozgFile.getName());
+	}
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeMapper.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeMapper.java
deleted file mode 100644
index af8ec2274178f59b9d24397b25496830a6b17a12..0000000000000000000000000000000000000000
--- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeMapper.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package de.ozgcloud.alfa.export;
-
-import java.time.format.DateTimeFormatter;
-import java.util.List;
-
-import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-import org.mapstruct.ReportingPolicy;
-
-import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
-import de.xoev.xdomea.FeldType;
-import de.xoev.xdomea.FeldgruppeType;
-
-@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN)
-abstract class FeldGruppeMapper {
-
-	static final String NAME = "FeldgruppeOZGCloudBasis";
-	static final String BESCHREIBUNG = "Feldgruppe für OZGCloud Basis";
-
-	@Mapping(target = "unterfeldgruppe", ignore = true)
-	@Mapping(target = "name", constant = NAME)
-	@Mapping(target = "beschreibung", constant = BESCHREIBUNG)
-	@Mapping(target = "feld", expression = "java(mapToFelder(vorgang))")
-	abstract FeldgruppeType map(VorgangWithEingang vorgang);
-
-	List<FeldType> mapToFelder(VorgangWithEingang vorgang) {
-		return List.of(
-				ExportFelder.LEIKA_ID.createFeld(),
-				ExportFelder.DATUM_ANTRAGSEINGANG.createFeld(DateTimeFormatter.ISO_DATE_TIME.format(vorgang.getCreatedAt())),
-				ExportFelder.NAME.createFeld(vorgang.getEingang().getAntragsteller().getNachname()),
-				ExportFelder.VORNAME.createFeld(vorgang.getEingang().getAntragsteller().getVorname()),
-				ExportFelder.GEBURTSDATUM.createFeld(vorgang.getEingang().getAntragsteller().getGeburtsdatum()),
-				ExportFelder.PLZ.createFeld(vorgang.getEingang().getAntragsteller().getPlz()));
-	}
-
-}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..e47cc16c6db59f270bade24eb4389ab91190ba0e
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreator.java
@@ -0,0 +1,40 @@
+package de.ozgcloud.alfa.export;
+
+import static java.util.Optional.*;
+
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.xoev.xdomea.FeldType;
+import de.xoev.xdomea.FeldgruppeType;
+
+@Component
+class FeldGruppeTypeCreator {
+
+	static final String NAME = "FeldgruppeOZGCloudBasis";
+	static final String BESCHREIBUNG = "Feldgruppe für OZGCloud Basis";
+
+	public FeldgruppeType create(VorgangWithEingang vorgang) {
+		var feldgruppe = new FeldgruppeType();
+		feldgruppe.setName(NAME);
+		feldgruppe.setBeschreibung(BESCHREIBUNG);
+		feldgruppe.getFeld().addAll(createFeldType(vorgang));
+		return feldgruppe;
+	}
+
+	List<FeldType> createFeldType(VorgangWithEingang vorgang) {
+		var antragsteller = ofNullable(vorgang.getEingang()).flatMap(eingang -> ofNullable(eingang.getAntragsteller()));
+		return List.of(
+				ExportFelder.LEIKA_ID.createFeld(),
+				ExportFelder.DATUM_ANTRAGSEINGANG.createFeld(DateTimeFormatter.ISO_DATE_TIME.format(vorgang.getCreatedAt())),
+				ExportFelder.NAME.createFeld(antragsteller.flatMap(a -> ofNullable(a.getNachname())).orElse(StringUtils.EMPTY)),
+				ExportFelder.VORNAME.createFeld(antragsteller.flatMap(a -> ofNullable(a.getVorname())).orElse(StringUtils.EMPTY)),
+				ExportFelder.GEBURTSDATUM.createFeld(antragsteller.flatMap(a -> ofNullable(a.getGeburtsdatum())).orElse(StringUtils.EMPTY)),
+				ExportFelder.PLZ.createFeld(antragsteller.flatMap(a -> ofNullable(a.getPlz())).orElse(StringUtils.EMPTY)));
+	}
+
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FormatTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FormatTypeCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3d9deb3c1f34c36abc1824ab918ac8b12260d4e
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FormatTypeCreator.java
@@ -0,0 +1,25 @@
+package de.ozgcloud.alfa.export;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.xoev.xdomea.FormatType;
+
+@Component
+class FormatTypeCreator {
+
+	@Autowired
+	private PrimaerdokumentTypeCreator primaerdokumentTypeCreator;
+
+	public FormatType create(VorgangWithEingang vorgang, OzgFile ozgFile) {
+		var format = new FormatType();
+		format.setPrimaerdokument(primaerdokumentTypeCreator.create(vorgang, ozgFile));
+		format.setName(DateiformatCode.PDF.createDateiformatCodeType());
+		format.setSonstigerName(StringUtils.EMPTY);
+		format.setVersion(StringUtils.EMPTY);
+		return format;
+	}
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/KontaktTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/KontaktTypeCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f13079a7a8acba8763844ca936ee785c27ba62e
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/KontaktTypeCreator.java
@@ -0,0 +1,62 @@
+package de.ozgcloud.alfa.export;
+
+import java.util.Optional;
+import java.util.function.Predicate;
+
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.vorgang.Antragsteller;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.xoev.xdomea.GeburtType;
+import de.xoev.xdomea.KontaktType;
+
+@Component
+class KontaktTypeCreator {
+
+	private final Predicate<Antragsteller> HAS_VORNAME = antragsteller -> StringUtils.isNotBlank(antragsteller.getVorname());
+	private final Predicate<Antragsteller> HAS_NACHNAME = antragsteller -> StringUtils.isNotBlank(antragsteller.getNachname());
+	private final Predicate<Antragsteller> HAS_ANREDE = antragsteller -> StringUtils.isNotBlank(antragsteller.getAnrede());
+	private final Predicate<Antragsteller> HAS_VALID_GEBURTSDATUM = this::hasValidGeburtsdatum;
+
+	@Autowired
+	private NameNatuerlichePersonTypeCreator nameNatuerlichePersonTypeCreator;
+
+	@Autowired
+	private DateConverter dateConverter;
+
+	public Optional<KontaktType> create(VorgangWithEingang vorgang) {
+		return getAntragstellerIfHasRequiredData(vorgang).map(this::toKontaktType);
+	}
+
+	Optional<Antragsteller> getAntragstellerIfHasRequiredData(VorgangWithEingang vorgang) {
+		return Optional.ofNullable(vorgang.getEingang().getAntragsteller())
+				.filter(HAS_VORNAME.or(HAS_NACHNAME).or(HAS_ANREDE).or(HAS_VALID_GEBURTSDATUM));
+	}
+
+	KontaktType toKontaktType(Antragsteller antragsteller) {
+		var kontakt = new KontaktType();
+		kontakt.setName(nameNatuerlichePersonTypeCreator.create(antragsteller));
+		var geburtsdatumIso = dateConverter.convertGermanFormatToISO(antragsteller.getGeburtsdatum());
+		kontakt.setGeburt(createGeburtType(geburtsdatumIso));
+		return kontakt;
+	}
+
+	GeburtType createGeburtType(Optional<XMLGregorianCalendar> geburtsdatum) {
+		return geburtsdatum.map(this::createGeburtType).orElseGet(GeburtType::new);
+	}
+
+	private GeburtType createGeburtType(XMLGregorianCalendar datum) {
+		var geburtType = new GeburtType();
+		geburtType.setDatum(datum);
+		return geburtType;
+	}
+
+	private boolean hasValidGeburtsdatum(Antragsteller antragsteller) {
+		return dateConverter.convertGermanFormatToISO(antragsteller.getGeburtsdatum()).isPresent();
+	}
+
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..285854614408573b9f9238c000e7943ed94800e9
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreator.java
@@ -0,0 +1,30 @@
+package de.ozgcloud.alfa.export;
+
+import static java.util.Optional.*;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.vorgang.Antragsteller;
+import de.xoev.xdomea.AllgemeinerNameType;
+import de.xoev.xdomea.NameNatuerlichePersonType;
+
+@Component
+class NameNatuerlichePersonTypeCreator {
+
+	public NameNatuerlichePersonType create(Antragsteller antragsteller) {
+		var nameNatuerlichPerson = new NameNatuerlichePersonType();
+		nameNatuerlichPerson.setAnrede(ofNullable(antragsteller).map(Antragsteller::getAnrede).orElse(StringUtils.EMPTY));
+		nameNatuerlichPerson.setVorname(
+				createAllgemeinerNameType(ofNullable(antragsteller).map(Antragsteller::getVorname).orElse(StringUtils.EMPTY)));
+		nameNatuerlichPerson.setFamilienname(
+				createAllgemeinerNameType(ofNullable(antragsteller).map(Antragsteller::getNachname).orElse(StringUtils.EMPTY)));
+		return nameNatuerlichPerson;
+	}
+
+	private AllgemeinerNameType createAllgemeinerNameType(String name) {
+		var allgemeinerName = new AllgemeinerNameType();
+		allgemeinerName.setName(name);
+		return allgemeinerName;
+	}
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..593e0ef8195aed2d85c3d8290317e80f5efadf5c
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreator.java
@@ -0,0 +1,23 @@
+package de.ozgcloud.alfa.export;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.xoev.xdomea.PrimaerdokumentType;
+
+@Component
+class PrimaerdokumentTypeCreator {
+
+	@Autowired
+	private ExportFilenameGenerator exportFilenameGenerator;
+
+	public PrimaerdokumentType create(VorgangWithEingang vorgang, OzgFile ozgFile) {
+		var primaerdokument = new PrimaerdokumentType();
+		primaerdokument.setDateiname(exportFilenameGenerator.generateExportFilename(ozgFile));
+		primaerdokument.setDateinameOriginal(ozgFile.getName());
+		primaerdokument.setErsteller(vorgang.getEingang().getHeader().getFormEngineName());
+		return primaerdokument;
+	}
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/SchriftgutobjektCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/SchriftgutobjektCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ba904f2ceb9027f3d14d96736d0219242361b3f
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/SchriftgutobjektCreator.java
@@ -0,0 +1,22 @@
+package de.ozgcloud.alfa.export;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.xoev.xdomea.AbgabeAbgabe0401.Schriftgutobjekt;
+import de.xoev.xdomea.AnwendungsspezifischeErweiterungType;
+
+@Component
+class SchriftgutobjektCreator {
+
+	@Autowired
+	private VorgangTypeCreator vorgangTypeCreator;
+
+	public Schriftgutobjekt create(VorgangWithEingang vorgang, AnwendungsspezifischeErweiterungType erweiterung) {
+		var schritftgutobjekt = new Schriftgutobjekt();
+		schritftgutobjekt.setVorgang(vorgangTypeCreator.create(vorgang, erweiterung));
+		return schritftgutobjekt;
+	}
+
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/UUIDConverter.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/UUIDConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad28c0ea96923a9567330fed9fa1bea30cc3f15c
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/UUIDConverter.java
@@ -0,0 +1,23 @@
+package de.ozgcloud.alfa.export;
+
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+@Component
+class UUIDConverter {
+
+	private static final Pattern UUID_SPLIT_PATTERN = Pattern.compile(
+			"^([a-fA-F0-9]{8})([a-fA-F0-9]{4})([a-fA-F0-9]{4})([a-fA-F0-9]{4})([a-fA-F0-9]+)$");
+
+	public String fromObjectId(String objectId) {
+		var matcher = UUID_SPLIT_PATTERN.matcher(objectId);
+		if (matcher.find()) {
+			var lastGroup = StringUtils.leftPad(matcher.group(5), 12, "0");
+			return String.format("%s-%s-%s-%s-%s", matcher.group(1), matcher.group(2), matcher.group(3), matcher.group(4), lastGroup);
+		}
+		throw new IllegalArgumentException(String.format("Invalid object id %s", objectId));
+	}
+
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VersionTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VersionTypeCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..7ce323a415aa2181efcd27795de794d256f61b41
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VersionTypeCreator.java
@@ -0,0 +1,24 @@
+package de.ozgcloud.alfa.export;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.xoev.xdomea.VersionType;
+
+@Component
+class VersionTypeCreator {
+
+	static final String NUMMER = "1";
+
+	@Autowired
+	private FormatTypeCreator formatTypeCreator;
+
+	public VersionType create(VorgangWithEingang vorgang, OzgFile ozgFile) {
+		var version = new VersionType();
+		version.setNummer(NUMMER);
+		version.getFormat().add(formatTypeCreator.create(vorgang, ozgFile));
+		return version;
+	}
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VorgangTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VorgangTypeCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..792143b96e0074e5ffdbcd1c48a204759d8d710e
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VorgangTypeCreator.java
@@ -0,0 +1,60 @@
+package de.ozgcloud.alfa.export;
+
+import java.util.UUID;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.xoev.xdomea.AllgemeineMetadatenType;
+import de.xoev.xdomea.AnwendungsspezifischeErweiterungType;
+import de.xoev.xdomea.IdentifikationObjektType;
+import de.xoev.xdomea.MediumCodeType;
+import de.xoev.xdomea.VorgangType;
+
+@Component
+class VorgangTypeCreator {
+
+	static final Long NUMMER_IM_UEBERGEORDNETEN_CONTAINER = 1L;
+	static final String ALLGEMEINE_METADATEN_MEDIUM_CODE = "001";
+
+	@Autowired
+	private DokumentTypeCreator dokumentTypeCreator;
+
+	@Autowired
+	private KontaktTypeCreator kontaktTypeCreator;
+
+	public VorgangType create(VorgangWithEingang vorgangWithEingang, AnwendungsspezifischeErweiterungType erweiterung) {
+		var vorgang = new VorgangType();
+		vorgang.setAnwendungsspezifischeErweiterung(erweiterung);
+		vorgang.setIdentifikation(createIdentifikation());
+		vorgang.setAllgemeineMetadaten(createAllgemeineMetadaten(vorgangWithEingang));
+		vorgang.getDokument().addAll(dokumentTypeCreator.create(vorgangWithEingang).toList());
+		kontaktTypeCreator.create(vorgangWithEingang).ifPresent(vorgang.getKontakt()::add);
+		return vorgang;
+	}
+
+	IdentifikationObjektType createIdentifikation() {
+		var identifikation = new IdentifikationObjektType();
+		identifikation.setID(UUID.randomUUID().toString());
+		identifikation.setNummerImUebergeordnetenContainer(NUMMER_IM_UEBERGEORDNETEN_CONTAINER);
+		return identifikation;
+	}
+
+	AllgemeineMetadatenType createAllgemeineMetadaten(VorgangWithEingang vorgang) {
+		var allgemeineMetadaten = new AllgemeineMetadatenType();
+		allgemeineMetadaten.setBetreff(vorgang.getName());
+		allgemeineMetadaten.setKennzeichen(vorgang.getNummer());
+		allgemeineMetadaten.setBemerkung(StringUtils.EMPTY);
+		allgemeineMetadaten.setMedium(createMediumCode());
+		return allgemeineMetadaten;
+	}
+
+	private MediumCodeType createMediumCode() {
+		var mediumCode = new MediumCodeType();
+		mediumCode.setCode(ALLGEMEINE_METADATEN_MEDIUM_CODE);
+		return mediumCode;
+	}
+
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaMedienart.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaMedienart.java
new file mode 100644
index 0000000000000000000000000000000000000000..12c1500798df429f6d2619c35c16a4bce54e532d
--- /dev/null
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaMedienart.java
@@ -0,0 +1,16 @@
+package de.ozgcloud.alfa.export;
+
+enum XDomeaMedienart {
+
+	ELEKTRONISCHES_DOKUMENT("001");
+
+	private String code;
+
+	XDomeaMedienart(String code) {
+		this.code = code;
+	}
+
+	public String getCode() {
+		return code;
+	}
+}
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaNamespacePrefixMapper.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaNamespacePrefixMapper.java
index 4730cee16db3ad6c5819946deb8e87ebc5389672..81bb3fd6a3188265b05f3d731bd096a6a78ae8b8 100644
--- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaNamespacePrefixMapper.java
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaNamespacePrefixMapper.java
@@ -2,10 +2,9 @@ package de.ozgcloud.alfa.export;
 
 import java.util.Map;
 
+import org.glassfish.jaxb.runtime.marshaller.NamespacePrefixMapper;
 import org.springframework.stereotype.Component;
 
-import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
-
 @Component
 class XDomeaNamespacePrefixMapper extends NamespacePrefixMapper {
 
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaService.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaService.java
index ad611978adb188d30b09eba5f6aba06126fad8fb..ae924df290489e4851084caec61c45654da41d89 100644
--- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaService.java
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaService.java
@@ -1,21 +1,23 @@
 package de.ozgcloud.alfa.export;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
+import java.util.stream.Stream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import de.itvsh.kop.common.binaryfile.TempFileUtils;
 import de.itvsh.kop.common.errorhandling.TechnicalException;
+import de.ozgcloud.alfa.common.file.OzgFile;
 import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
-import de.xoev.xdomea.AbgabeAbgabe0401;
-import de.xoev.xdomea.AbgabeAbgabe0401.Schriftgutobjekt;
-import de.xoev.xdomea.AnwendungsspezifischeErweiterungType;
-import de.xoev.xdomea.VorgangType;
 
 @Service
 class XDomeaService {
@@ -24,29 +26,33 @@ class XDomeaService {
 
 	private static final String EXPORT_FILENAME_TEMPLATE = "%s" + EXPORT_FILENAME_SUFFIX;
 
-	@Autowired
-	private AnwendungsspezifischeErweiterungMapper anwendungsspezifischeErweiterungMapper;
-
 	@Autowired
 	private XDomeaXmlMarshaller xDomeaXmlMarshaller;
 
 	@Autowired
 	private VorgangController vorgangController;
 
+	@Autowired
+	private AbgabeAbgabe0401Creator abgabeCreator;
+
+	@Autowired
+	private ExportFileService exportFileService;
+
+	@Autowired
+	private ExportFilenameGenerator exportFilenameGenerator;
+
 	public void writeExport(String vorgangId, String filenameId, OutputStream out) {
-		var vorgang = vorgangController.getVorgang(vorgangId);
-		try (var zipOutputStream = new ZipOutputStream(out)) {
-			putZipEntry(buildXmlFilename(filenameId), createXmlContent(vorgang), zipOutputStream);
-		} catch (IOException ioe) {
-			throw new TechnicalException("Error creating XDomea zip file", ioe);
-		}
+		var exportData = collectExportData(vorgangId, filenameId);
+		var zipFile = createZipFile(exportData);
+		writeZipFileContent(zipFile, out);
 	}
 
-	void putZipEntry(String fileName, String fileData, ZipOutputStream zipOutputStream) throws IOException {
-		var entry = new ZipEntry(fileName);
-		zipOutputStream.putNextEntry(entry);
-		zipOutputStream.write(fileData.getBytes(StandardCharsets.UTF_8));
-		zipOutputStream.closeEntry();
+	ExportData collectExportData(String vorgangId, String filenameId) {
+		var vorgang = vorgangController.getVorgang(vorgangId);
+		var xmlContent = createXmlContent(vorgang);
+		var filename = buildXmlFilename(filenameId);
+		var ozgFiles = exportFileService.getAllPdfs(vorgang.getEingang().getId());
+		return ExportData.builder().vorgang(vorgang).xmlFileContent(xmlContent).exportFilename(filename).exportFiles(ozgFiles).build();
 	}
 
 	String buildXmlFilename(String filenameId) {
@@ -54,26 +60,45 @@ class XDomeaService {
 	}
 
 	String createXmlContent(VorgangWithEingang vorgang) {
-		var erweiterung = anwendungsspezifischeErweiterungMapper.map(vorgang);
-		var abgabe = buildAbgabe(erweiterung);
-		return xDomeaXmlMarshaller.marshal(abgabe);
+		return xDomeaXmlMarshaller.marshal(abgabeCreator.create(vorgang));
 	}
 
-	AbgabeAbgabe0401 buildAbgabe(AnwendungsspezifischeErweiterungType erweiterung) {
-		var root = new AbgabeAbgabe0401();
-		root.getSchriftgutobjekt().add(buildSchriftgutobjekt(erweiterung));
-		return root;
+	File createZipFile(ExportData exportData) {
+		var file = TempFileUtils.createTmpFile().toFile();
+		try (var zipOutputStream = new ZipOutputStream(new FileOutputStream(file))) {
+			putZipEntry(exportData.getExportFilename(), exportData.getXmlFileContent(), zipOutputStream);
+			putFilesIntoZip(exportData.getExportFiles(), zipOutputStream);
+			return file;
+		} catch (Exception e) {
+			throw new TechnicalException("Error creating XDomea zip file", e);
+		}
 	}
 
-	Schriftgutobjekt buildSchriftgutobjekt(AnwendungsspezifischeErweiterungType erweiterung) {
-		var schritftgutobjekt = new Schriftgutobjekt();
-		schritftgutobjekt.setVorgang(buildVorgangType(erweiterung));
-		return schritftgutobjekt;
+	void putZipEntry(String fileName, String fileData, ZipOutputStream zipOutputStream) throws IOException {
+		var entry = new ZipEntry(fileName);
+		zipOutputStream.putNextEntry(entry);
+		zipOutputStream.write(fileData.getBytes(StandardCharsets.UTF_8));
+		zipOutputStream.closeEntry();
 	}
 
-	VorgangType buildVorgangType(AnwendungsspezifischeErweiterungType erweiterung) {
-		var vorgang = new VorgangType();
-		vorgang.setAnwendungsspezifischeErweiterung(erweiterung);
-		return vorgang;
+	private void putFilesIntoZip(Stream<OzgFile> ozgFiles, ZipOutputStream zipOutputStream) throws IOException {
+		for (var ozgFile : ozgFiles.toList()) {
+			putOzgFileIntoZip(ozgFile, zipOutputStream);
+		}
+	}
+
+	void putOzgFileIntoZip(OzgFile ozgFile, ZipOutputStream zipOutputStream) throws IOException {
+		var entry = new ZipEntry(exportFilenameGenerator.generateExportFilename(ozgFile));
+		zipOutputStream.putNextEntry(entry);
+		exportFileService.writeOzgFile(ozgFile.getId(), zipOutputStream);
+		zipOutputStream.closeEntry();
+	}
+
+	void writeZipFileContent(File file, OutputStream outputStream) {
+		try (var fileInputStream = new FileInputStream(file)) {
+			fileInputStream.transferTo(outputStream);
+		} catch (Exception e) {
+			throw new TechnicalException("Error writting XDomea zip file to output stream", e);
+		}
 	}
 }
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaXmlMarshallerConfiguration.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaXmlMarshallerConfiguration.java
index 964d431c324c4e4af2a063a8dce2d2b473cab7ad..b6b8bd1a0dd4ae9d91e6a8442cb1dc9828da3e4f 100644
--- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaXmlMarshallerConfiguration.java
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaXmlMarshallerConfiguration.java
@@ -3,7 +3,7 @@ package de.ozgcloud.alfa.export;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.xml.bind.Marshaller;
+import jakarta.xml.bind.Marshaller;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
@@ -14,7 +14,7 @@ import org.springframework.oxm.jaxb.Jaxb2Marshaller;
 class XDomeaXmlMarshallerConfiguration {
 
 	static final boolean JAXB_FORMATTED_OUTPUT = true;
-	static final String PROPERTY_NAMESPACE_PREFIX_MAPPER = "com.sun.xml.bind.namespacePrefixMapper";
+	static final String PROPERTY_NAMESPACE_PREFIX_MAPPER = "org.glassfish.jaxb.namespacePrefixMapper";
 	static final String CONTEXT_PATH = "de.xoev.xdomea";
 
 	@Autowired
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401CreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401CreatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f34a7d3b963dfdcecd235f52e49cbf94d6de6bb9
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401CreatorTest.java
@@ -0,0 +1,66 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+import de.xoev.xdomea.AbgabeAbgabe0401.Schriftgutobjekt;
+import de.xoev.xdomea.AnwendungsspezifischeErweiterungType;
+
+class AbgabeAbgabe0401CreatorTest {
+
+	@InjectMocks
+	private AbgabeAbgabe0401Creator creator;
+
+	@Mock
+	private SchriftgutobjektCreator schriftgutobjektCreator;
+
+	@Mock
+	private AnwendungsspezifischeErweiterungTypeCreator anwendungsspezifischeErweiterungTypeCreator;
+
+	@Nested
+	class TestCreate {
+
+		private final VorgangWithEingang vorgangWithEingang = VorgangWithEingangTestFactory.create();
+
+		private final AnwendungsspezifischeErweiterungType anwendungsspezifischeErweiterung = AnwendungsspezifischeErweiterungTypeTestFactory.create();
+		private final Schriftgutobjekt schriftgutobjekt = SchriftgutobjektTestFactory.create();
+
+		@BeforeEach
+		void init() {
+			when(anwendungsspezifischeErweiterungTypeCreator.create(vorgangWithEingang)).thenReturn(
+					anwendungsspezifischeErweiterung);
+		}
+
+		@Test
+		void shouldCallMapper() {
+			creator.create(vorgangWithEingang);
+
+			verify(anwendungsspezifischeErweiterungTypeCreator).create(vorgangWithEingang);
+		}
+
+		@Test
+		void shouldCreateSchriftgutobjekt() {
+			creator.create(vorgangWithEingang);
+
+			verify(schriftgutobjektCreator).create(vorgangWithEingang, anwendungsspezifischeErweiterung);
+		}
+
+		@Test
+		void shouldHaveSchriftgutobjekt() {
+			doReturn(schriftgutobjekt).when(schriftgutobjektCreator).create(vorgangWithEingang, anwendungsspezifischeErweiterung);
+
+			var abgabe = creator.create(vorgangWithEingang);
+
+			assertThat(abgabe.getSchriftgutobjekt().get(0)).isEqualTo(schriftgutobjekt);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AllgemeineMetadatenTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AllgemeineMetadatenTypeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..380ee3058d81429d22396a87b9d0f5948623419a
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AllgemeineMetadatenTypeTestFactory.java
@@ -0,0 +1,10 @@
+package de.ozgcloud.alfa.export;
+
+import de.xoev.xdomea.AllgemeineMetadatenType;
+
+public class AllgemeineMetadatenTypeTestFactory {
+
+	public static AllgemeineMetadatenType create() {
+		return new AllgemeineMetadatenType();
+	}
+}
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapperTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapperTest.java
deleted file mode 100644
index b8678afc8b4cd313b334831f1d42d8ce1ddf070f..0000000000000000000000000000000000000000
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapperTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package de.ozgcloud.alfa.export;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.Mockito.*;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mapstruct.factory.Mappers;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-
-import de.ozgcloud.alfa.export.AnwendungsspezifischeErweiterungMapper;
-import de.ozgcloud.alfa.export.FeldGruppeMapper;
-import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
-import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
-import de.xoev.xdomea.AnwendungsspezifischeErweiterungType;
-import de.xoev.xdomea.FeldgruppeType;
-
-class AnwendungsspezifischeErweiterungMapperTest {
-
-	@InjectMocks
-	private AnwendungsspezifischeErweiterungMapper mapper = Mappers.getMapper(AnwendungsspezifischeErweiterungMapper.class);
-
-	@Mock
-	private FeldGruppeMapper feldGruppeMapper;
-
-	@Nested
-	class TestMap {
-
-		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
-		private FeldgruppeType feldgruppeType;
-
-		@BeforeEach
-		void init() {
-			feldgruppeType = new FeldgruppeType();
-			when(feldGruppeMapper.map(vorgang)).thenReturn(feldgruppeType);
-		}
-
-		@Test
-		void shouldHaveKennung() {
-			var mapped = callMapper();
-
-			assertThat(mapped.getKennung()).isEqualTo(AnwendungsspezifischeErweiterungMapper.KENNUNG);
-		}
-
-		@Test
-		void shouldHaveName() {
-			var mapped = callMapper();
-
-			assertThat(mapped.getName()).isEqualTo(AnwendungsspezifischeErweiterungMapper.NAME);
-		}
-
-		@Test
-		void shouldCallFeldgrupperMapper() {
-			callMapper();
-
-			verify(feldGruppeMapper).map(vorgang);
-		}
-
-		@Test
-		void shouldHaveFeldGruppe() {
-			var mapped = callMapper();
-
-			assertThat(mapped.getFeldgruppe()).hasSize(1).first().isEqualTo(feldgruppeType);
-		}
-
-		private AnwendungsspezifischeErweiterungType callMapper() {
-			return mapper.map(vorgang);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..db766c5063ef4154d736187bad2d8326211b6483
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreatorTest.java
@@ -0,0 +1,71 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+import de.xoev.xdomea.AnwendungsspezifischeErweiterungType;
+import de.xoev.xdomea.FeldgruppeType;
+
+class AnwendungsspezifischeErweiterungTypeCreatorTest {
+
+	@Spy
+	@InjectMocks
+	private AnwendungsspezifischeErweiterungTypeCreator creator;
+
+	@Mock
+	private FeldGruppeTypeCreator feldGruppeTypeCreator;
+
+	@Nested
+	class TestCreate {
+
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+		private final FeldgruppeType feldgruppeType = new FeldgruppeType();
+
+		@BeforeEach
+		void init() {
+			when(feldGruppeTypeCreator.create(vorgang)).thenReturn(feldgruppeType);
+		}
+
+		@Test
+		void shouldHaveKennung() {
+			var anwendungsspezifischeErweiterung = create();
+
+			assertThat(anwendungsspezifischeErweiterung.getKennung()).isEqualTo(AnwendungsspezifischeErweiterungTypeCreator.KENNUNG);
+		}
+
+		@Test
+		void shouldHaveName() {
+			var anwendungsspezifischeErweiterung = create();
+
+			assertThat(anwendungsspezifischeErweiterung.getName()).isEqualTo(AnwendungsspezifischeErweiterungTypeCreator.NAME);
+		}
+
+		@Test
+		void shouldCallFeldgrupperMapper() {
+			create();
+
+			verify(feldGruppeTypeCreator).create(vorgang);
+		}
+
+		@Test
+		void shouldHaveFeldGruppe() {
+			var anwendungsspezifischeErweiterung = create();
+
+			assertThat(anwendungsspezifischeErweiterung.getFeldgruppe()).hasSize(1).first().isEqualTo(feldgruppeType);
+		}
+
+		private AnwendungsspezifischeErweiterungType create() {
+			return creator.create(vorgang);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateConverterTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateConverterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c296eff263a96f41fe254f6fdfe07e8520766a16
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateConverterTest.java
@@ -0,0 +1,72 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.Optional;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.mockito.InjectMocks;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import de.itvsh.kop.common.errorhandling.TechnicalException;
+
+class DateConverterTest {
+
+	@InjectMocks
+	private DateConverter converter;
+
+	@Nested
+	class TestConvertGermanFormatToISO {
+
+		private static final int YEAR = 2023;
+		private static final int MONTH = 2;
+		private static final int DAY = 14;
+
+		private static final String DATE = String.format("%s.%s%s.%s", DAY, 0, MONTH, YEAR);
+
+		@Test
+		void shouldConvert() {
+			var converted = callConverter(DATE);
+
+			assertThat(converted).get().extracting(XMLGregorianCalendar::getYear, XMLGregorianCalendar::getMonth, XMLGregorianCalendar::getDay)
+					.containsExactly(YEAR, MONTH, DAY);
+		}
+
+		@ParameterizedTest
+		@ValueSource(strings = { "2005-10-10", "abc", "19. February 1970", " ", "" })
+		void shouldReturnEmpty(String dateStr) {
+			var converted = callConverter(dateStr);
+
+			assertThat(converted).isEmpty();
+		}
+
+		@Test
+		void shouldReturnEmptyIfDateIsNull() {
+			var converted = callConverter(null);
+
+			assertThat(converted).isEmpty();
+		}
+
+		@Test
+		void shouldThrowTechnicalException() {
+			try (MockedStatic<DatatypeFactory> datatypeFactory = Mockito.mockStatic(DatatypeFactory.class)) {
+				datatypeFactory.when(DatatypeFactory::newInstance).thenThrow(DatatypeConfigurationException.class);
+
+				assertThatThrownBy(() -> callConverter(DATE)).isInstanceOf(TechnicalException.class);
+			}
+		}
+
+		private Optional<XMLGregorianCalendar> callConverter(String dateStr) {
+			return converter.convertGermanFormatToISO(dateStr);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateiformatCodeTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateiformatCodeTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..8fefefe8e4ae869abfc6a4242d233accb64cdef4
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateiformatCodeTest.java
@@ -0,0 +1,35 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+class DateiformatCodeTest {
+
+	@Nested
+	class TestCreateDateiformatCodeType {
+
+		@Test
+		void shouldHaveCode() {
+			var dateiformatCode = DateiformatCode.PDF.createDateiformatCodeType();
+
+			assertThat(dateiformatCode.getCode()).isEqualTo(DateiformatCode.PDF.code);
+		}
+
+		@Test
+		void shouldHaveListURI() {
+			var dateiformatCode = DateiformatCode.PDF.createDateiformatCodeType();
+
+			assertThat(dateiformatCode.getListURI()).isEqualTo(DateiformatCode.LIST_URI);
+		}
+
+		@Test
+		void shouldHaveListVersionID() {
+			var dateiformatCode = DateiformatCode.PDF.createDateiformatCodeType();
+
+			assertThat(dateiformatCode.getListVersionID()).isEqualTo(DateiformatCode.PDF.listVersionID);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeCreatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..45015d4e9a5f95dd66bf6bc57c7e4f3970067425
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeCreatorTest.java
@@ -0,0 +1,228 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.stream.Stream;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import de.ozgcloud.alfa.common.TestUtils;
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
+import de.ozgcloud.alfa.vorgang.EingangTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+import de.xoev.xdomea.AllgemeineMetadatenType;
+import de.xoev.xdomea.DokumentType;
+import de.xoev.xdomea.IdentifikationObjektType;
+import de.xoev.xdomea.VersionType;
+
+class DokumentTypeCreatorTest {
+
+	@Spy
+	@InjectMocks
+	private DokumentTypeCreator creator;
+
+	@Mock
+	private ExportFileService exportFileService;
+
+	@Mock
+	private UUIDConverter uuidConverter;
+
+	@Mock
+	private VersionTypeCreator versionTypeCreator;
+
+	@Nested
+	class TestCreate {
+
+		@Nested
+		class WhenAllVorgangDataAvailable {
+			private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+			private final OzgFile ozgFile = OzgFileTestFactory.create();
+
+			@BeforeEach
+			void init() {
+				when(exportFileService.getAllPdfs(EingangTestFactory.ID)).thenReturn(Stream.of(ozgFile));
+			}
+
+			@Test
+			void shouldLoadlAllPdfs() {
+				creator.create(vorgang);
+
+				verify(exportFileService).getAllPdfs(EingangTestFactory.ID);
+			}
+
+			@Test
+			void shouldCreateDokumentType() {
+				creator.create(vorgang);
+
+				verify(creator).createDokumentType(1, vorgang, ozgFile);
+			}
+		}
+
+		@Nested
+		class WhenEingangIsNull {
+
+			@Test
+			void shouldNotLoadAnyPdf() {
+				creator.create(VorgangWithEingang.builder().eingang(null).build());
+
+				verify(exportFileService, never()).getAllPdfs(EingangTestFactory.ID);
+			}
+
+			@Test
+			void shouldReturnEmptyStreamIfEingangNull() {
+				var result = creator.create(VorgangWithEingang.builder().eingang(null).build());
+
+				assertThat(result).isEmpty();
+			}
+		}
+
+	}
+
+	@Nested
+	class CreateDokumentType {
+
+		private final IdentifikationObjektType identifikationObjekt = IdentifikationObjektTypeTestFactory.create();
+		private final AllgemeineMetadatenType allgemeineMetadaten = AllgemeineMetadatenTypeTestFactory.create();
+		private final OzgFile ozgFile = OzgFileTestFactory.create();
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+		private final VersionType version = VersionTypeTestFactory.create();
+		private final int DOKUMENT_ORDINAL_NUMBER = 1;
+
+		@BeforeEach
+		void init() {
+			doReturn(identifikationObjekt).when(creator).createIdentifikation(DOKUMENT_ORDINAL_NUMBER, OzgFileTestFactory.ID.toString());
+			doReturn(allgemeineMetadaten).when(creator).createAllgemeineMetadaten(ozgFile);
+
+			when(versionTypeCreator.create(vorgang, ozgFile)).thenReturn(version);
+		}
+
+		@Test
+		void shouldCreateIdentifikation() {
+			create();
+
+			verify(creator).createIdentifikation(DOKUMENT_ORDINAL_NUMBER, OzgFileTestFactory.ID.toString());
+		}
+
+		@Test
+		void shouldHaveIdentifikation() {
+			var dokument = create();
+
+			assertThat(dokument.getIdentifikation()).isEqualTo(identifikationObjekt);
+		}
+
+		@Test
+		void shouldCreateAllgemeineMetadaten() {
+			create();
+
+			verify(creator).createAllgemeineMetadaten(ozgFile);
+		}
+
+		@Test
+		void shouldHaveAllgemeineMetadaten() {
+			var dokument = create();
+
+			assertThat(dokument.getAllgemeineMetadaten()).isEqualTo(allgemeineMetadaten);
+		}
+
+		@Test
+		void shouldCreateVersion() {
+			create();
+
+			verify(versionTypeCreator).create(vorgang, ozgFile);
+		}
+
+		@Test
+		void shouldHaveVersion() {
+			var dokument = create();
+
+			assertThat(dokument.getVersion()).containsExactly(version);
+		}
+
+		private DokumentType create() {
+			return creator.createDokumentType(DOKUMENT_ORDINAL_NUMBER, vorgang, ozgFile);
+		}
+	}
+
+	@Nested
+	class TestCreateIdentifikation {
+
+		private final String FILE_ID = "64a820d36285172ac02826d0";
+		private final String FILE_UUID = "64a820d3-6285-172a-c028-0000000026d0";
+		private final int DOKUMENT_ORDINAL_NUMBER = 1;
+
+		@BeforeEach
+		void init() {
+			when(uuidConverter.fromObjectId(FILE_ID)).thenReturn(FILE_UUID);
+		}
+
+		@Test
+		void shouldConvertObjectId() {
+			create();
+
+			verify(uuidConverter).fromObjectId(FILE_ID);
+		}
+
+		@Test
+		void shouldHaveId() {
+			var identifikation = create();
+
+			assertThat(identifikation.getID()).matches(TestUtils.UUID_REGEX).isEqualTo(FILE_UUID);
+		}
+
+		@Test
+		void shouldHaveNummerImUebergeordnetenContainer() {
+			var identifikation = create();
+
+			assertThat(identifikation.getNummerImUebergeordnetenContainer()).isEqualTo(DOKUMENT_ORDINAL_NUMBER);
+		}
+
+		private IdentifikationObjektType create() {
+			return creator.createIdentifikation(DOKUMENT_ORDINAL_NUMBER, FILE_ID);
+		}
+	}
+
+	@Nested
+	class TestCreateAllgemeineMetadaten {
+
+		private final OzgFile ozgFile = OzgFileTestFactory.create();
+
+		@Test
+		void shouldHaveBetreff() {
+			var allgemeineMetadaten = creator.createAllgemeineMetadaten(ozgFile);
+
+			assertThat(allgemeineMetadaten.getBetreff()).isEqualTo(OzgFileTestFactory.NAME);
+		}
+
+		@Test
+		void shouldHaveKennzeichen() {
+			var allgemeineMetadaten = creator.createAllgemeineMetadaten(ozgFile);
+
+			assertThat(allgemeineMetadaten.getKennzeichen()).isEmpty();
+		}
+
+		@Test
+		void shouldHaveBemerkung() {
+			var allgemeineMetadaten = creator.createAllgemeineMetadaten(ozgFile);
+
+			assertThat(allgemeineMetadaten.getBemerkung()).isEmpty();
+		}
+
+		@Test
+		void shouldHaveMedium() {
+			var allgemeineMetadaten = creator.createAllgemeineMetadaten(ozgFile);
+
+			assertThat(allgemeineMetadaten.getMedium().getCode()).isEqualTo(VorgangTypeCreator.ALLGEMEINE_METADATEN_MEDIUM_CODE);
+		}
+
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..8de8ed3e01318e4883481d704d6db97012b0c708
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeTestFactory.java
@@ -0,0 +1,11 @@
+package de.ozgcloud.alfa.export;
+
+import de.xoev.xdomea.DokumentType;
+
+public class DokumentTypeTestFactory {
+
+	public static DokumentType create() {
+		var dokument = new DokumentType();
+		return dokument;
+	}
+}
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportDataTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportDataTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..2be3ee462e90de9997dff74f5b9d145cbb873256
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportDataTestFactory.java
@@ -0,0 +1,25 @@
+package de.ozgcloud.alfa.export;
+
+import java.util.stream.Stream;
+
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+
+class ExportDataTestFactory {
+
+	public static final String EXPORT_FILENAME = "file.zip";
+	public static final String XML_FILE_CONTENT = "<xml></xml>";
+	public static final OzgFile OZG_FILE = OzgFileTestFactory.create();
+	public static final VorgangWithEingang VORGANG = VorgangWithEingangTestFactory.create();
+
+	public static ExportData create() {
+		return createBuilder().build();
+	}
+
+	public static ExportData.ExportDataBuilder createBuilder() {
+		return ExportData.builder().exportFilename(EXPORT_FILENAME).xmlFileContent(XML_FILE_CONTENT).vorgang(VORGANG)
+				.exportFiles(Stream.of(OZG_FILE));
+	}
+}
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFileServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFileServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..45d3e64f283d9140299ec72e58659f7e1a743fa9
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFileServiceTest.java
@@ -0,0 +1,87 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.io.OutputStream;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.springframework.http.MediaType;
+
+import de.ozgcloud.alfa.common.binaryfile.BinaryFileService;
+import de.ozgcloud.alfa.common.binaryfile.FileId;
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.file.OzgFileService;
+import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
+import de.ozgcloud.alfa.vorgang.EingangTestFactory;
+
+class ExportFileServiceTest {
+
+	@InjectMocks
+	private ExportFileService service;
+
+	@Mock
+	private OzgFileService ozgFileService;
+
+	@Mock
+	private BinaryFileService binaryFileService;
+
+	@Nested
+	class TestGetAllPdfs {
+
+		private final OzgFile representationPdfFile = OzgFileTestFactory.createBuilder().contentType(MediaType.APPLICATION_PDF_VALUE).build();
+		private final OzgFile representationXmlFile = OzgFileTestFactory.createBuilder().contentType(MediaType.TEXT_XML_VALUE).build();
+		private final OzgFile attachmentPdfFile = OzgFileTestFactory.createBuilder().contentType(MediaType.APPLICATION_PDF_VALUE).build();
+		private final OzgFile attachmentXmlFile = OzgFileTestFactory.createBuilder().contentType(MediaType.TEXT_XML_VALUE).build();
+
+		@BeforeEach
+		void init() {
+			when(ozgFileService.getRepresentationsByEingang(EingangTestFactory.ID)).thenReturn(
+					Stream.of(representationPdfFile, representationXmlFile));
+			when(ozgFileService.getAttachmentsByEingang(EingangTestFactory.ID)).thenReturn(Stream.of(attachmentXmlFile, attachmentPdfFile));
+		}
+
+		@Test
+		void shouldLoadRepresentations() {
+			service.getAllPdfs(EingangTestFactory.ID);
+
+			verify(ozgFileService).getRepresentationsByEingang(EingangTestFactory.ID);
+		}
+
+		@Test
+		void shouldLoadAttachments() {
+			service.getAllPdfs(EingangTestFactory.ID);
+
+			verify(ozgFileService).getAttachmentsByEingang(EingangTestFactory.ID);
+		}
+
+		@Test
+		void shouldReturnPdfs() {
+			var ozgFiles = service.getAllPdfs(EingangTestFactory.ID);
+
+			assertThat(ozgFiles).hasSize(2).containsExactlyInAnyOrder(attachmentPdfFile, representationPdfFile);
+		}
+	}
+
+	@Nested
+	class TestWriteOzgFile {
+
+		private final FileId fileId = OzgFileTestFactory.ID;
+
+		@Mock
+		private OutputStream outputStream;
+
+		@Test
+		void shouldCallBinaryFileService() {
+			service.writeOzgFile(fileId, outputStream);
+
+			verify(binaryFileService).writeFileContent(fileId, outputStream);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFilenameGeneratorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFilenameGeneratorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..66d6480e708665d465935f20010c1bdc5cba38f6
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFilenameGeneratorTest.java
@@ -0,0 +1,55 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.ozgcloud.alfa.common.TestUtils;
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
+
+class ExportFilenameGeneratorTest {
+
+	@InjectMocks
+	private ExportFilenameGenerator generator;
+
+	@Mock
+	private UUIDConverter uuidConverter;
+
+	@Nested
+	class TestGenerateExportFilename {
+
+		private static final String UUID = "64a820d3-6285-172a-c028-0000000026d0";
+
+		private final OzgFile ozgFile = OzgFileTestFactory.create();
+
+		@BeforeEach
+		void init() {
+			when(uuidConverter.fromObjectId(ozgFile.getId().toString())).thenReturn(UUID);
+		}
+
+		@Test
+		void shouldConvertObjectId() {
+			callGenerator();
+
+			verify(uuidConverter).fromObjectId(ozgFile.getId().toString());
+		}
+
+		@Test
+		void shouldGenerate() {
+			var filename = callGenerator();
+
+			assertThat(filename).matches(String.format("^%s_%s$", TestUtils.UUID_REGEX, ozgFile.getName()));
+		}
+
+		private String callGenerator() {
+			return generator.generateExportFilename(ozgFile);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeMapperTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeMapperTest.java
deleted file mode 100644
index 615b82eb51b1200c527e58d7838419e423a1c17b..0000000000000000000000000000000000000000
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeMapperTest.java
+++ /dev/null
@@ -1,415 +0,0 @@
-package de.ozgcloud.alfa.export;
-
-import static org.assertj.core.api.Assertions.*;
-
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mapstruct.factory.Mappers;
-
-import de.ozgcloud.alfa.export.DatentypCode;
-import de.ozgcloud.alfa.export.ExportFelder;
-import de.ozgcloud.alfa.export.FeldGruppeMapper;
-import de.ozgcloud.alfa.vorgang.AntragstellerTestFactory;
-import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
-import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
-import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
-import de.xoev.xdomea.DatentypCodeType;
-import de.xoev.xdomea.FeldType;
-
-class FeldGruppeMapperTest {
-
-	private FeldGruppeMapper mapper = Mappers.getMapper(FeldGruppeMapper.class);
-
-	@DisplayName("Map")
-	@Nested
-	class TestMap {
-
-		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
-
-		@Test
-		void shouldHaveName() {
-			var mapped = mapper.map(vorgang);
-
-			assertThat(mapped.getName()).isEqualTo("FeldgruppeOZGCloudBasis");
-		}
-
-		@Test
-		void shouldHaveBeschreibung() {
-			var mapped = mapper.map(vorgang);
-
-			assertThat(mapped.getBeschreibung()).isEqualTo("Feldgruppe für OZGCloud Basis");
-		}
-	}
-
-	@DisplayName("Map to felder")
-	@Nested
-	class TestMapToFelder {
-
-		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
-
-		@DisplayName("LeikaId")
-		@Nested
-		class TestLeikaId {
-
-			@Test
-			void shouldHaveName() {
-				var mapped = mapLeikaID();
-
-				assertThat(mapped).extracting(FeldType::getName).isEqualTo("LeikaID");
-			}
-
-			@Test
-			void shouldHaveBeschreibung() {
-				var mapped = mapLeikaID();
-
-				assertThat(mapped).extracting(FeldType::getBeschreibung).isEqualTo("ID einer Leistung aus dem OZG-Leistungskatalog");
-			}
-
-			@Test
-			void shouldHaveWert() {
-				var mapped = mapLeikaID();
-
-				assertThat(mapped).extracting(FeldType::getWert).isNull();
-			}
-
-			@DisplayName("DatentypCode")
-			@Nested
-			class TestDatentypCode {
-
-				@Test
-				void shouldHaveCode() {
-					var mapped = mapLeikaID();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode)
-							.isEqualTo(DatentypCode.STRING.getCode());
-				}
-
-				@Test
-				void shouldHaveListURI() {
-					var mapped = mapLeikaID();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
-							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
-				}
-
-				@Test
-				void shouldHaveListVersionID() {
-					var mapped = mapLeikaID();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
-				}
-
-			}
-
-			private FeldType mapLeikaID() {
-				return mapper.mapToFelder(vorgang).stream()
-						.filter(feldType -> feldType.getName().equals(ExportFelder.LEIKA_ID.getName()))
-						.toList().get(0);
-			}
-		}
-
-		@DisplayName("Datum Antragseingang")
-		@Nested
-		class TestDatumAntragseingang {
-
-			@Test
-			void shouldHaveName() {
-				var mapped = mapDatumAntragseingang();
-
-				assertThat(mapped).extracting(FeldType::getName).isEqualTo("DatumAntragseingang");
-			}
-
-			@Test
-			void shouldHaveBeschreibung() {
-				var mapped = mapDatumAntragseingang();
-
-				assertThat(mapped).extracting(FeldType::getBeschreibung).isEqualTo("Das Datum des Antragseingangs");
-			}
-
-			@Test
-			void shouldHaveWert() {
-				var mapped = mapDatumAntragseingang();
-
-				assertThat(mapped).extracting(FeldType::getWert).isEqualTo(VorgangHeaderTestFactory.CREATED_AT_STR);
-			}
-
-			@DisplayName("DatentypCode")
-			@Nested
-			class TestDatentypCode {
-
-				@Test
-				void shouldHaveCode() {
-					var mapped = mapDatumAntragseingang();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode).isEqualTo(DatentypCode.DATE.getCode());
-				}
-
-				@Test
-				void shouldHaveListURI() {
-					var mapped = mapDatumAntragseingang();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
-							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
-				}
-
-				@Test
-				void shouldHaveListVersionID() {
-					var mapped = mapDatumAntragseingang();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
-				}
-
-			}
-
-			private FeldType mapDatumAntragseingang() {
-				return mapper.mapToFelder(vorgang).stream()
-						.filter(feldType -> feldType.getName().equals(ExportFelder.DATUM_ANTRAGSEINGANG.getName()))
-						.toList().get(0);
-			}
-		}
-
-		@DisplayName("Name")
-		@Nested
-		class TestName {
-
-			@Test
-			void shouldHaveName() {
-				var mapped = mapName();
-
-				assertThat(mapped).extracting(FeldType::getName).isEqualTo("Name");
-			}
-
-			@Test
-			void shouldNotHaveBeschreibung() {
-				var mapped = mapName();
-
-				assertThat(mapped).extracting(FeldType::getBeschreibung).isNull();
-			}
-
-			@Test
-			void shouldHaveWert() {
-				var mapped = mapName();
-
-				assertThat(mapped).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.NACHNAME);
-			}
-
-			@DisplayName("DatentypCode")
-			@Nested
-			class TestDatentypCode {
-
-				@Test
-				void shouldHaveCode() {
-					var mapped = mapName();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode)
-							.isEqualTo(DatentypCode.STRING.getCode());
-				}
-
-				@Test
-				void shouldHaveListURI() {
-					var mapped = mapName();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
-							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
-				}
-
-				@Test
-				void shouldHaveListVersionID() {
-					var mapped = mapName();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
-				}
-
-			}
-
-			private FeldType mapName() {
-				return mapper.mapToFelder(vorgang).stream()
-						.filter(feldType -> feldType.getName().equals(ExportFelder.NAME.getName()))
-						.toList().get(0);
-			}
-		}
-
-		@DisplayName("Vorname")
-		@Nested
-		class TestVorname {
-
-			@Test
-			void shouldHaveName() {
-				var mapped = mapVorname();
-
-				assertThat(mapped).extracting(FeldType::getName).isEqualTo("Vorname");
-			}
-
-			@Test
-			void shouldHaveNotHaveBeschreibung() {
-				var mapped = mapVorname();
-
-				assertThat(mapped).extracting(FeldType::getBeschreibung).isNull();
-			}
-
-			@Test
-			void shouldHaveWert() {
-				var mapped = mapVorname();
-
-				assertThat(mapped).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.VORNAME);
-			}
-
-			@DisplayName("DatentypCode")
-			@Nested
-			class TestDatentypCode {
-
-				@Test
-				void shouldHaveCode() {
-					var mapped = mapVorname();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode)
-							.isEqualTo(DatentypCode.STRING.getCode());
-				}
-
-				@Test
-				void shouldHaveListURI() {
-					var mapped = mapVorname();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
-							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
-				}
-
-				@Test
-				void shouldHaveListVersionID() {
-					var mapped = mapVorname();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
-				}
-
-			}
-
-			private FeldType mapVorname() {
-				return mapper.mapToFelder(vorgang).stream()
-						.filter(feldType -> feldType.getName().equals(ExportFelder.VORNAME.getName()))
-						.toList().get(0);
-			}
-		}
-
-		@DisplayName("Geburtsdatum")
-		@Nested
-		class TestGeburtsdatum {
-
-			@Test
-			void shouldHaveName() {
-				var mapped = mapGeburtsdatum();
-
-				assertThat(mapped).extracting(FeldType::getName).isEqualTo("Geburtsdatum");
-			}
-
-			@Test
-			void shouldHaveNotHaveBeschreibung() {
-				var mapped = mapGeburtsdatum();
-
-				assertThat(mapped).extracting(FeldType::getBeschreibung).isNull();
-			}
-
-			@Test
-			void shouldHaveWert() {
-				var mapped = mapGeburtsdatum();
-
-				assertThat(mapped).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.GEBURTSDATUM_STR);
-			}
-
-			@DisplayName("DatentypCode")
-			@Nested
-			class TestDatentypCode {
-
-				@Test
-				void shouldHaveCode() {
-					var mapped = mapGeburtsdatum();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode).isEqualTo(DatentypCode.DATE.getCode());
-				}
-
-				@Test
-				void shouldHaveListURI() {
-					var mapped = mapGeburtsdatum();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
-							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
-				}
-
-				@Test
-				void shouldHaveListVersionID() {
-					var mapped = mapGeburtsdatum();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
-				}
-
-			}
-
-			private FeldType mapGeburtsdatum() {
-				return mapper.mapToFelder(vorgang).stream()
-						.filter(feldType -> feldType.getName().equals(ExportFelder.GEBURTSDATUM.getName()))
-						.toList().get(0);
-			}
-		}
-
-		@DisplayName("Plz")
-		@Nested
-		class TestPlz {
-
-			@Test
-			void shouldHaveName() {
-				var mapped = mapPlz();
-
-				assertThat(mapped).extracting(FeldType::getName).isEqualTo("PLZAntragsteller");
-			}
-
-			@Test
-			void shouldHaveNotHaveBeschreibung() {
-				var mapped = mapPlz();
-
-				assertThat(mapped).extracting(FeldType::getBeschreibung).isNull();
-			}
-
-			@Test
-			void shouldHaveWert() {
-				var mapped = mapPlz();
-
-				assertThat(mapped).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.PLZ);
-			}
-
-			@DisplayName("DatentypCode")
-			@Nested
-			class TestDatentypCode {
-
-				@Test
-				void shouldHaveCode() {
-					var mapped = mapPlz();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode)
-							.isEqualTo(DatentypCode.STRING.getCode());
-				}
-
-				@Test
-				void shouldHaveListURI() {
-					var mapped = mapPlz();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
-							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
-				}
-
-				@Test
-				void shouldHaveListVersionID() {
-					var mapped = mapPlz();
-
-					assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
-				}
-
-			}
-
-			private FeldType mapPlz() {
-				return mapper.mapToFelder(vorgang).stream()
-						.filter(feldType -> feldType.getName().equals(ExportFelder.PLZ.getName()))
-						.toList().get(0);
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ca1494a2bd482efb4d3fd9a3deb931ad8ec1b8b
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreatorTest.java
@@ -0,0 +1,531 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.Spy;
+
+import de.ozgcloud.alfa.vorgang.AntragstellerTestFactory;
+import de.ozgcloud.alfa.vorgang.EingangTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+import de.xoev.xdomea.DatentypCodeType;
+import de.xoev.xdomea.FeldType;
+
+class FeldGruppeTypeCreatorTest {
+
+	@Spy
+	private FeldGruppeTypeCreator creator;
+
+	@Nested
+	class TestCreate {
+
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
+		@Test
+		void shouldHaveName() {
+			var created = creator.create(vorgang);
+
+			assertThat(created.getName()).isEqualTo("FeldgruppeOZGCloudBasis");
+		}
+
+		@Test
+		void shouldHaveBeschreibung() {
+			var created = creator.create(vorgang);
+
+			assertThat(created.getBeschreibung()).isEqualTo("Feldgruppe für OZGCloud Basis");
+		}
+
+		@Test
+		void shouldCreateFeldType() {
+			creator.create(vorgang);
+
+			verify(creator).createFeldType(vorgang);
+		}
+	}
+
+	@Nested
+	class TestCreateFeldType {
+
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
+		@DisplayName("LeikaId")
+		@Nested
+		class TestLeikaId {
+
+			@Test
+			void shouldHaveName() {
+				var created = create();
+
+				assertThat(created).extracting(FeldType::getName).isEqualTo("LeikaID");
+			}
+
+			@Test
+			void shouldHaveBeschreibung() {
+				var created = create();
+
+				assertThat(created).extracting(FeldType::getBeschreibung).isEqualTo("ID einer Leistung aus dem OZG-Leistungskatalog");
+			}
+
+			@Test
+			void shouldHaveWert() {
+				var created = create();
+
+				assertThat(created).extracting(FeldType::getWert).isNull();
+			}
+
+			@DisplayName("DatentypCode")
+			@Nested
+			class TestDatentypCode {
+
+				@Test
+				void shouldHaveCode() {
+					var created = create();
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode)
+							.isEqualTo(DatentypCode.STRING.getCode());
+				}
+
+				@Test
+				void shouldHaveListURI() {
+					var created = create();
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
+							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
+				}
+
+				@Test
+				void shouldHaveListVersionID() {
+					var created = create();
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
+				}
+
+			}
+
+			private FeldType create() {
+				return creator.createFeldType(vorgang).stream()
+						.filter(feldType -> feldType.getName().equals(ExportFelder.LEIKA_ID.getName()))
+						.toList().get(0);
+			}
+		}
+
+		@DisplayName("Datum Antragseingang")
+		@Nested
+		class TestDatumAntragseingang {
+
+			@Test
+			void shouldHaveName() {
+				var created = create();
+
+				assertThat(created).extracting(FeldType::getName).isEqualTo("DatumAntragseingang");
+			}
+
+			@Test
+			void shouldHaveBeschreibung() {
+				var created = create();
+
+				assertThat(created).extracting(FeldType::getBeschreibung).isEqualTo("Das Datum des Antragseingangs");
+			}
+
+			@Test
+			void shouldHaveWert() {
+				var created = create();
+
+				assertThat(created).extracting(FeldType::getWert).isEqualTo(VorgangHeaderTestFactory.CREATED_AT_STR);
+			}
+
+			@DisplayName("DatentypCode")
+			@Nested
+			class TestDatentypCode {
+
+				@Test
+				void shouldHaveCode() {
+					var created = create();
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode)
+							.isEqualTo(DatentypCode.DATE.getCode());
+				}
+
+				@Test
+				void shouldHaveListURI() {
+					var created = create();
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
+							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
+				}
+
+				@Test
+				void shouldHaveListVersionID() {
+					var created = create();
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
+				}
+
+			}
+
+			private FeldType create() {
+				return creator.createFeldType(vorgang).stream()
+						.filter(feldType -> feldType.getName().equals(ExportFelder.DATUM_ANTRAGSEINGANG.getName()))
+						.toList().get(0);
+			}
+		}
+
+		@DisplayName("Name")
+		@Nested
+		class TestName {
+
+			@Test
+			void shouldHaveName() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getName).isEqualTo("Name");
+			}
+
+			@Test
+			void shouldNotHaveBeschreibung() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getBeschreibung).isNull();
+			}
+
+			@Test
+			void shouldHaveWert() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.NACHNAME);
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullEingang() {
+				var created = create(VorgangWithEingangTestFactory.createBuilder().eingang(null).build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullAntragsteller() {
+				var created = create(
+						VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build())
+								.build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullNachname() {
+				var created = create(
+						VorgangWithEingangTestFactory.createBuilder().eingang(
+										EingangTestFactory.createBuilder().antragsteller(AntragstellerTestFactory.createBuilder().nachname(null).build())
+												.build())
+								.build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@DisplayName("DatentypCode")
+			@Nested
+			class TestDatentypCode {
+
+				@Test
+				void shouldHaveCode() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode)
+							.isEqualTo(DatentypCode.STRING.getCode());
+				}
+
+				@Test
+				void shouldHaveListURI() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
+							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
+				}
+
+				@Test
+				void shouldHaveListVersionID() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
+				}
+
+			}
+
+			private FeldType create(VorgangWithEingang vorgang) {
+				return creator.createFeldType(vorgang).stream()
+						.filter(feldType -> feldType.getName().equals(ExportFelder.NAME.getName()))
+						.toList().get(0);
+			}
+		}
+
+		@DisplayName("Vorname")
+		@Nested
+		class TestVorname {
+
+			@Test
+			void shouldHaveName() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getName).isEqualTo("Vorname");
+			}
+
+			@Test
+			void shouldHaveNotHaveBeschreibung() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getBeschreibung).isNull();
+			}
+
+			@Test
+			void shouldHaveWert() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.VORNAME);
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullEingang() {
+				var created = create(VorgangWithEingangTestFactory.createBuilder().eingang(null).build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullAntragsteller() {
+				var created = create(
+						VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build())
+								.build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullVorname() {
+				var created = create(
+						VorgangWithEingangTestFactory.createBuilder().eingang(
+										EingangTestFactory.createBuilder().antragsteller(AntragstellerTestFactory.createBuilder().vorname(null).build())
+												.build())
+								.build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@DisplayName("DatentypCode")
+			@Nested
+			class TestDatentypCode {
+
+				@Test
+				void shouldHaveCode() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode)
+							.isEqualTo(DatentypCode.STRING.getCode());
+				}
+
+				@Test
+				void shouldHaveListURI() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
+							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
+				}
+
+				@Test
+				void shouldHaveListVersionID() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
+				}
+
+			}
+
+			private FeldType create(VorgangWithEingang vorgang) {
+				return creator.createFeldType(vorgang).stream()
+						.filter(feldType -> feldType.getName().equals(ExportFelder.VORNAME.getName()))
+						.toList().get(0);
+			}
+		}
+
+		@DisplayName("Geburtsdatum")
+		@Nested
+		class TestGeburtsdatum {
+
+			@Test
+			void shouldHaveName() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getName).isEqualTo("Geburtsdatum");
+			}
+
+			@Test
+			void shouldHaveNotHaveBeschreibung() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getBeschreibung).isNull();
+			}
+
+			@Test
+			void shouldHaveWert() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.GEBURTSDATUM_STR);
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullEingang() {
+				var created = create(VorgangWithEingangTestFactory.createBuilder().eingang(null).build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullAntragsteller() {
+				var created = create(
+						VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build())
+								.build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullGeburtsdatum() {
+				var created = create(
+						VorgangWithEingangTestFactory.createBuilder().eingang(
+										EingangTestFactory.createBuilder().antragsteller(AntragstellerTestFactory.createBuilder().geburtsdatum(null).build())
+												.build())
+								.build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@DisplayName("DatentypCode")
+			@Nested
+			class TestDatentypCode {
+
+				@Test
+				void shouldHaveCode() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode)
+							.isEqualTo(DatentypCode.DATE.getCode());
+				}
+
+				@Test
+				void shouldHaveListURI() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
+							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
+				}
+
+				@Test
+				void shouldHaveListVersionID() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
+				}
+
+			}
+
+			private FeldType create(VorgangWithEingang vorgang) {
+				return creator.createFeldType(vorgang).stream()
+						.filter(feldType -> feldType.getName().equals(ExportFelder.GEBURTSDATUM.getName()))
+						.toList().get(0);
+			}
+		}
+
+		@DisplayName("Plz")
+		@Nested
+		class TestPlz {
+
+			@Test
+			void shouldHaveName() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getName).isEqualTo("PLZAntragsteller");
+			}
+
+			@Test
+			void shouldHaveNotHaveBeschreibung() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getBeschreibung).isNull();
+			}
+
+			@Test
+			void shouldHaveWert() {
+				var created = create(vorgang);
+
+				assertThat(created).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.PLZ);
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullEingang() {
+				var created = create(VorgangWithEingangTestFactory.createBuilder().eingang(null).build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullAntragsteller() {
+				var created = create(
+						VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build())
+								.build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@Test
+			void shouldBeEmptyStringForNullPlz() {
+				var created = create(
+						VorgangWithEingangTestFactory.createBuilder().eingang(
+										EingangTestFactory.createBuilder().antragsteller(AntragstellerTestFactory.createBuilder().plz(null).build())
+												.build())
+								.build());
+
+				assertThat(created.getWert()).isEmpty();
+			}
+
+			@DisplayName("DatentypCode")
+			@Nested
+			class TestDatentypCode {
+
+				@Test
+				void shouldHaveCode() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode)
+							.isEqualTo(DatentypCode.STRING.getCode());
+				}
+
+				@Test
+				void shouldHaveListURI() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI)
+							.isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp");
+				}
+
+				@Test
+				void shouldHaveListVersionID() {
+					var created = create(vorgang);
+
+					assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1");
+				}
+
+			}
+
+			private FeldType create(VorgangWithEingang vorgang) {
+				return creator.createFeldType(vorgang).stream()
+						.filter(feldType -> feldType.getName().equals(ExportFelder.PLZ.getName()))
+						.toList().get(0);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormaTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormaTypeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4c5902e19925829e206e4f3c6cd6d0e19098c3c
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormaTypeTestFactory.java
@@ -0,0 +1,10 @@
+package de.ozgcloud.alfa.export;
+
+import de.xoev.xdomea.FormatType;
+
+class FormaTypeTestFactory {
+
+	public static FormatType create() {
+		return new FormatType();
+	}
+}
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormatTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormatTypeCreatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a15c43215ff5d4ebfd44461fc74a75d44fb70010
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormatTypeCreatorTest.java
@@ -0,0 +1,78 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+import de.xoev.xdomea.PrimaerdokumentType;
+
+class FormatTypeCreatorTest {
+
+	@Spy
+	@InjectMocks
+	private FormatTypeCreator creator;
+
+	@Mock
+	private PrimaerdokumentTypeCreator primaerdokumentTypeCreator;
+
+	@Nested
+	class TestCreate {
+
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+		private final OzgFile ozgFile = OzgFileTestFactory.create();
+
+		private final PrimaerdokumentType primaerdokument = PrimaerdokumentTypeTestFactory.create();
+
+		@BeforeEach
+		void init() {
+			when(primaerdokumentTypeCreator.create(vorgang, ozgFile)).thenReturn(primaerdokument);
+		}
+
+		@Test
+		void shouldCreatePrimaerdokument() {
+			creator.create(vorgang, ozgFile);
+
+			verify(primaerdokumentTypeCreator).create(vorgang, ozgFile);
+		}
+
+		@Test
+		void shouldHavePrimaerdokumentType() {
+			var format = creator.create(vorgang, ozgFile);
+
+			assertThat(format.getPrimaerdokument()).isEqualTo(primaerdokument);
+		}
+
+		@Test
+		void shouldHaveName() {
+			var format = creator.create(vorgang, ozgFile);
+
+			assertThat(format.getName()).usingRecursiveComparison().isEqualTo(DateiformatCode.PDF.createDateiformatCodeType());
+		}
+
+		@Test
+		void shouldHaveSonstigerName() {
+			var format = creator.create(vorgang, ozgFile);
+
+			assertThat(format.getSonstigerName()).isEmpty();
+		}
+
+		@Test
+		void shouldHaveVersion() {
+			var format = creator.create(vorgang, ozgFile);
+
+			assertThat(format.getVersion()).isEmpty();
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/GeburtTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/GeburtTypeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..34c8fef41b03a4f5c1c31c51a0c23735f1d61522
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/GeburtTypeTestFactory.java
@@ -0,0 +1,10 @@
+package de.ozgcloud.alfa.export;
+
+import de.xoev.xdomea.GeburtType;
+
+public class GeburtTypeTestFactory {
+
+	public static GeburtType create() {
+		return new GeburtType();
+	}
+}
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/IdentifikationObjektTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/IdentifikationObjektTypeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..84353f13e976b9de5d5bf24aed2483a0ff4142e6
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/IdentifikationObjektTypeTestFactory.java
@@ -0,0 +1,10 @@
+package de.ozgcloud.alfa.export;
+
+import de.xoev.xdomea.IdentifikationObjektType;
+
+public class IdentifikationObjektTypeTestFactory {
+
+	public static IdentifikationObjektType create() {
+		return new IdentifikationObjektType();
+	}
+}
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeCreatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9a7d11824af1db52a8e6c21031f132194149b68
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeCreatorTest.java
@@ -0,0 +1,244 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.Optional;
+
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import de.ozgcloud.alfa.vorgang.Antragsteller;
+import de.ozgcloud.alfa.vorgang.AntragstellerTestFactory;
+import de.ozgcloud.alfa.vorgang.EingangTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+import de.xoev.xdomea.GeburtType;
+import de.xoev.xdomea.KontaktType;
+import de.xoev.xdomea.NameNatuerlichePersonType;
+
+class KontaktTypeCreatorTest {
+
+	@Spy
+	@InjectMocks
+	private KontaktTypeCreator creator;
+
+	@Mock
+	private NameNatuerlichePersonTypeCreator nameNatuerlichePersonTypeCreator;
+
+	@Mock
+	private DateConverter dateConverter;
+
+	@Nested
+	class TestCreate {
+
+		@Nested
+		class TestWithAntragsteller {
+
+			private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+			private final KontaktType kontaktType = KontaktTypeTestFactory.create();
+
+			@BeforeEach
+			void setUp() {
+				doReturn(Optional.of(vorgang.getEingang().getAntragsteller())).when(creator).getAntragstellerIfHasRequiredData(vorgang);
+				doReturn(kontaktType).when(creator).toKontaktType(vorgang.getEingang().getAntragsteller());
+			}
+
+			@Test
+			void shouldGetAntragsteller() {
+				callCreator(vorgang);
+
+				verify(creator).getAntragstellerIfHasRequiredData(vorgang);
+			}
+
+			@Test
+			void shouldMapToKontaktType() {
+				callCreator(vorgang);
+
+				verify(creator).toKontaktType(vorgang.getEingang().getAntragsteller());
+			}
+
+			@Test
+			void shouldReturnKontakt() {
+				var kontakt = callCreator(vorgang);
+
+				assertThat(kontakt).get().isEqualTo(kontaktType);
+			}
+		}
+
+		@Nested
+		class TestWithoutAntragsteller {
+
+			private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.createBuilder()
+					.eingang(EingangTestFactory.createBuilder().antragsteller(null).build())
+					.build();
+
+			@BeforeEach
+			void setUp() {
+				doReturn(Optional.empty()).when(creator).getAntragstellerIfHasRequiredData(vorgang);
+			}
+
+			@Test
+			void shouldBeEmpty() {
+				var kontakt = callCreator(vorgang);
+
+				assertThat(kontakt).isEmpty();
+			}
+		}
+
+		private Optional<KontaktType> callCreator(VorgangWithEingang vorgang) {
+			return creator.create(vorgang);
+		}
+	}
+
+	@Nested
+	class TestToKontaktType {
+
+		@Mock
+		private XMLGregorianCalendar geburtsdatum;
+
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+		private final NameNatuerlichePersonType nameNatuerlichePerson = NameNatuerlichePersonTypeTestFactory.create();
+		private final GeburtType geburtType = GeburtTypeTestFactory.create();
+
+		@BeforeEach
+		void setUp() {
+			when(nameNatuerlichePersonTypeCreator.create(vorgang.getEingang().getAntragsteller())).thenReturn(nameNatuerlichePerson);
+			when(dateConverter.convertGermanFormatToISO(AntragstellerTestFactory.GEBURTSDATUM_STR)).thenReturn(Optional.of(geburtsdatum));
+			doReturn(geburtType).when(creator).createGeburtType(Optional.of(geburtsdatum));
+		}
+
+		@Test
+		void shouldCreateNameNatuerlichePerson() {
+			callCreator(vorgang);
+
+			verify(nameNatuerlichePersonTypeCreator).create(vorgang.getEingang().getAntragsteller());
+		}
+
+		@Test
+		void shouldHaveNameNatuerlichePerson() {
+			var kontakt = callCreator(vorgang);
+
+			assertThat(kontakt.getName()).isEqualTo(nameNatuerlichePerson);
+		}
+
+		@Test
+		void shouldCallDateConverter() {
+			callCreator(vorgang);
+
+			verify(dateConverter).convertGermanFormatToISO(AntragstellerTestFactory.GEBURTSDATUM_STR);
+		}
+
+		@Test
+		void shouldCreateGeburtType() {
+			callCreator(vorgang);
+
+			verify(creator).createGeburtType(Optional.of(geburtsdatum));
+		}
+
+		@Test
+		void shouldHaveGeburtType() {
+			var kontakt = callCreator(vorgang);
+
+			assertThat(kontakt.getGeburt()).isEqualTo(geburtType);
+		}
+
+		private KontaktType callCreator(VorgangWithEingang vorgang) {
+			return creator.toKontaktType(vorgang.getEingang().getAntragsteller());
+		}
+	}
+
+	@Nested
+	class TestCreateGeburtType {
+
+		@Mock
+		private XMLGregorianCalendar geburtsdatum;
+
+		@Test
+		void shouldCreate() {
+			var geburtType = callCreator(Optional.of(geburtsdatum));
+
+			assertThat(geburtType.getDatum()).isEqualTo(geburtsdatum);
+		}
+
+		@Test
+		void shouldCreateEmptyGeburt() {
+			var geburtType = callCreator(Optional.empty());
+
+			assertThat(geburtType.getDatum()).isNull();
+		}
+
+		private GeburtType callCreator(Optional<XMLGregorianCalendar> geburtsdatum) {
+			return creator.createGeburtType(geburtsdatum);
+		}
+	}
+
+	@Nested
+	class TestGetAntragstellerIfHasRequiredData {
+
+		@Mock
+		private XMLGregorianCalendar geburtsdatum;
+
+		@Test
+		void shouldBeEmptyIfAntragstellerNull() {
+			var antragsteller = callCreator(buildVorgang(null));
+
+			assertThat(antragsteller).isEmpty();
+		}
+
+		@Test
+		void shouldBeEmptyIfNoneOfRequiredDataExists() {
+			when(dateConverter.convertGermanFormatToISO(null)).thenReturn(Optional.empty());
+
+			var antragsteller = callCreator(buildVorgang(Antragsteller.builder().build()));
+
+			assertThat(antragsteller).isEmpty();
+		}
+
+		@Test
+		void shouldNotBeEmptyIfHasVorname() {
+			var antragsteller = callCreator(buildVorgang(Antragsteller.builder().vorname(AntragstellerTestFactory.VORNAME).build()));
+
+			assertThat(antragsteller).isNotEmpty();
+		}
+
+		@Test
+		void shouldNotBeEmptyIfHasNachname() {
+			var antragsteller = callCreator(buildVorgang(Antragsteller.builder().nachname(AntragstellerTestFactory.NACHNAME).build()));
+
+			assertThat(antragsteller).isNotEmpty();
+		}
+
+		@Test
+		void shouldNotBeEmptyIfHasAnrede() {
+			var antragsteller = callCreator(buildVorgang(Antragsteller.builder().anrede(AntragstellerTestFactory.ANREDE).build()));
+
+			assertThat(antragsteller).isNotEmpty();
+		}
+
+		@Test
+		void shouldNotBeEmptyIfHasGeburtsdatum() {
+			when(dateConverter.convertGermanFormatToISO(AntragstellerTestFactory.GEBURTSDATUM_STR)).thenReturn(Optional.of(geburtsdatum));
+
+			var antragsteller = callCreator(buildVorgang(Antragsteller.builder().geburtsdatum(AntragstellerTestFactory.GEBURTSDATUM_STR).build()));
+
+			assertThat(antragsteller).isNotEmpty();
+		}
+
+		private Optional<Antragsteller> callCreator(VorgangWithEingang vorgang) {
+			return creator.getAntragstellerIfHasRequiredData(vorgang);
+		}
+
+		private VorgangWithEingang buildVorgang(Antragsteller antragsteller) {
+			return VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(antragsteller).build())
+					.build();
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..3daad690a0d408df23c9e0b75dbee73720a128cd
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeTestFactory.java
@@ -0,0 +1,10 @@
+package de.ozgcloud.alfa.export;
+
+import de.xoev.xdomea.KontaktType;
+
+public class KontaktTypeTestFactory {
+
+	public static KontaktType create() {
+		return new KontaktType();
+	}
+}
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..7124b6f846a1cd545df3a71c4567f2f42c166f70
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreatorTest.java
@@ -0,0 +1,93 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+
+import de.ozgcloud.alfa.vorgang.Antragsteller;
+import de.ozgcloud.alfa.vorgang.AntragstellerTestFactory;
+import de.xoev.xdomea.NameNatuerlichePersonType;
+
+class NameNatuerlichePersonTypeCreatorTest {
+
+	@InjectMocks
+	private NameNatuerlichePersonTypeCreator creator;
+
+	@Nested
+	class TestCreate {
+
+		@Test
+		void shouldHaveAnrede() {
+			var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.create());
+
+			assertThat(nameNatuerlichePerson.getAnrede()).isEqualTo(AntragstellerTestFactory.ANREDE);
+		}
+
+		@Test
+		void shouldHaveEmptyAnrede() {
+			var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.createBuilder().anrede(null).build());
+
+			assertThat(nameNatuerlichePerson.getAnrede()).isEmpty();
+		}
+
+		@Test
+		void shouldHaveVorname() {
+			var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.create());
+
+			assertThat(nameNatuerlichePerson.getVorname().getName()).isEqualTo(AntragstellerTestFactory.VORNAME);
+		}
+
+		@Test
+		void shouldHaveEmptyVorname() {
+			var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.createBuilder().vorname(null).build());
+
+			assertThat(nameNatuerlichePerson.getVorname().getName()).isEmpty();
+		}
+
+		@Test
+		void shouldHaveFamilienname() {
+			var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.create());
+
+			assertThat(nameNatuerlichePerson.getFamilienname().getName()).isEqualTo(AntragstellerTestFactory.NACHNAME);
+		}
+
+		@Test
+		void shouldHaveEmptyFamilienname() {
+			var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.createBuilder().nachname(null).build());
+
+			assertThat(nameNatuerlichePerson.getFamilienname().getName()).isEmpty();
+		}
+
+		@Nested
+		class TestWhenNullAntragsteller {
+
+			@Test
+			void shouldHaveEmptyAnrede() {
+				var nameNatuerlichePerson = callCreator(null);
+
+				assertThat(nameNatuerlichePerson.getAnrede()).isEmpty();
+			}
+
+			@Test
+			void shouldHaveEmptyVorname() {
+				var nameNatuerlichePerson = callCreator(null);
+
+				assertThat(nameNatuerlichePerson.getVorname().getName()).isEmpty();
+			}
+
+			@Test
+			void shouldHaveEmptyFamilienname() {
+				var nameNatuerlichePerson = callCreator(null);
+
+				assertThat(nameNatuerlichePerson.getFamilienname().getName()).isEmpty();
+			}
+		}
+
+		private NameNatuerlichePersonType callCreator(Antragsteller antragsteller) {
+			return creator.create(antragsteller);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..79abd234311aa7c864b7b146f932aa9197c5d980
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeTestFactory.java
@@ -0,0 +1,10 @@
+package de.ozgcloud.alfa.export;
+
+import de.xoev.xdomea.NameNatuerlichePersonType;
+
+public class NameNatuerlichePersonTypeTestFactory {
+
+	public static NameNatuerlichePersonType create() {
+		return new NameNatuerlichePersonType();
+	}
+}
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..db307b1e5da896283a48d60c7e31da70ecba26d9
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreatorTest.java
@@ -0,0 +1,67 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
+import de.ozgcloud.alfa.vorgang.EingangHeaderTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+
+class PrimaerdokumentTypeCreatorTest {
+
+	@Spy
+	@InjectMocks
+	private PrimaerdokumentTypeCreator creator;
+
+	@Mock
+	private ExportFilenameGenerator exportFilenameGenerator;
+
+	@Nested
+	class TestCreate {
+
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+		private final OzgFile ozgFile = OzgFileTestFactory.create();
+
+		@BeforeEach
+		void init() {
+			when(exportFilenameGenerator.generateExportFilename(ozgFile)).thenReturn(ozgFile.getName());
+		}
+
+		@Test
+		void shouldGenerateExportFilename() {
+			creator.create(vorgang, ozgFile);
+
+			verify(exportFilenameGenerator).generateExportFilename(ozgFile);
+		}
+
+		@Test
+		void shouldHaveDateiname() {
+			var primaerdokument = creator.create(vorgang, ozgFile);
+
+			assertThat(primaerdokument.getDateiname()).isEqualTo(ozgFile.getName());
+		}
+
+		@Test
+		void shouldHaveDateinameOriginal() {
+			var primaerdokument = creator.create(vorgang, ozgFile);
+
+			assertThat(primaerdokument.getDateinameOriginal()).isEqualTo(ozgFile.getName());
+		}
+
+		@Test
+		void shouldHaveErsteller() {
+			var primaerdokument = creator.create(vorgang, ozgFile);
+
+			assertThat(primaerdokument.getErsteller()).isEqualTo(EingangHeaderTestFactory.FORM_ENGINE_NAME);
+		}
+	}
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..f0ae78aaf77d4af8219bc90e920e504bc53f553b
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeTestFactory.java
@@ -0,0 +1,10 @@
+package de.ozgcloud.alfa.export;
+
+import de.xoev.xdomea.PrimaerdokumentType;
+
+class PrimaerdokumentTypeTestFactory {
+
+	public static PrimaerdokumentType create() {
+		return new PrimaerdokumentType();
+	}
+}
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/SchriftgutobjektCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/SchriftgutobjektCreatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ea75ceee7e8b37bf123339fd9fc0ee60503e722
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/SchriftgutobjektCreatorTest.java
@@ -0,0 +1,50 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+import de.xoev.xdomea.AnwendungsspezifischeErweiterungType;
+import de.xoev.xdomea.VorgangType;
+
+class SchriftgutobjektCreatorTest {
+
+	@InjectMocks
+	private SchriftgutobjektCreator creator;
+
+	@Mock
+	private VorgangTypeCreator vorgangTypeCreator;
+
+	@Nested
+	class TestCreate {
+
+		private final VorgangWithEingang vorgangWithEingang = VorgangWithEingangTestFactory.create();
+
+		private final VorgangType vorgang = VorgangTypeTestFactory.create();
+		private final AnwendungsspezifischeErweiterungType anwendungsspezifischeErweiterung = AnwendungsspezifischeErweiterungTypeTestFactory.create();
+
+		@Test
+		void shouldCreateVorgangType() {
+			creator.create(vorgangWithEingang, anwendungsspezifischeErweiterung);
+
+			verify(vorgangTypeCreator).create(vorgangWithEingang, anwendungsspezifischeErweiterung);
+		}
+
+		@Test
+		void shouldHaveVorgangType() {
+			doReturn(vorgang).when(vorgangTypeCreator).create(vorgangWithEingang, anwendungsspezifischeErweiterung);
+
+			var schriftgutobjekt = creator.create(vorgangWithEingang, anwendungsspezifischeErweiterung);
+
+			assertThat(schriftgutobjekt.getVorgang()).isEqualTo(vorgang);
+		}
+
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/UUIDConverterTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/UUIDConverterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d6e44fb53c75d36b71fcfd4e8e66ea90f07f188
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/UUIDConverterTest.java
@@ -0,0 +1,32 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+
+import de.ozgcloud.alfa.common.TestUtils;
+
+class UUIDConverterTest {
+
+	@InjectMocks
+	private UUIDConverter converter;
+
+	@Nested
+	class TestFromObjectId {
+
+		@Test
+		void shouldReturnUUID() {
+			var result = converter.fromObjectId("64a820d36285172ac02826d0");
+
+			assertThat(result).isEqualTo("64a820d3-6285-172a-c028-0000000026d0").matches(TestUtils.UUID_REGEX);
+		}
+
+		@Test
+		void shouldThrowIllegalArgumentException() {
+			assertThatThrownBy(() -> converter.fromObjectId("abc")).isInstanceOf(IllegalArgumentException.class);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeCreatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd1f17cb080e3fbc887dbd4cc9cdb6b9dec16f1c
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeCreatorTest.java
@@ -0,0 +1,60 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+import de.xoev.xdomea.FormatType;
+
+class VersionTypeCreatorTest {
+
+	@InjectMocks
+	private VersionTypeCreator creator;
+
+	@Mock
+	private FormatTypeCreator formatTypeCreator;
+
+	@Nested
+	class TestCreate {
+
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+		private final OzgFile ozgFile = OzgFileTestFactory.create();
+		private final FormatType formatType = FormaTypeTestFactory.create();
+
+		@BeforeEach
+		void init() {
+			when(formatTypeCreator.create(vorgang, ozgFile)).thenReturn(formatType);
+		}
+
+		@Test
+		void shouldHaveNummer() {
+			var version = creator.create(vorgang, ozgFile);
+
+			assertThat(version.getNummer()).isEqualTo(VersionTypeCreator.NUMMER);
+		}
+
+		@Test
+		void shouldCreateFormatType() {
+			creator.create(vorgang, ozgFile);
+
+			verify(formatTypeCreator).create(vorgang, ozgFile);
+		}
+
+		@Test
+		void shouldHaveFormatType() {
+			var version = creator.create(vorgang, ozgFile);
+
+			assertThat(version.getFormat()).containsExactly(formatType);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..b2ee1d70ad1e31e7d6f08e1ff589de41054987e2
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeTestFactory.java
@@ -0,0 +1,10 @@
+package de.ozgcloud.alfa.export;
+
+import de.xoev.xdomea.VersionType;
+
+class VersionTypeTestFactory {
+
+	public static VersionType create() {
+		return new VersionType();
+	}
+}
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VorgangTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VorgangTypeCreatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f97c9906d1eaa1c8cfe8414b2b574c95983e8c5b
--- /dev/null
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VorgangTypeCreatorTest.java
@@ -0,0 +1,182 @@
+package de.ozgcloud.alfa.export;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import de.ozgcloud.alfa.common.TestUtils;
+import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+import de.xoev.xdomea.AllgemeineMetadatenType;
+import de.xoev.xdomea.AnwendungsspezifischeErweiterungType;
+import de.xoev.xdomea.DokumentType;
+import de.xoev.xdomea.IdentifikationObjektType;
+import de.xoev.xdomea.KontaktType;
+import de.xoev.xdomea.VorgangType;
+
+class VorgangTypeCreatorTest {
+
+	@Spy
+	@InjectMocks
+	private VorgangTypeCreator creator;
+
+	@Mock
+	private DokumentTypeCreator dokumentTypeCreator;
+
+	@Mock
+	private KontaktTypeCreator kontaktTypeCreator;
+
+	@Nested
+	class TestCreate {
+
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
+		private final IdentifikationObjektType identifikationObjekt = IdentifikationObjektTypeTestFactory.create();
+		private final AllgemeineMetadatenType allgemeineMetadaten = AllgemeineMetadatenTypeTestFactory.create();
+		private final AnwendungsspezifischeErweiterungType anwendungsspezifischeErweiterung = AnwendungsspezifischeErweiterungTypeTestFactory.create();
+		private final DokumentType dokument = DokumentTypeTestFactory.create();
+		private final KontaktType kontakt = KontaktTypeTestFactory.create();
+
+		@BeforeEach
+		void init() {
+			doReturn(identifikationObjekt).when(creator).createIdentifikation();
+			doReturn(allgemeineMetadaten).when(creator).createAllgemeineMetadaten(vorgang);
+
+			when(dokumentTypeCreator.create(vorgang)).thenReturn(Stream.of(dokument));
+			when(kontaktTypeCreator.create(vorgang)).thenReturn(Optional.of(kontakt));
+		}
+
+		@Test
+		void shouldHaveAnwendungsspezifischeErweiterungType() {
+			var vorgangType = callCreator();
+
+			assertThat(vorgangType.getAnwendungsspezifischeErweiterung()).isEqualTo(anwendungsspezifischeErweiterung);
+		}
+
+		@Test
+		void shouldCallCreateIdentifikation() {
+			callCreator();
+
+			verify(creator).createIdentifikation();
+		}
+
+		@Test
+		void shouldHaveIdentifikation() {
+			var vorgangType = callCreator();
+
+			assertThat(vorgangType.getIdentifikation()).isEqualTo(identifikationObjekt);
+		}
+
+		@Test
+		void shouldCallCreateAllgemeineMetadaten() {
+			callCreator();
+
+			verify(creator).createAllgemeineMetadaten(vorgang);
+		}
+
+		@Test
+		void shouldHaveAllgemeineMetadaten() {
+			var vorgangType = callCreator();
+
+			assertThat(vorgangType.getAllgemeineMetadaten()).isEqualTo(allgemeineMetadaten);
+		}
+
+		@Test
+		void shouldCreateDokumenType() {
+			var vorgangType = callCreator();
+
+			verify(dokumentTypeCreator).create(vorgang);
+			assertThat(vorgangType.getDokument()).hasSize(1).containsExactly(dokument);
+		}
+
+		@Test
+		void shouldCallKontaktTypeCreator() {
+			callCreator();
+
+			verify(kontaktTypeCreator).create(vorgang);
+		}
+
+		@Test
+		void shouldHaveKontakt() {
+			var vorgangType = callCreator();
+
+			assertThat(vorgangType.getKontakt()).containsExactly(kontakt);
+		}
+
+		@Test
+		void shouldNotHaveKontakt() {
+			when(kontaktTypeCreator.create(vorgang)).thenReturn(Optional.empty());
+			var vorgangType = callCreator();
+
+			assertThat(vorgangType.getKontakt()).isEmpty();
+		}
+
+		private VorgangType callCreator() {
+			return creator.create(vorgang, anwendungsspezifischeErweiterung);
+		}
+	}
+
+	@Nested
+	class TestCreateAllgemeineMetadaten {
+
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
+		@Test
+		void shouldHaveBetreff() {
+			var allgemeineMetadaten = creator.createAllgemeineMetadaten(vorgang);
+
+			assertThat(allgemeineMetadaten.getBetreff()).isEqualTo(VorgangHeaderTestFactory.NAME);
+		}
+
+		@Test
+		void shouldHaveKennzeichen() {
+			var allgemeineMetadaten = creator.createAllgemeineMetadaten(vorgang);
+
+			assertThat(allgemeineMetadaten.getKennzeichen()).isEqualTo(VorgangHeaderTestFactory.NUMMER);
+		}
+
+		@Test
+		void shouldHaveBemerkung() {
+			var allgemeineMetadaten = creator.createAllgemeineMetadaten(vorgang);
+
+			assertThat(allgemeineMetadaten.getBemerkung()).isEmpty();
+		}
+
+		@Test
+		void shouldHaveMedium() {
+			var allgemeineMetadaten = creator.createAllgemeineMetadaten(vorgang);
+
+			assertThat(allgemeineMetadaten.getMedium().getCode()).isEqualTo(VorgangTypeCreator.ALLGEMEINE_METADATEN_MEDIUM_CODE);
+		}
+
+	}
+
+	@Nested
+	class TestCreateIdentifikation {
+
+		@Test
+		void shouldHaveId() {
+			var identifikation = creator.createIdentifikation();
+
+			assertThat(identifikation.getID()).matches(TestUtils.UUID_REGEX);
+		}
+
+		@Test
+		void shouldHaveNummerImUebergeordnetenContainer() {
+			var identifikation = creator.createIdentifikation();
+
+			assertThat(identifikation.getNummerImUebergeordnetenContainer()).isEqualTo(VorgangTypeCreator.NUMMER_IM_UEBERGEORDNETEN_CONTAINER);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XDomeaServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XDomeaServiceTest.java
index cf6c1653d9db58aa17000b9d43515b68e56edcfd..f2471d907ae8b11e38264726ff7fb1245c72435d 100644
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XDomeaServiceTest.java
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XDomeaServiceTest.java
@@ -6,28 +6,35 @@ import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 import java.io.ByteArrayOutputStream;
+import java.io.File;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.UUID;
+import java.util.stream.Stream;
+import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
 import de.itvsh.kop.common.errorhandling.TechnicalException;
 import de.ozgcloud.alfa.common.TestUtils;
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
+import de.ozgcloud.alfa.vorgang.EingangTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
 import de.xoev.xdomea.AbgabeAbgabe0401;
-import de.xoev.xdomea.AbgabeAbgabe0401.Schriftgutobjekt;
-import de.xoev.xdomea.AnwendungsspezifischeErweiterungType;
-import de.xoev.xdomea.VorgangType;
+import lombok.SneakyThrows;
 
 class XDomeaServiceTest {
 
@@ -35,34 +42,85 @@ class XDomeaServiceTest {
 	@InjectMocks
 	private XDomeaService service;
 
-	@Mock
-	private AnwendungsspezifischeErweiterungMapper anwendungsspezifischeErweiterungMapper;
-
 	@Mock
 	private XDomeaXmlMarshaller XDomeaXmlMarshaller;
 
 	@Mock
 	private VorgangController vorgangController;
 
+	@Mock
+	private AbgabeAbgabe0401Creator abgabeCreator;
+
+	@Mock
+	private ExportFileService exportFileService;
+
+	@Mock
+	private ExportFilenameGenerator exportFilenameGenerator;
+
 	@DisplayName("Write exportToXdomea")
 	@Nested
 	class TestWriteExport {
 
-		private static final String XML_STRING = "<xml>";
 		private static final String FILENAME_ID = UUID.randomUUID().toString();
+		private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		private final ExportData exportData = ExportDataTestFactory.create();
+
+		@Mock
+		private File zipFile;
+
+		@BeforeEach
+		void setUp() {
+			doReturn(exportData).when(service).collectExportData(VorgangHeaderTestFactory.ID, FILENAME_ID);
+			doReturn(zipFile).when(service).createZipFile(exportData);
+			doNothing().when(service).writeZipFileContent(zipFile, outputStream);
+		}
+
+		@Test
+		void shouldCollectExportData() {
+			callService();
+
+			verify(service).collectExportData(VorgangHeaderTestFactory.ID, FILENAME_ID);
+		}
 
+		@Test
+		void shouldCreateZipFile() {
+			callService();
+
+			verify(service).createZipFile(exportData);
+		}
+
+		@Test
+		void shouldWriteZipFileContentToOutputStream() {
+			callService();
+
+			verify(service).writeZipFileContent(zipFile, outputStream);
+		}
+
+		private void callService() {
+			service.writeExport(VorgangHeaderTestFactory.ID, FILENAME_ID, outputStream);
+		}
+	}
+
+	@Nested
+	class TestCollectExportData {
+
+		private static final String FILENAME_ID = UUID.randomUUID().toString();
+		private static final String FILE_NAME = "file.zip";
+		private static final String XML_STRING = "<xml>";
 		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
-		private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		private final Stream<OzgFile> ozgFiles = Stream.of(OzgFileTestFactory.create());
 
 		@BeforeEach
-		void init() {
+		void setUp() {
+			when(exportFileService.getAllPdfs(EingangTestFactory.ID)).thenReturn(ozgFiles);
 			when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang);
 			doReturn(XML_STRING).when(service).createXmlContent(vorgang);
+			doReturn(FILE_NAME).when(service).buildXmlFilename(FILENAME_ID);
 		}
 
 		@Test
 		void shouldLoadVorgang() {
-			service.writeExport(VorgangHeaderTestFactory.ID, FILENAME_ID, outputStream);
+			callService();
 
 			verify(vorgangController).getVorgang(VorgangHeaderTestFactory.ID);
 		}
@@ -75,36 +133,49 @@ class XDomeaServiceTest {
 		}
 
 		@Test
-		void shouldCreateZipEntry() throws IOException {
+		void shouldGenerateXmlFilename() {
 			callService();
 
-			verify(service).putZipEntry(anyString(), eq(XML_STRING), any(ZipOutputStream.class));
+			verify(service).buildXmlFilename(FILENAME_ID);
 		}
 
 		@Test
-		void shouldGenerateXmlFilename() {
+		void shouldGetPdfFiles() {
 			callService();
 
-			verify(service).buildXmlFilename(FILENAME_ID);
+			verify(exportFileService).getAllPdfs(EingangTestFactory.ID);
 		}
 
 		@Test
-		void shouldWriteBytes() {
-			callService();
+		void shouldContainsVorgang() {
+			var exportData = callService();
 
-			assertThat(outputStream).isNotNull();
-			assertThat(outputStream.toByteArray()).hasSizeGreaterThan(100);
+			assertThat(exportData.getVorgang()).isEqualTo(vorgang);
 		}
 
 		@Test
-		void shouldThrowTechnicalException() throws IOException {
-			doThrow(IOException.class).when(service).putZipEntry(anyString(), eq(XML_STRING), any());
+		void shouldContainsXmlContent() {
+			var exportData = callService();
 
-			assertThatThrownBy(this::callService).isInstanceOf(TechnicalException.class);
+			assertThat(exportData.getXmlFileContent()).isEqualTo(XML_STRING);
 		}
 
-		private void callService() {
-			service.writeExport(VorgangHeaderTestFactory.ID, FILENAME_ID, outputStream);
+		@Test
+		void shouldContainsExportFilename() {
+			var exportData = callService();
+
+			assertThat(exportData.getExportFilename()).isEqualTo(FILE_NAME);
+		}
+
+		@Test
+		void shouldContainsExportExportFiles() {
+			var exportData = callService();
+
+			assertThat(exportData.getExportFiles()).isEqualTo(ozgFiles);
+		}
+
+		private ExportData callService() {
+			return service.collectExportData(VorgangHeaderTestFactory.ID, FILENAME_ID);
 		}
 
 	}
@@ -128,81 +199,198 @@ class XDomeaServiceTest {
 		private static final String XML_STRING = "<xml>";
 
 		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
-		private final AnwendungsspezifischeErweiterungType anwendungsspezifischeErweiterung = AnwendungsspezifischeErweiterungTypeTestFactory
-				.create();
 		private final AbgabeAbgabe0401 abgabe = AbgabeAbgabe0401TestFactory.create();
 
 		@BeforeEach
 		void init() {
-			when(anwendungsspezifischeErweiterungMapper.map(vorgang)).thenReturn(anwendungsspezifischeErweiterung);
-			doReturn(abgabe).when(service).buildAbgabe(any());
+			doReturn(abgabe).when(abgabeCreator).create(vorgang);
 			when(XDomeaXmlMarshaller.marshal(any())).thenReturn(XML_STRING);
 		}
 
-		@Test
-		void shouldCallMapper() {
-			service.createXmlContent(vorgang);
-
-			verify(anwendungsspezifischeErweiterungMapper).map(vorgang);
-		}
-
 		@Test
 		void shouldCallXmlMarshaller() {
-			service.createXmlContent(vorgang);
+			callService();
 
 			verify(XDomeaXmlMarshaller).marshal(abgabe);
 		}
 
 		@Test
 		void shouldReturnMarshalledString() {
-			var result = service.createXmlContent(vorgang);
+			var result = callService();
 
 			assertThat(result).isEqualTo(XML_STRING);
 		}
+
+		@Test
+		void shouldCallAbgabeCreator() {
+			callService();
+
+			verify(abgabeCreator).create(vorgang);
+		}
+
+		private String callService() {
+			return service.createXmlContent(vorgang);
+		}
+	}
+
+	@Nested
+	class TestCreateZipFile {
+
+		private static final String XML_STRING = "<xml>";
+		private final ExportData exportData = ExportDataTestFactory.create();
+
+		@Captor
+		private ArgumentCaptor<ZipOutputStream> zipOutputStreamArgumentCaptor;
+
+		@SneakyThrows
+		@BeforeEach
+		void setUp() {
+			doNothing().when(service).putOzgFileIntoZip(any(OzgFile.class), any(ZipOutputStream.class));
+		}
+
+		@Test
+		void shouldCreateZipEntry() throws IOException {
+			callService();
+
+			verify(service).putZipEntry(eq(ExportDataTestFactory.EXPORT_FILENAME), eq(ExportDataTestFactory.XML_FILE_CONTENT),
+					any(ZipOutputStream.class));
+		}
+
+		@Test
+		void shouldCreateZipOutputStream() throws IOException {
+			callService();
+
+			verify(service).putZipEntry(eq(ExportDataTestFactory.EXPORT_FILENAME), eq(ExportDataTestFactory.XML_FILE_CONTENT),
+					zipOutputStreamArgumentCaptor.capture());
+			assertThat(zipOutputStreamArgumentCaptor.getValue()).isInstanceOf(ZipOutputStream.class);
+		}
+
+		@Test
+		void shouldWriteBytes() {
+			var file = callService();
+
+			assertThat(file).isNotEmpty().content().hasSizeGreaterThan(100);
+		}
+
+		@SneakyThrows
+		@Test
+		void shouldWritePdfFiles() {
+			callService();
+
+			verify(service).putOzgFileIntoZip(eq(ExportDataTestFactory.OZG_FILE), any(ZipOutputStream.class));
+		}
+
+		@Test
+		void shouldThrowTechnicalException() throws IOException {
+			doThrow(IOException.class).when(service).putZipEntry(anyString(), eq(XML_STRING), any(ZipOutputStream.class));
+
+			assertThatThrownBy(this::callService).isInstanceOf(TechnicalException.class);
+		}
+
+		private File callService() {
+			return service.createZipFile(exportData);
+		}
+
 	}
 
-	@DisplayName("Build abgabe")
 	@Nested
-	class TestBuildAbgabe {
+	class TestPutZipEntry {
+
+		@Mock
+		private ZipOutputStream zipOutputStream;
+
+		@Captor
+		private ArgumentCaptor<ZipEntry> zipEntryArgumentCaptor;
 
-		private final AnwendungsspezifischeErweiterungType type = AnwendungsspezifischeErweiterungTypeTestFactory.create();
-		private final Schriftgutobjekt schriftgutObjekt = SchriftgutobjektTestFactory.create();
+		@Captor
+		private ArgumentCaptor<byte[]> fileDataArgumentCaptor;
 
+		private final String FILE_NAME = "file.xml";
+		private final String FILE_DATA = "xml content";
+
+		@SneakyThrows
+		@Test
+		void shouldPutNextEntry() {
+			callService();
+
+			verify(zipOutputStream).putNextEntry(zipEntryArgumentCaptor.capture());
+			assertThat(zipEntryArgumentCaptor.getValue().getName()).isEqualTo(FILE_NAME);
+		}
+
+		@SneakyThrows
 		@Test
-		void shouldHaveSchriftgutobjekt() {
-			doReturn(schriftgutObjekt).when(service).buildSchriftgutobjekt(any());
+		void shouldWriteDataBytes() {
+			callService();
+
+			verify(zipOutputStream).write(fileDataArgumentCaptor.capture());
+			assertThat(fileDataArgumentCaptor.getValue()).isEqualTo(FILE_DATA.getBytes(StandardCharsets.UTF_8));
+		}
+
+		@SneakyThrows
+		@Test
+		void shouldCloseEntry() {
+			callService();
+
+			verify(zipOutputStream).closeEntry();
+		}
+
+		@SneakyThrows
+		private void callService() {
+			service.putZipEntry(FILE_NAME, FILE_DATA, zipOutputStream);
+		}
+	}
+
+	@Nested
+	class TestPutOzgFileIntoZip {
+
+		@Mock
+		private ZipOutputStream zipOutputStream;
+
+		@Captor
+		private ArgumentCaptor<ZipEntry> zipEntryArgumentCaptor;
 
-			var abgabe = service.buildAbgabe(type);
+		private final OzgFile ozgFile = OzgFileTestFactory.create();
 
-			assertThat(abgabe.getSchriftgutobjekt().get(0)).isEqualTo(schriftgutObjekt);
+		@BeforeEach
+		void setUp() {
+			when(exportFilenameGenerator.generateExportFilename(ozgFile)).thenReturn(OzgFileTestFactory.NAME);
 		}
 
-		@DisplayName("build schriftgutobjekt")
-		@Nested
-		class TestBuildSchriftgutObjekt {
+		@Test
+		void shouldGenerateExportFilename() {
+			callService();
 
-			private final VorgangType vorgang = VorgangTypeTestFactory.create();
+			verify(exportFilenameGenerator).generateExportFilename(ozgFile);
+		}
 
-			@Test
-			void shouldHaveVorgangType() {
-				doReturn(vorgang).when(service).buildVorgangType(any());
+		@SneakyThrows
+		@Test
+		void shouldPutNextEntry() {
+			callService();
 
-				var schriftgutobjekt = service.buildSchriftgutobjekt(type);
+			verify(zipOutputStream).putNextEntry(zipEntryArgumentCaptor.capture());
+			assertThat(zipEntryArgumentCaptor.getValue().getName()).isEqualTo(OzgFileTestFactory.NAME);
+		}
 
-				assertThat(schriftgutobjekt.getVorgang()).isEqualTo(vorgang);
-			}
+		@Test
+		void shouldCallExportFileService() {
+			callService();
 
-			@DisplayName("build vorgangType")
-			@Nested
-			class TestBuildVorgangType {
+			verify(exportFileService).writeOzgFile(OzgFileTestFactory.ID, zipOutputStream);
+		}
 
-				@Test
-				void shouldHaveAnwendungsspezifischeErweiterungType() {
-					var vorgangType = service.buildVorgangType(type);
+		@SneakyThrows
+		@Test
+		void shouldCloseEntry() {
+			callService();
 
-					assertThat(vorgangType.getAnwendungsspezifischeErweiterung()).isEqualTo(type);
-				}
-			}
+			verify(zipOutputStream).closeEntry();
 		}
+
+		@SneakyThrows
+		private void callService() {
+			service.putOzgFileIntoZip(ozgFile, zipOutputStream);
+		}
+
 	}
 }
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XmlMarshallerConfigurationTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XmlMarshallerConfigurationTest.java
index 91d53e4afc8c6f934d904c1bef9df3ea87adfb8c..46ddabac96c193f78b8ec3e8a448cbb68897c90f 100644
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XmlMarshallerConfigurationTest.java
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XmlMarshallerConfigurationTest.java
@@ -5,7 +5,7 @@ import static org.mockito.Mockito.*;
 
 import java.util.Map;
 
-import javax.xml.bind.Marshaller;
+import jakarta.xml.bind.Marshaller;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
diff --git a/goofy-client/angular.json b/goofy-client/angular.json
index 7d3d774bea4f7997a60e7edf1af771bcef6c8a2e..5f1d506b3b665e252c59633089bbac7e8e7f1d28 100644
--- a/goofy-client/angular.json
+++ b/goofy-client/angular.json
@@ -452,9 +452,10 @@
 				"e2e": {
 					"builder": "@nrwl/cypress:cypress",
 					"options": {
-						"cypressConfig": "apps/goofy-e2e/cypress.json",
+						"cypressConfig": "apps/goofy-e2e/cypress.config.ts",
 						"tsConfig": "apps/goofy-e2e/tsconfig.e2e.json",
-						"devServerTarget": "goofy:serve"
+						"devServerTarget": "goofy:serve",
+						"testingType": "e2e"
 					},
 					"configurations": {
 						"production": {
diff --git a/goofy-client/apps/goofy-e2e/Jenkinsfile b/goofy-client/apps/goofy-e2e/Jenkinsfile
index cb5ffcccaa43c0efcc5a1946e6bf2c47e9d1545d..a2d3aaf4a684ca4d52a5ce2fc5ef1653d827d3d9 100644
--- a/goofy-client/apps/goofy-e2e/Jenkinsfile
+++ b/goofy-client/apps/goofy-e2e/Jenkinsfile
@@ -190,15 +190,6 @@ pipeline {
             }
         }
 
-//        stage('Pausing to wait for ozg-operator') {
-//			when {
-//                expression { !SKIP_RUN }
-//            }
-//            steps {
-//                sleep(time: 3, unit: 'MINUTES')
-//            }
-//        }
-
         stage('Run E2E-Tests') {
             when {
                 expression { !SKIP_RUN }
@@ -614,12 +605,12 @@ Void publishE2ETestResult(String reportFolder, String reportName) {
 }
 
 String runTests(String bezeichner, String reportFolder, Integer dbPort, String stageName) {
-    def configFile = generateCypressConfig(bezeichner, reportFolder, dbPort)
+    def config = generateCypressConfig(bezeichner, reportFolder, dbPort)
 
     try {
-        dir("goofy-client") {
-      	    sh "npm run cypress:version"
-            sh "npm run cypress:ci-run --CONFIG_FILE=${configFile} --REPORT_FOLDER=${reportFolder}"
+        dir('goofy-client'){
+			sh "npm run cypress:version"
+			sh "apps/goofy-e2e/run-tests.sh ${reportFolder} ${config}"
         }
     } catch (Exception e) {
         printNpmDebugLog()
@@ -658,35 +649,35 @@ String cutBranchNameForKeycloakRealm(String branchName, String stageName) {
 
 String generateCypressConfig(String bezeichner, String testFolder, Integer dbPort) {
     def namespace = generateNamespace(bezeichner)
-    def configName = "cypress-ci-"+testFolder+".json"
+	def configName = "cypress-ci-"+testFolder+".json"
 
-    dir('goofy-client/apps/goofy-e2e/'){
-        def config = readJSON file: 'cypress-ci.json'
+	dir('goofy-client/apps/goofy-e2e/'){
+		def config = readJSON file: 'cypress-ci.json'
 
 		def plutoDatabaseSecret = getPlutoDatabaseSecret(namespace);
 		def decodedPassword = decodeString(plutoDatabaseSecret.password);
 		def parsablePassword = makePasswordUrlConform(decodedPassword);
 
-        config.baseUrl = "https://${bezeichner}.${env.CLUSTER_BASE_URL}" as String
-        config.env.dbUrl = "mongodb://${decodeString(plutoDatabaseSecret.username)}:${parsablePassword}@localhost:${dbPort}/admin?ssl=false&directConnection=true" as String
-        config.env.keycloakUrl = "https://${env.SSO_URL}/" as String
-        config.env.keycloakRealm = namespace as String
-        config.env.keycloakClient = "alfa" as String
+		config.baseUrl = "https://${bezeichner}.${env.CLUSTER_BASE_URL}" as String
+		config.env.dbUrl = "mongodb://${decodeString(plutoDatabaseSecret.username)}:${parsablePassword}@localhost:${dbPort}/admin?ssl=false&directConnection=true" as String
+		config.env.keycloakUrl = "https://${env.SSO_URL}/" as String
+		config.env.keycloakRealm = namespace as String
 		config.env.sabineUuid = getKeycloakUuid(namespace, "sabine") as String
-        config.integrationFolder = "./src/integration/${testFolder}" as String
-        config.videosFolder = "./reports/${testFolder}/videos" as String
-	    config.screenshotsFolder = "./reports/${testFolder}/screenshots" as String
-        config.reporterOptions.reportDir = "./reports/${testFolder}/mochawesome-report" as String
+		config.videosFolder = "./reports/${testFolder}/videos" as String
+		config.screenshotsFolder = "./reports/${testFolder}/screenshots" as String
+		config.reporterOptions.reportDir = "./reports/${testFolder}/mochawesome-report" as String
 
-        config.env.put("search", getElasticsearchEnv(namespace))
-        config.env.put("userManager", getUserManagerEnv(namespace, dbPort))
+        config.specPattern = "src/e2e/${testFolder}/**/*.cy.{js,jsx,ts,tsx}" as String
 
-        writeJSON file: configName, json: config
+		config.env.put("search", getElasticsearchEnv(namespace))
+		config.env.put("userManager", getUserManagerEnv(namespace, dbPort))
 
-        sh "cat ${configName}"
-    }
+		writeJSON file: configName, json: config
+
+		sh "cat ${configName}"
+	}
 
-    return configName
+	return "cypress-ci-"+testFolder+".config.ts"
 }
 
 String makePasswordUrlConform(String password) {
diff --git a/goofy-client/apps/goofy-e2e/cypress-ci-einheitlicher-ansprechpartner.config.ts b/goofy-client/apps/goofy-e2e/cypress-ci-einheitlicher-ansprechpartner.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5ef91724365a1ed66f94db34d0c762d8b1b3b2b7
--- /dev/null
+++ b/goofy-client/apps/goofy-e2e/cypress-ci-einheitlicher-ansprechpartner.config.ts
@@ -0,0 +1,16 @@
+import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset';
+import { defineConfig } from 'cypress';
+
+//Cypress config is generated by JenkinsFile
+const cypressConfig = require('./cypress-ci-einheitlicher-ansprechpartner.json');
+const cypressEvents = require('./src/support/cypress-tasks.ts');
+
+export default defineConfig({
+	e2e: {
+		...nxE2EPreset(__dirname),
+		...cypressConfig,
+		setupNodeEvents(on, config) {
+			return cypressEvents(on, config);
+		}
+	},
+});
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/cypress-ci-main-tests.config.ts b/goofy-client/apps/goofy-e2e/cypress-ci-main-tests.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c3b17666b23e7ef150bfc88da510380739f7f49a
--- /dev/null
+++ b/goofy-client/apps/goofy-e2e/cypress-ci-main-tests.config.ts
@@ -0,0 +1,16 @@
+import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset';
+import { defineConfig } from 'cypress';
+
+//Cypress config is generated by JenkinsFile
+const cypressConfig = require('./cypress-ci-main-tests.json');
+const cypressEvents = require('./src/support/cypress-tasks.ts');
+
+export default defineConfig({
+	e2e: {
+		...nxE2EPreset(__dirname),
+		...cypressConfig,
+		setupNodeEvents(on, config) {
+			return cypressEvents(on, config);
+		}
+	},
+});
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/cypress-ci.json b/goofy-client/apps/goofy-e2e/cypress-ci.json
index cbcd4bfb981c2d6443c05fe4925c05646c1c9325..084a420ec79ba1ddf02340bfe17f62db94a8b985 100644
--- a/goofy-client/apps/goofy-e2e/cypress-ci.json
+++ b/goofy-client/apps/goofy-e2e/cypress-ci.json
@@ -1,30 +1,22 @@
 {
-	"baseUrl": "https://e2e.dev.by.ozg-cloud.de",
 	"env": {
-		"dbUrl": "mongodb+srv://pluto-database-user:XnHhfznNWg65NNd@pluto-database-svc.sh-e2e-dev.svc.cluster.local/admin?ssl=false",
 		"database": "pluto-database",
-		"keycloakRealm": "by-e2e-local-dev",
-		"keycloakUrl": "https://sso.dev.by.ozg-cloud.de/",
 		"keycloakClient": "alfa"
 	},
 	"fileServerFolder": ".",
 	"fixturesFolder": "./src/fixtures",
-	"integrationFolder": "./src/integration",
 	"modifyObstructiveCode": false,
-	"pluginsFile": "./src/plugins/index",
-	"supportFile": "./src/support/index.ts",
 	"video": true,
-	"videosFolder": "./reports/videos",
-	"screenshotsFolder": "./reports/screenshots",
 	"chromeWebSecurity": false,
 	"reporter": "../../node_modules/cypress-mochawesome-reporter",
 	"defaultCommandTimeout": 10000,
+	"supportFile": "./src/support/e2e.ts",
+	"testIsolation": false,
 	"reporterOptions": {
 		"html": false,
 		"json": true,
 		"quite": true,
-		"reportDir": "./reports/mochawesome-report",
 		"reportFilename": "report",
 		"overwrite": false
 	}
-}
\ No newline at end of file
+}
diff --git a/goofy-client/apps/goofy-e2e/cypress.json b/goofy-client/apps/goofy-e2e/cypress.config.json
similarity index 84%
rename from goofy-client/apps/goofy-e2e/cypress.json
rename to goofy-client/apps/goofy-e2e/cypress.config.json
index 3b0a26d3b4eff62ab9c59c604f6363b12979da51..2eaa211f04655dea29923a5a9228dc5a98dcc19b 100644
--- a/goofy-client/apps/goofy-e2e/cypress.json
+++ b/goofy-client/apps/goofy-e2e/cypress.config.json
@@ -20,16 +20,15 @@
 	},
 	"fileServerFolder": ".",
 	"fixturesFolder": "./src/fixtures",
-	"integrationFolder": "./src/integration",
-	"modifyObstructiveCode": false,
-	"pluginsFile": "./src/plugins/index",
-	"supportFile": "./src/support/index.ts",
-	"video": true,
+	"video": false,
 	"videosFolder": "./reports/videos",
 	"screenshotsFolder": "./reports/screenshots",
 	"chromeWebSecurity": false,
 	"reporter": "../../node_modules/cypress-mochawesome-reporter",
 	"defaultCommandTimeout": 10000,
+	"specPattern": "src/e2e/**/*.cy.{js,jsx,ts,tsx}",
+	"supportFile": "src/support/e2e.ts",
+	"testIsolation": false,
 	"reporterOptions": {
 		"html": false,
 		"json": true,
@@ -37,4 +36,4 @@
 		"reportFilename": "report",
 		"overwrite": true
 	}
-}
\ No newline at end of file
+}
diff --git a/goofy-client/apps/goofy-e2e/cypress.config.ts b/goofy-client/apps/goofy-e2e/cypress.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..21b3aad9fb32db1ae98081e63a3facb256b3593a
--- /dev/null
+++ b/goofy-client/apps/goofy-e2e/cypress.config.ts
@@ -0,0 +1,15 @@
+import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset';
+import { defineConfig } from 'cypress';
+
+const cypressConfig = require('./cypress.config.json');
+const cypressEvents = require('./src/support/cypress-tasks.ts');
+
+export default defineConfig({
+	e2e: {
+		...nxE2EPreset(__dirname),
+		...cypressConfig,
+		setupNodeEvents(on, config) {
+			return cypressEvents(on, config);
+		}
+	},
+});
diff --git a/goofy-client/apps/goofy-e2e/docker-compose.yml b/goofy-client/apps/goofy-e2e/docker-compose.yml
index 31c7707a16771124d617049f524badcd5f0914f4..3b0a0ea591d1afed116ba0810a7b3cd6e49ecdc6 100644
--- a/goofy-client/apps/goofy-e2e/docker-compose.yml
+++ b/goofy-client/apps/goofy-e2e/docker-compose.yml
@@ -39,10 +39,11 @@ services:
       - SPRING_DATA_MONGODB_HOST=ozg-mongodb
       - SPRING_PROFILES_ACTIVE=${SPRING_PROFILE:-dev,e2e}
       - logging_level_org_springframework_security=${LOGGING_LEVEL:-WARN}
-      - SPRING_ELASTICSEARCH_URIS=http://ozg-elastic:9200
-      - SPRING_ELASTICSEARCH_USERNAME=elastic
-      - SPRING_ELASTICSEARCH_PASSWORD=password
-      - KOP_ELASTICSEARCH_INDEX=e2e-test-index
+      - OZGCLOUD_ELASTICSEARCH_ADDRESS=ozg-elastic:9200
+      - OZGCLOUD_ELASTICSEARCH_USERNAME=elastic
+      - OZGCLOUD_ELASTICSEARCH_PASSWORD=password
+      - OZGCLOUD_ELASTICSEARCH_INDEX=e2e-test-index
+      - OZGCLOUD_ELASTICSEARCH_USESSL=false
       - GRPC_CLIENT_USER_MANAGER_ADDRESS=static://ozg-usermanager:9000
       - GRPC_CLIENT_USER_MANAGER_NEGOTIATION_TYPE=PLAINTEXT
       - KOP_USERMANAGER_URL=http://localhost:9092/migration/user
@@ -98,12 +99,14 @@ services:
       interval: 10s
       timeout: 10s
       retries: 5
+
   ozg-usermanager:
     image: docker.ozg-sh.de/user-manager:${USERMANAGER_DOCKER_IMAGE:-snapshot-latest}
     platform: linux/amd64
     environment:
       - QUARKUS_HTTP_CORS_ORIGINS=http://localhost:4300,http://127.0.0.1:4300,https://e2e.dev.by.ozg-cloud.de
       - QUARKUS_OIDC_AUTH_SERVER_URL=https://sso.dev.by.ozg-cloud.de/realms/by-e2e-local-dev
+      - QUARKUS_LOG_CONSOLE_JSON=false
       - QUARKUS_OIDC_CLIENT_ID=alfa
       - KOP_KEYCLOAK_API_USER=usermanagerapiuser
       - KOP_KEYCLOAK_API_PASSWORD= 
diff --git a/goofy-client/apps/goofy-e2e/run-tests.sh b/goofy-client/apps/goofy-e2e/run-tests.sh
new file mode 100755
index 0000000000000000000000000000000000000000..cea8e1905a1f6ac1aa1b90a14769e0c6c86a1f79
--- /dev/null
+++ b/goofy-client/apps/goofy-e2e/run-tests.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+export NO_COLOR=1
+
+REPORT_FOLDER=$1
+CONFIG_FILE="${2:-cypress.config.ts}"
+
+echo "Run E2E for $REPORT_FOLDER with configuration apps/goofy-e2e/$CONFIG_FILE..."
+
+rm -rf apps/goofy-e2e/reports/${REPORT_FOLDER}
+
+npx cypress run --project apps/goofy-e2e --spec apps/goofy-e2e/src/e2e/${REPORT_FOLDER} --config-file $CONFIG_FILE
+
+TEST_RESULT=$?
+
+if [ -d "apps/goofy-e2e/reports/${REPORT_FOLDER}/mochawesome-report/.jsons" ]; then
+	mv apps/goofy-e2e/reports/${REPORT_FOLDER}/mochawesome-report/.jsons apps/goofy-e2e/reports/${REPORT_FOLDER}/mochawesome-report/jsons
+	npx mochawesome-merge apps/goofy-e2e/reports/${REPORT_FOLDER}/mochawesome-report/**/*.json > apps/goofy-e2e/reports/${REPORT_FOLDER}/report.json
+	# Workaround: mochawesome's "screenshotsFolder" value is not added in the generated HTML file. Add "screenshots" to image paths.
+	sed --in-place --regexp-extended 's/"([^"]*\.png)/"screenshots\1/' apps/goofy-e2e/reports/${REPORT_FOLDER}/report.json
+	npx marge apps/goofy-e2e/reports/${REPORT_FOLDER}/report.json -f report -o apps/goofy-e2e/reports/${REPORT_FOLDER}
+else
+	echo "ERROR: Reports do not exist at apps/goofy-e2e/reports/${REPORT_FOLDER}/mochawesome-report/.jsons"
+fi
+
+exit $TEST_RESULT
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/navigation/navigation.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/navigation/navigation.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/navigation/navigation.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/navigation/navigation.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward-fail.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward-fail.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward-fail.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward-fail.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-loeschen-anfordern.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-loeschen-anfordern.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-loeschen-anfordern.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-loeschen-anfordern.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/accessibility/vorgang-list.spec-e2e.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/accessibility/vorgang-list.cy.ts
similarity index 91%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/accessibility/vorgang-list.spec-e2e.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/accessibility/vorgang-list.cy.ts
index 5efa4507a3b79ec51e16f54d741debba372b1612..8ada47b1edcf7e7d636abc0cd8361557663d35ad 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/accessibility/vorgang-list.spec-e2e.ts
+++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/accessibility/vorgang-list.cy.ts
@@ -4,9 +4,9 @@ import { VorgangSearchE2EComponent } from 'apps/goofy-e2e/src/components/vorgang
 import { VorgangViewsE2EComponent } from 'apps/goofy-e2e/src/components/vorgang/vorgang-views.e2e.component';
 import { HeaderE2EComponent } from 'apps/goofy-e2e/src/page-objects/header.po';
 import { MainPage, waitForSpinnerToDisappear } from 'apps/goofy-e2e/src/page-objects/main.po';
-import { getFormField, isKeyboardFocused, isMatFocused } from 'apps/goofy-e2e/src/support/angular.util';
+import { isKeyboardFocused } from 'apps/goofy-e2e/src/support/angular.util';
 import { dropCollections, pressTab } from 'apps/goofy-e2e/src/support/cypress-helper';
-import { exist } from 'apps/goofy-e2e/src/support/cypress.util';
+import { exist, haveFocus } from 'apps/goofy-e2e/src/support/cypress.util';
 import { getUserManagerUserSabine, initUsermanagerUsers, loginAsSabine } from 'apps/goofy-e2e/src/support/user-util';
 
 describe('VorgangList Page', () => {
@@ -54,13 +54,7 @@ describe('VorgangList Page', () => {
 			it('should focus search field', () => {
 				pressTab();
 
-				isMatFocused(getFormField(vorgangSearch.getForm()));
-			})
-
-			it('should focus clear search button', () => {
-				pressTab();
-
-				isKeyboardFocused(vorgangSearch.getClearButton());
+				haveFocus(vorgangSearch.getInput());
 			})
 
 			it('should focus help menu icon', () => {
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/app/buildinfo.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/app/buildinfo.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/login-logout.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/app/login-logout.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/app/login-logout.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/app/login-logout.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/hint/no-organisations-einheit-id.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/hint/no-organisations-einheit-id.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/hint/no-organisations-einheit-id.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/hint/no-organisations-einheit-id.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/historie/historie.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/historie/historie.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/historie/historie.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/historie/historie.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-connection-timout.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-connection-timout.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-forbidden.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-forbidden.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-server-error.cy.ts
similarity index 98%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-server-error.cy.ts
index bbac0d37ed2ce91377bcd6da2b872ca4e0de9f6a..e57681f1ff5a596a9f12b28123f2e9ffe69f8531 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-server-error.cy.ts
@@ -65,7 +65,6 @@ describe('Interceptor Server Error', () => {
 
 		it('should show page', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
-			waitForSpinnerToDisappear();
 
 			waitOfInterceptor(interceptor).then(interception => {
 				assert(interception.response.statusCode, statusCode.toString());
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-unauthorized.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-unauthorized.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar-attachment/kommentar-attachment.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/kommentar-attachment/kommentar-attachment.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar-attachment/kommentar-attachment.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/kommentar-attachment/kommentar-attachment.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/kommentar/kommentar.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/kommentar/kommentar.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/endgueltig-loeschen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/endgueltig-loeschen.cy.ts
similarity index 96%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/endgueltig-loeschen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/endgueltig-loeschen.cy.ts
index f3588c671c47d3c7029f50e2f54434dce166ae86..18eba64a91139e1f089a1ce399f8729e5f95ba9b 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/endgueltig-loeschen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/endgueltig-loeschen.cy.ts
@@ -105,7 +105,8 @@ describe('Vorgang endgültig löschen', () => {
 		})
 	})
 
-	describe('Endgültig Löschen (ludwig löscht den Vorgang für den die sabine die Löschanforderung gestellt hat)', () => {
+	// TODO Warum exakt derselbe Test nochmal, nur mit objectIds[2] anstelle objectIds[1]?
+	describe.skip('Endgültig Löschen (ludwig löscht den Vorgang für den die sabine die Löschanforderung gestellt hat)', () => {
 
 		before(() => {
 			initVorgang(vorgangZuLoeschen);
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loesch-anforderung-zuruecknehmen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/loesch-anforderung-zuruecknehmen.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loesch-anforderung-zuruecknehmen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/loesch-anforderung-zuruecknehmen.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/loeschen-anfordern.cy.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/loeschen-anfordern.cy.ts
new file mode 100644
index 0000000000000000000000000000000000000000..36a11e3c361ee9bc887f01c49d229cf9dfa09a86
--- /dev/null
+++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/loeschen-anfordern.cy.ts
@@ -0,0 +1,360 @@
+import { registerLocaleData } from '@angular/common';
+import localeDe from '@angular/common/locales/de';
+import localeDeExtra from '@angular/common/locales/extra/de';
+import { KommentareInVorgangE2EComponent } from 'apps/goofy-e2e/src/components/kommentar/kommentar-list.e2e.component';
+import { PostfachMailE2EComponent } from 'apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component';
+import { UserProfileE2EComponent } from 'apps/goofy-e2e/src/components/user-profile/user-profile.component.e2e';
+import { VorgangFormularButtonsE2EComponent } from 'apps/goofy-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components';
+import { WiedervorlageInVorgangE2EComponent } from 'apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component';
+import { initVorgangAttachedItem } from 'apps/goofy-e2e/src/support/vorgang-attached-item-util';
+import { createWiedervorlageAttachedItem, createWiedervorlageUriByVorgangIdAndWiedervorlageId } from 'apps/goofy-e2e/src/support/wiedervorlage-util';
+import { SnackBarE2EComponent } from '../../../components/ui/snackbar.e2e.component';
+import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
+import { VorgangE2E, VorgangMessagesE2E, VorgangStatusE2E, vorgangStatusLabelE2E } from '../../../model/vorgang';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
+import { VorgangPage } from '../../../page-objects/vorgang.po';
+import { dropCollections, visitUrl } from '../../../support/cypress-helper';
+import { contains, exist, haveText, notExist } from '../../../support/cypress.util';
+import { loginAsLudwig, loginAsSabine } from '../../../support/user-util';
+import { buildVorgang, initVorgaenge, initVorgang, objectIds } from '../../../support/vorgang-util';
+
+registerLocaleData(localeDe, 'de', localeDeExtra);
+
+describe('Vorgang Löschen anfordern', () => {
+	const mainPage: MainPage = new MainPage();
+	const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList();
+	const snackBar: SnackBarE2EComponent = mainPage.getSnackBar();
+
+	const vorgangPage: VorgangPage = new VorgangPage();
+	const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons();
+
+	const vorgangNichtLoeschbar: VorgangE2E = { ...buildVorgang(objectIds[5], 'DoNichtLoeschbar'), status: VorgangStatusE2E.ABGESCHLOSSEN };
+
+	const vorgangAbgeschlossenLoeschenAnfordern: VorgangE2E = { ...buildVorgang(objectIds[0], 'DoAbgeschlossenLoeschenAnfordern'), status: VorgangStatusE2E.ABGESCHLOSSEN };
+	const vorgangAbgeschlossenLoeschenAnfordernRevoke: VorgangE2E = { ...buildVorgang(objectIds[1], 'DoAbgeschlossenRevokeLoeschenAnfordern'), status: VorgangStatusE2E.ABGESCHLOSSEN };
+
+	const vorgangVerworfenLoeschenAnfordern: VorgangE2E = { ...buildVorgang(objectIds[2], 'DoVerworfenLoeschenAnfordern'), status: VorgangStatusE2E.VERWORFEN };
+	const vorgangVerworfenLoeschenAnfordernRevoke: VorgangE2E = { ...buildVorgang(objectIds[3], 'DoVerworfenRevokeLoeschenAnfordern'), status: VorgangStatusE2E.VERWORFEN };
+
+	const wiedervorlageAttachedItem = createWiedervorlageAttachedItem(objectIds[4], vorgangAbgeschlossenLoeschenAnfordern._id.$oid);
+	const wiedervorlageUrl = createWiedervorlageUriByVorgangIdAndWiedervorlageId(objectIds[0], objectIds[4]);
+
+
+	describe('Nicht löschen (Ludwig kann keinen Vorgang löschen, für den er selbst die Löschanforderung gestellt hat)', () => {
+		before(() => {
+			initVorgang(vorgangNichtLoeschbar);
+
+			loginAsLudwig();
+
+			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
+		})
+
+		it('Öffne Vorgang für Löschanforderung', () => {
+			vorgangList.getListItem(vorgangNichtLoeschbar.name).getRoot().click();
+			waitForSpinnerToDisappear();
+
+			exist(vorgangPage.getVorgangDetailHeader().getRoot());
+		})
+
+		it('Vorgang ist im Status: Abgeschlossen', () => {
+			haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E.ABGESCHLOSSEN);
+		})
+
+		it('Löschen anfordern klicken', () => {
+			vorgangFormularButtons.getLoeschenAnfordernButton().click();
+			waitForSpinnerToDisappear();
+		})
+
+		it('Vorgang ist im Status: Zu Löschen', () => {
+			haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E.ZU_LOESCHEN);
+		})
+
+		it('Button zum Endgültig löschen ist nicht vorhanden', () => {
+			waitForSpinnerToDisappear();
+			notExist(vorgangFormularButtons.getEndgueltigLoeschenButton());
+		})
+	})
+
+	describe('with user Sabine', () => {
+		before(() => {
+			initVorgaenge([vorgangAbgeschlossenLoeschenAnfordern, vorgangAbgeschlossenLoeschenAnfordernRevoke, vorgangVerworfenLoeschenAnfordern, vorgangVerworfenLoeschenAnfordernRevoke]);
+			initVorgangAttachedItem([wiedervorlageAttachedItem]);
+
+			loginAsSabine();
+
+			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
+		})
+
+		after(() => {
+			dropCollections();
+		})
+
+		describe('Abgeschlossen: löschen anfordern', () => {
+
+			it('Open Vorgang-Detail-Page', () => {
+				vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getRoot().click();
+				waitForSpinnerToDisappear();
+
+				exist(vorgangPage.getVorgangDetailHeader().getRoot());
+			})
+
+			describe('by button', () => {
+
+				it('should have status Abgeschlossen', () => {
+					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenLoeschenAnfordern.status]);
+				})
+
+				it('should click Löschen anfordern button', () => {
+					vorgangFormularButtons.getLoeschenAnfordernButton().click();
+					waitForSpinnerToDisappear();
+				})
+
+				it('should show snackBar message', () => {
+					exist(snackBar.getCloseButton());
+					contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN)
+				})
+
+				it('should close snackBar', () => {
+					snackBar.getCloseButton().click();
+
+					notExist(snackBar.getMessage());
+				})
+
+				it('should have status zu Löschen', () => {
+					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]);
+				})
+
+				it('should redirect Wiedervorlage link to Vorgang', () => {
+					visitUrl(wiedervorlageUrl);
+
+					exist(vorgangPage.getVorgangDetailHeader().getRoot());
+				})
+
+				it('should show snackBar message', () => {
+					exist(snackBar.getCloseButton());
+					contains(snackBar.getMessage(), VorgangMessagesE2E.WIEDERVORLAGE_BEARBEITEN_NICHT_MOEGLICH)
+				})
+
+				it('should close snackBar', () => {
+					snackBar.getCloseButton().click();
+
+					notExist(snackBar.getMessage());
+				})
+
+				it('back to vorgang list', () => {
+					vorgangPage.getSubnavigation().getBackButton().click();
+					waitForSpinnerToDisappear();
+
+					exist(vorgangList.getRoot());
+				})
+
+				it('should have status zu Löschen', () => {
+					haveText(vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]);
+				})
+			})
+		})
+
+		describe('Disable functions', () => {
+
+			it('Open Vorgang-Detail-Page', () => {
+				vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getRoot().click();
+				waitForSpinnerToDisappear();
+
+				exist(vorgangPage.getVorgangDetailHeader().getRoot());
+			})
+
+			it('should not have add comment button', () => {
+				const kommentarContainer: KommentareInVorgangE2EComponent = vorgangPage.getKommentarContainer();
+
+				notExist(kommentarContainer.getHinzufuegenButton());
+			})
+
+			it('should disable edit comment', () => {
+				const kommentarContainer: KommentareInVorgangE2EComponent = vorgangPage.getKommentarContainer();
+
+				notExist(kommentarContainer.getFormular());
+			})
+
+			it('should not have create postfach mail buttons', () => {
+				const postfachMailContainer: PostfachMailE2EComponent = vorgangPage.getPostfachMailcontainer();
+
+				notExist(postfachMailContainer.getCreateButtonWithoutText());
+				notExist(postfachMailContainer.getCreateButtonWithText());
+			})
+
+			it('should not have add wiedervorlage button', () => {
+				const createWiedervorlageButton = vorgangPage.getWiedervorlagenContainer().getCreateWiedervorlageButton();
+
+				notExist(createWiedervorlageButton);
+			})
+
+			it('should disable open Wiedervorlage-Page link ', () => {
+				const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = vorgangPage.getWiedervorlagenContainer().getWiedervorlage('Wiedervorlage');
+
+				notExist(wiedervorlageInVorgang.getLink());
+			})
+
+			it('should not have user assign button', () => {
+				const userProfileContainer: UserProfileE2EComponent = vorgangPage.getVorgangDetailHeader().getUserContainer();
+
+				notExist(userProfileContainer.getRoot());
+			})
+
+			it('back to vorgang list', () => {
+				vorgangPage.getSubnavigation().getBackButton().click();
+				waitForSpinnerToDisappear();
+
+				exist(vorgangList.getRoot());
+			})
+
+		})
+
+		describe('Abgeschlossen: löschen anfordern und rückgängig machen', () => {
+
+			it('Open Vorgang-Detail-Page', () => {
+				vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordernRevoke.name).getRoot().click();
+				waitForSpinnerToDisappear();
+
+				exist(vorgangPage.getVorgangDetailHeader().getRoot());
+			})
+
+			describe('by icon-button', () => {
+
+				it('should have status Abgeschlossen', () => {
+					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenLoeschenAnfordernRevoke.status]);
+				})
+
+				it('should show snackBar message', () => {
+					vorgangPage.getSubnavigation().getLoeschenAnfordernByIconButton().click();
+					waitForSpinnerToDisappear();
+
+					exist(snackBar.getCloseButton());
+					contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN);
+				})
+
+				it('should close snackbar on revoke', () => {
+					snackBar.getRevokeButton().click();
+					waitForSpinnerToDisappear();
+
+					notExist(snackBar.getMessage());
+				})
+
+				it('should show status Abgeschlossen', () => {
+					notExist(vorgangPage.getProgressBar());
+
+					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]);
+				})
+
+				it('back to vorgang list', () => {
+					vorgangPage.getSubnavigation().getBackButton().click();
+					waitForSpinnerToDisappear();
+
+					exist(vorgangList.getRoot());
+				})
+
+				it('should have status Abgeschlossen', () => {
+					haveText(vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordernRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN])
+				})
+			})
+		})
+
+		describe('Verworfen: löschen anfordern', () => {
+
+			it('Open Vorgang-Detail-Page', () => {
+				vorgangList.getListItem(vorgangVerworfenLoeschenAnfordern.name).getRoot().click();
+				waitForSpinnerToDisappear();
+
+				exist(vorgangPage.getVorgangDetailHeader().getRoot());
+			})
+
+			describe('by button', () => {
+
+				it('should have status Verworfen', () => {
+					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerworfenLoeschenAnfordern.status]);
+				})
+
+				it('should show snackBar message', () => {
+					vorgangFormularButtons.getLoeschenAnfordernButton().click();
+					waitForSpinnerToDisappear();
+
+					exist(snackBar.getCloseButton());
+					contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN)
+				})
+
+				it('should close snackBar', () => {
+					snackBar.getCloseButton().click();
+
+					notExist(snackBar.getMessage());
+				})
+
+				it('should have status zu Löschen', () => {
+					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]);
+				})
+
+				it('back to vorgang list', () => {
+					vorgangPage.getSubnavigation().getBackButton().click();
+					waitForSpinnerToDisappear();
+
+					exist(vorgangList.getRoot());
+				})
+
+				it('should have status zu Löschen', () => {
+					haveText(vorgangList.getListItem(vorgangVerworfenLoeschenAnfordern.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]);
+				})
+			})
+		})
+
+		describe('Verworfen: löschen anfordern und rückgängig machen', () => {
+
+			it('Open Vorgang-Detail-Page', () => {
+				vorgangList.getListItem(vorgangVerworfenLoeschenAnfordernRevoke.name).getRoot().click();
+				waitForSpinnerToDisappear();
+
+				exist(vorgangPage.getVorgangDetailHeader().getRoot());
+			})
+
+			describe('by icon-button', () => {
+
+				it('should have status Verworfen', () => {
+					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerworfenLoeschenAnfordernRevoke.status]);
+				})
+
+				it('should show snackBar message', () => {
+					vorgangPage.getSubnavigation().getLoeschenAnfordernByIconButton().click();
+					waitForSpinnerToDisappear();
+
+					exist(snackBar.getCloseButton());
+					contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN);
+				})
+
+				it('should close snackbar on revoke', () => {
+					snackBar.getRevokeButton().click();
+					waitForSpinnerToDisappear();
+
+					notExist(snackBar.getMessage());
+				})
+
+				it('should show status Verworfen', () => {
+					notExist(vorgangPage.getProgressBar());
+
+					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]);
+				})
+
+				it('back to vorgang list', () => {
+					vorgangPage.getSubnavigation().getBackButton().click();
+					waitForSpinnerToDisappear();
+
+					exist(vorgangList.getRoot());
+				})
+
+				it('should have status Verworfen', () => {
+					haveText(vorgangList.getListItem(vorgangVerworfenLoeschenAnfordernRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN])
+				})
+			})
+		})
+	})
+});
+
+
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/navigation/navigation.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/navigation/navigation.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail-error.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail-error.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachicht-reply-button.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachicht-reply-button.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachicht-reply-button.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachicht-reply-button.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachrichten.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachrichten.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-current-user-icon.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-current-user-icon.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-current-user-icon.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-current-user-icon.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-assign-unassign.cy.ts
similarity index 98%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-assign-unassign.cy.ts
index e267803ff8184d7680b35e73605a6cd5826aee49..4acfd38edd15da225ef10614c795af3357ebc5d3 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-assign-unassign.cy.ts
@@ -28,7 +28,7 @@ import { UserE2E } from '../../../model/user';
 import { VorgangE2E } from '../../../model/vorgang';
 import { MainPage, waitForSpinnerToDisappear, waitforSpinnerToAppear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
-import { dropCollections } from '../../../support/cypress-helper';
+import { dropCollections, wait } from '../../../support/cypress-helper';
 import { enter, exist, haveText, notExist } from '../../../support/cypress.util';
 import { getUserDorothea, getUserManagerUserDorothea, getUserManagerUserSabine, getUserSabine, initUsermanagerUsers, loginAsSabine } from '../../../support/user-util';
 import { createVorgang, initVorgang } from '../../../support/vorgang-util';
@@ -169,6 +169,7 @@ describe('User Profile im ausgewählten Vorgang', () => {
 				it('should show assign icon', { defaultCommandTimeout: 30000 }, () => {
 					waitForSpinnerToDisappear();
 					// TODO Hier muss aufs Verarbeiten im Backend gewartet werden - oder: wait(500)
+					wait(500);
 					exist(userProfileContainer.getIconContainer().getAssignedIcon());
 					haveText(userProfileContainer.getIconContainer().getAssignedIcon(), userDorothea.initials)
 				})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-kommentar-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-kommentar-error.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-kommentar-error.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-kommentar-error.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-vorgang-error.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-vorgang-error.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-settings/user-settings.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-settings/user-settings.cy.ts
similarity index 96%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-settings/user-settings.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-settings/user-settings.cy.ts
index 567f42b87f294697c7ca0eab7eabba9ddcce8b39..0024b22de50c503cfa1fe9042b1f6da2110d2e1d 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-settings/user-settings.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-settings/user-settings.cy.ts
@@ -37,7 +37,6 @@ describe('User Settings', () => {
 	const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList();
 	const header: HeaderE2EComponent = mainPage.getHeader();
 	const userSettings: UserSettingsE2EComponent = header.getUserSettings();
-
 	const vorgang: VorgangE2E = createVorgang();
 
 	before(() => {
@@ -76,7 +75,7 @@ describe('User Settings', () => {
 		})
 
 		it('should switch toggle status', () => {
-			userSettings.getEmailBenachrichtigung().getRoot().click();
+			userSettings.getEmailBenachrichtigung().getToggle().click();
 
 			isChecked(userSettings.getEmailBenachrichtigung().getToggle());
 		})
@@ -96,7 +95,7 @@ describe('User Settings', () => {
 		})
 
 		it('should switch toggle status', () => {
-			userSettings.getDarkMode().getRoot().click();
+			userSettings.getDarkMode().getToggle().click();
 
 			isChecked(userSettings.getDarkMode().getToggle());
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-anhang/anhang-herunterladen.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-anhang/anhang-herunterladen.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-annehmen.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-annehmen.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-bearbeiten.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-bearbeiten.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-bescheiden.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-bescheiden.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-formdata.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht-formdata.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-formdata.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht-formdata.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-exportieren.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts
similarity index 89%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-exportieren.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts
index f860a6d99217dd94c8d807dd4c4f33bf92c4ff84..0e5cc6e24d453b4b316ee55d17045984eb1161ed 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-exportieren.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts
@@ -29,10 +29,11 @@ import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-lis
 import { VorgangE2E } from '../../../model/vorgang';
 import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
-import { dropCollections } from '../../../support/cypress-helper';
-import { exist, notExist } from '../../../support/cypress.util';
+import { countDownloadFiles, deleteDownloadFolder, dropCollections } from '../../../support/cypress-helper';
+import { exist, haveValue, notExist } from '../../../support/cypress.util';
 import { loginAsSabine } from '../../../support/user-util';
 import { createVorgang, initVorgaenge } from '../../../support/vorgang-util';
+import * as fs from 'fs';
 
 registerLocaleData(localeDe, 'de', localeDeExtra);
 
@@ -83,11 +84,14 @@ describe('Vorgang exportieren', () => {
 			exist(menuItem.getButton());
 		})
 
-		it('should download', () => {
+		it('should have 1 file in download folder after download', () => {
 			menuItem.getButton().click();
 
 			waitForSpinnerToDisappear();
-			//TODO In Cypress 10+ implement something like https://docs.cypress.io/api/commands/task#Return-number-of-files-in-the-folder
+			countDownloadFiles().then((count) => {
+				expect(count).to.eq(1);
+				deleteDownloadFolder();
+			});
 		})
 
 		it('should close menu after download', () => {
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-verwerfen.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-verwerfen.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedervorlage-loading.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedervorlage-loading.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedervorlage-loading.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedervorlage-loading.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-zurueckholen.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-zurueckholen.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-pages.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-pages.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-pages.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-pages.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-pagination.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-pagination.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-pagination.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-pagination.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-views-pages.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-views-pages.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-views-pages.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-views-pages.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list.search.cy.ts
similarity index 88%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list.search.cy.ts
index ac4f926faa23319149791317810064025a860a93..977ce30f2e623f7661b02f9ea3ad8ed672bfbfaf 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list.search.cy.ts
@@ -54,15 +54,19 @@ describe('VorgangList Suche', () => {
 		const vorgangToStay: VorgangE2E = { ...createVorgang(), name: 'VorgangToStay', eingangs: [eingang], assignedTo: getUserSabineInternalId() };
 
 		const vorgangToDisappear: VorgangE2E = { ...buildVorgang(objectIds[0], 'VorgangToDisappear'), status: VorgangStatusE2E.NEU };
+		const vorgangHyphen: VorgangE2E = { ...buildVorgang(objectIds[1], 'Vorgang-mit-Bindestrich'), status: VorgangStatusE2E.NEU };
+		const vorgangWOHyphen: VorgangE2E = { ...buildVorgang(objectIds[2], 'Vorgang mit Leerzeichen'), status: VorgangStatusE2E.NEU };
 
 		const vorgangStayInList: VorgangListItemE2EComponent = vorgangList.getListItem(vorgangToStay.name);
 		const vorgangDisappearInList: VorgangListItemE2EComponent = vorgangList.getListItem(vorgangToDisappear.name);
+		const vorgangHyphenInList: VorgangListItemE2EComponent = vorgangList.getListItem(vorgangHyphen.name);
+		const vorgangWOHyphenInList: VorgangListItemE2EComponent = vorgangList.getListItem(vorgangWOHyphen.name);
 
 		const userSabine: UserE2E = getUserSabine();
 
 		before(() => {
-			initVorgaenge([vorgangToStay, vorgangToDisappear]);
-			initSearchIndex([vorgangToStay, vorgangToDisappear]);
+			initVorgaenge([vorgangToStay, vorgangToDisappear, vorgangHyphen, vorgangWOHyphen]);
+			initSearchIndex([vorgangToStay, vorgangToDisappear, vorgangHyphen, vorgangWOHyphen]);
 			initUsermanagerUsers([getUserManagerUserSabine()]);
 
 			loginAsSabine();
@@ -84,6 +88,64 @@ describe('VorgangList Suche', () => {
 			notExist(vorgangDisappearInList.getRoot());
 		})
 
+		describe('Search for partial strings...', () => {
+			it ('should find partial string at the beginning', () => {
+				doSearchWith('VorgangToS');
+				waitForSpinnerToDisappear();
+
+				exist(vorgangStayInList.getRoot());
+			})
+
+			it ('should find partial string in the middle', () => {
+				doSearchWith('gangToSt');
+				waitForSpinnerToDisappear();
+
+				exist(vorgangStayInList.getRoot());
+			})
+
+			it ('should find partial string at the end, case insensitive', () => {
+				doSearchWith('toStay');
+				waitForSpinnerToDisappear();
+
+				exist(vorgangStayInList.getRoot());
+			})
+
+		})
+
+		describe ('Search with hyphen', () => {
+			it ('should find entry with hyphen', () => {
+				doSearchWith('Vorgang-mit');
+				waitForSpinnerToDisappear();
+
+				exist(vorgangHyphenInList.getRoot());
+				notExist(vorgangWOHyphenInList.getRoot());
+			})
+
+			it ('should find entry without hyphen', () => {
+				doSearchWith('Vorgang mit');
+				waitForSpinnerToDisappear();
+
+				notExist(vorgangHyphenInList.getRoot());
+				exist(vorgangWOHyphenInList.getRoot());
+			})
+		})
+
+		describe ('Search using AND operator', () => {
+			it ('should find entry with all matches', () => {
+				doSearchWith('Vorgang mit Leerzeichen');
+				waitForSpinnerToDisappear();
+
+				exist(vorgangWOHyphenInList.getRoot());
+			})
+
+			it ('should not find entry when using additional words', () => {
+				doSearchWith('Vorgang mit als Leerzeichen');
+				waitForSpinnerToDisappear();
+
+				notExist(vorgangWOHyphenInList.getRoot());
+			})
+		})
+
 		describe('navigate with filtered list to vorgang detail', () => {
 
 			beforeEach(() => {
@@ -172,8 +234,6 @@ describe('VorgangList Suche', () => {
 
 			it('should navigate back to list', () => {
 				vorgangPage.getSubnavigation().getBackButton().click();
-				exist(vorgangPage.getSpinner());
-				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
@@ -444,6 +504,7 @@ describe('VorgangList Suche', () => {
 	})
 
 
+
 	function doSearchWith(searchBy: string): void {
 		enterWith(vorgangSearch.getInput(), searchBy);
 	}
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-view-wiedervorlagen.pages.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-view-wiedervorlagen.pages.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-view-wiedervorlagen.pages.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-view-wiedervorlagen.pages.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-views-filter.spec-e2e.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-views-filter.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-views-filter.spec-e2e.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-views-filter.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts
similarity index 97%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts
index f3f81417223f0b351ef9711bd9644e8a644960e1..8d25b11950bd3be02aa1dd0048245a2a7b732985 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts
@@ -25,14 +25,14 @@ import { AttachmentContainerE2EComponent, AttachmentListE2EComponent } from 'app
 import { WiedervorlageSubnavigationE2EComponent } from 'apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-subnavigation';
 import { BinaryFileSnackbarMessageE2E } from 'apps/goofy-e2e/src/model/binary-file';
 import { WiedervorlageE2E } from 'apps/goofy-e2e/src/model/wiedervorlage';
-import { dropCollections, readFileFromDownloads } from 'apps/goofy-e2e/src/support/cypress-helper';
+import { dropCollections, readFileFromDownloads, wait } from 'apps/goofy-e2e/src/support/cypress-helper';
 import { initVorgangAttachedItem } from 'apps/goofy-e2e/src/support/vorgang-attached-item-util';
 import { SnackBarE2EComponent } from '../../../components/ui/snackbar.e2e.component';
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
 import { WiedervorlageInVorgangE2EComponent } from '../../../components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component';
 import { WiedervorlageE2EComponent } from '../../../components/wiedervorlage/wiedervorlage-page.e2e.component';
 import { VorgangE2E } from '../../../model/vorgang';
-import { MainPage, waitForSpinnerToDisappear, waitforSpinnerToAppear } from '../../../page-objects/main.po';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { WiedervorlagePage } from '../../../page-objects/wiedervorlage.po';
 import { containClass, contains, exist, haveLength, notContainClass, notExist } from '../../../support/cypress.util';
@@ -233,9 +233,9 @@ describe('Wiedervorlage attachments', () => {
 		const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage(WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF);
 
 		it('should open wiedervorlage page', () => {
+			wait(500);
 			wiedervorlageComp.getLink().click();
 
-			waitforSpinnerToAppear();
 			waitForSpinnerToDisappear();
 
 			exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
@@ -244,7 +244,6 @@ describe('Wiedervorlage attachments', () => {
 		it('should mark as erledigt', () => {
 			subnavigation.erledigen();
 
-			waitforSpinnerToAppear();
 			waitForSpinnerToDisappear();
 
 			containClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
@@ -260,7 +259,6 @@ describe('Wiedervorlage attachments', () => {
 		it('should mark as open', () => {
 			subnavigation.wiedereroeffnen();
 
-			waitforSpinnerToAppear();
 			waitForSpinnerToDisappear();
 
 			notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.cy.ts
similarity index 100%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.cy.ts
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.cy.ts
similarity index 99%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.cy.ts
index bf77d79dacff2e909c12074011363e1d445e68b4..45c8b354131803e75927e39787f1909a53eb8eb0 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.cy.ts
@@ -33,7 +33,7 @@ import { VorgangE2E } from '../../../model/vorgang';
 import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { WiedervorlagePage } from '../../../page-objects/wiedervorlage.po';
-import { dropCollections } from '../../../support/cypress-helper';
+import { dropCollections, wait } from '../../../support/cypress-helper';
 import { exist, haveText, haveValue, notExist } from '../../../support/cypress.util';
 import { MessagesE2E } from '../../../support/messages';
 import { formatDateLocal } from '../../../support/tech.util';
@@ -165,6 +165,7 @@ describe('Wiedervorlage', () => {
 		it('should open Wiedervorlage-Page by click on wiedervorlage ', () => {
 			const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = vorgangPage.getWiedervorlagenContainer().getWiedervorlage(wiedervorlageBetreff);
 
+			wait(500);
 			wiedervorlageInVorgang.getLink().click();
 			waitForSpinnerToDisappear();
 
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts
similarity index 99%
rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts
rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts
index 000e8fb12d3357f5360bc3cc3f00678a289a0c65..f9a7d8593f4e6a546c4c9e12a312b9290be4df5b 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts
@@ -98,6 +98,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
 		it('should open wiedervorlage on click', () => {
 			exist(wiedervorlage.getRoot());
 
+			wait(500);
 			wiedervorlage.getLink().click();
 			waitForSpinnerToDisappear();
 
@@ -135,7 +136,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
 		const wiedervorlage: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage(wiedervorlageZumWiedereroeffnen.betreff);
 
 		it('should open wiedervorlage on click', () => {
-			wait(1000);
+			wait(500);
 			wiedervorlage.getLink().click();
 			waitForSpinnerToDisappear();
 
@@ -173,6 +174,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
 		const wiedervorlage: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage(wiedervorlageZumWiedereroeffnen.betreff);
 
 		it('should open wiedervorlage on click', () => {
+			wait(500);
 			wiedervorlage.getLink().click();
 
 			waitForSpinnerToDisappear();
@@ -277,6 +279,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
 		})
 
 		it('should mark as erledigt', () => {
+			wait(500);
 			wiedervorlage.getLink().click();
 			waitForSpinnerToDisappear();
 			subnavigation.erledigen();
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loeschen-anfordern.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loeschen-anfordern.e2e-spec.ts
deleted file mode 100644
index 156be9773db19d271f55033173fea1701f818f86..0000000000000000000000000000000000000000
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loeschen-anfordern.e2e-spec.ts
+++ /dev/null
@@ -1,317 +0,0 @@
-import { registerLocaleData } from '@angular/common';
-import localeDe from '@angular/common/locales/de';
-import localeDeExtra from '@angular/common/locales/extra/de';
-import { KommentareInVorgangE2EComponent } from 'apps/goofy-e2e/src/components/kommentar/kommentar-list.e2e.component';
-import { PostfachMailE2EComponent } from 'apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component';
-import { UserProfileE2EComponent } from 'apps/goofy-e2e/src/components/user-profile/user-profile.component.e2e';
-import { VorgangFormularButtonsE2EComponent } from 'apps/goofy-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components';
-import { WiedervorlageInVorgangE2EComponent } from 'apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component';
-import { initVorgangAttachedItem } from 'apps/goofy-e2e/src/support/vorgang-attached-item-util';
-import { createWiedervorlageAttachedItem, createWiedervorlageUriByVorgangIdAndWiedervorlageId } from 'apps/goofy-e2e/src/support/wiedervorlage-util';
-import { SnackBarE2EComponent } from '../../../components/ui/snackbar.e2e.component';
-import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
-import { VorgangE2E, VorgangMessagesE2E, VorgangStatusE2E, vorgangStatusLabelE2E } from '../../../model/vorgang';
-import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
-import { VorgangPage } from '../../../page-objects/vorgang.po';
-import { dropCollections, visitUrl } from '../../../support/cypress-helper';
-import { contains, exist, haveText, notExist } from '../../../support/cypress.util';
-import { loginAsSabine } from '../../../support/user-util';
-import { buildVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util';
-
-registerLocaleData(localeDe, 'de', localeDeExtra);
-
-describe('Vorgang Löschen anfordern', () => {
-	const mainPage: MainPage = new MainPage();
-	const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList();
-	const snackBar: SnackBarE2EComponent = mainPage.getSnackBar();
-
-	const vorgangPage: VorgangPage = new VorgangPage();
-	const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons();
-
-	const vorgangAbgeschlossenLoeschenAnfordern: VorgangE2E = { ...buildVorgang(objectIds[0], 'DoAbgeschlossenLoeschenAnfordern'), status: VorgangStatusE2E.ABGESCHLOSSEN };
-	const vorgangAbgeschlossenLoeschenAnfordernRevoke: VorgangE2E = { ...buildVorgang(objectIds[1], 'DoAbgeschlossenRevokeLoeschenAnfordern'), status: VorgangStatusE2E.ABGESCHLOSSEN };
-
-	const vorgangVerworfenLoeschenAnfordern: VorgangE2E = { ...buildVorgang(objectIds[2], 'DoVerworfenLoeschenAnfordern'), status: VorgangStatusE2E.VERWORFEN };
-	const vorgangVerworfenLoeschenAnfordernRevoke: VorgangE2E = { ...buildVorgang(objectIds[3], 'DoVerworfenRevokeLoeschenAnfordern'), status: VorgangStatusE2E.VERWORFEN };
-
-	const wiedervorlageAttachedItem = createWiedervorlageAttachedItem(objectIds[4], vorgangAbgeschlossenLoeschenAnfordern._id.$oid);
-	const wiedervorlageUrl = createWiedervorlageUriByVorgangIdAndWiedervorlageId(objectIds[0], objectIds[4]);
-
-	before(() => {
-		initVorgaenge([vorgangAbgeschlossenLoeschenAnfordern, vorgangAbgeschlossenLoeschenAnfordernRevoke, vorgangVerworfenLoeschenAnfordern, vorgangVerworfenLoeschenAnfordernRevoke]);
-		initVorgangAttachedItem([wiedervorlageAttachedItem]);
-
-		loginAsSabine();
-
-		waitForSpinnerToDisappear();
-		exist(vorgangList.getRoot());
-	})
-
-	after(() => {
-		dropCollections();
-	})
-
-	describe('Abgeschlossen: löschen anfordern', () => {
-
-		it('Open Vorgang-Detail-Page', () => {
-			vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getRoot().click();
-			waitForSpinnerToDisappear();
-
-			exist(vorgangPage.getVorgangDetailHeader().getRoot());
-		})
-
-		describe('by button', () => {
-
-			it('should have status Abgeschlossen', () => {
-				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenLoeschenAnfordern.status]);
-			})
-
-			it('should click Löschen anfordern button', () => {
-				vorgangFormularButtons.getLoeschenAnfordernButton().click();
-				waitForSpinnerToDisappear();
-			})
-
-			it('should show snackBar message', () => {
-				exist(snackBar.getCloseButton());
-				contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN)
-			})
-
-			it('should close snackBar', () => {
-				snackBar.getCloseButton().click();
-
-				notExist(snackBar.getMessage());
-			})
-
-			it('should have status zu Löschen', () => {
-				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]);
-			})
-
-			it('should redirect Wiedervorlage link to Vorgang', () => {
-				visitUrl(wiedervorlageUrl);
-
-				exist(vorgangPage.getVorgangDetailHeader().getRoot());
-			})
-
-			it('should show snackBar message', () => {
-				exist(snackBar.getCloseButton());
-				contains(snackBar.getMessage(), VorgangMessagesE2E.WIEDERVORLAGE_BEARBEITEN_NICHT_MOEGLICH)
-			})
-
-			it('should close snackBar', () => {
-				snackBar.getCloseButton().click();
-
-				notExist(snackBar.getMessage());
-			})
-
-			it('back to vorgang list', () => {
-				vorgangPage.getSubnavigation().getBackButton().click();
-				waitForSpinnerToDisappear();
-
-				exist(vorgangList.getRoot());
-			})
-
-			it('should have status zu Löschen', () => {
-				haveText(vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]);
-			})
-		})
-	})
-
-	describe('Disable functions', () => {
-
-		it('Open Vorgang-Detail-Page', () => {
-			vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getRoot().click();
-			waitForSpinnerToDisappear();
-
-			exist(vorgangPage.getVorgangDetailHeader().getRoot());
-		})
-
-		it('should not have add comment button', () => {
-			const kommentarContainer: KommentareInVorgangE2EComponent = vorgangPage.getKommentarContainer();
-
-			notExist(kommentarContainer.getHinzufuegenButton());
-		})
-
-		it('should disable edit comment', () => {
-			const kommentarContainer: KommentareInVorgangE2EComponent = vorgangPage.getKommentarContainer();
-
-			notExist(kommentarContainer.getFormular());
-		})
-
-		it('should not have create postfach mail buttons', () => {
-			const postfachMailContainer: PostfachMailE2EComponent = vorgangPage.getPostfachMailcontainer();
-
-			notExist(postfachMailContainer.getCreateButtonWithoutText());
-			notExist(postfachMailContainer.getCreateButtonWithText());
-		})
-
-		it('should not have add wiedervorlage button', () => {
-			const createWiedervorlageButton = vorgangPage.getWiedervorlagenContainer().getCreateWiedervorlageButton();
-
-			notExist(createWiedervorlageButton);
-		})
-
-		it('should disable open Wiedervorlage-Page link ', () => {
-			const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = vorgangPage.getWiedervorlagenContainer().getWiedervorlage('Wiedervorlage');
-
-			notExist(wiedervorlageInVorgang.getLink());
-		})
-
-		it('should not have user assign button', () => {
-			const userProfileContainer: UserProfileE2EComponent = vorgangPage.getVorgangDetailHeader().getUserContainer();
-
-			notExist(userProfileContainer.getRoot());
-		})
-
-		it('back to vorgang list', () => {
-			vorgangPage.getSubnavigation().getBackButton().click();
-			waitForSpinnerToDisappear();
-
-			exist(vorgangList.getRoot());
-		})
-
-	})
-
-	describe('Abgeschlossen: löschen anfordern und rückgängig machen', () => {
-
-		it('Open Vorgang-Detail-Page', () => {
-			vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordernRevoke.name).getRoot().click();
-			waitForSpinnerToDisappear();
-
-			exist(vorgangPage.getVorgangDetailHeader().getRoot());
-		})
-
-		describe('by icon-button', () => {
-
-			it('should have status Abgeschlossen', () => {
-				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenLoeschenAnfordernRevoke.status]);
-			})
-
-			it('should show snackBar message', () => {
-				vorgangPage.getSubnavigation().getLoeschenAnfordernByIconButton().click();
-				waitForSpinnerToDisappear();
-
-				exist(snackBar.getCloseButton());
-				contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN);
-			})
-
-			it('should close snackbar on revoke', () => {
-				snackBar.getRevokeButton().click();
-				waitForSpinnerToDisappear();
-
-				notExist(snackBar.getMessage());
-			})
-
-			it('should show status Abgeschlossen', () => {
-				notExist(vorgangPage.getProgressBar());
-
-				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]);
-			})
-
-			it('back to vorgang list', () => {
-				vorgangPage.getSubnavigation().getBackButton().click();
-				waitForSpinnerToDisappear();
-
-				exist(vorgangList.getRoot());
-			})
-
-			it('should have status Abgeschlossen', () => {
-				haveText(vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordernRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN])
-			})
-		})
-	})
-
-	describe('Verworfen: löschen anfordern', () => {
-
-		it('Open Vorgang-Detail-Page', () => {
-			vorgangList.getListItem(vorgangVerworfenLoeschenAnfordern.name).getRoot().click();
-			waitForSpinnerToDisappear();
-
-			exist(vorgangPage.getVorgangDetailHeader().getRoot());
-		})
-
-		describe('by button', () => {
-
-			it('should have status Verworfen', () => {
-				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerworfenLoeschenAnfordern.status]);
-			})
-
-			it('should show snackBar message', () => {
-				vorgangFormularButtons.getLoeschenAnfordernButton().click();
-				waitForSpinnerToDisappear();
-
-				exist(snackBar.getCloseButton());
-				contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN)
-			})
-
-			it('should close snackBar', () => {
-				snackBar.getCloseButton().click();
-
-				notExist(snackBar.getMessage());
-			})
-
-			it('should have status zu Löschen', () => {
-				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]);
-			})
-
-			it('back to vorgang list', () => {
-				vorgangPage.getSubnavigation().getBackButton().click();
-				waitForSpinnerToDisappear();
-
-				exist(vorgangList.getRoot());
-			})
-
-			it('should have status zu Löschen', () => {
-				haveText(vorgangList.getListItem(vorgangVerworfenLoeschenAnfordern.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]);
-			})
-		})
-	})
-
-	describe('Verworfen: löschen anfordern und rückgängig machen', () => {
-
-		it('Open Vorgang-Detail-Page', () => {
-			vorgangList.getListItem(vorgangVerworfenLoeschenAnfordernRevoke.name).getRoot().click();
-			waitForSpinnerToDisappear();
-
-			exist(vorgangPage.getVorgangDetailHeader().getRoot());
-		})
-
-		describe('by icon-button', () => {
-
-			it('should have status Verworfen', () => {
-				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerworfenLoeschenAnfordernRevoke.status]);
-			})
-
-			it('should show snackBar message', () => {
-				vorgangPage.getSubnavigation().getLoeschenAnfordernByIconButton().click();
-				waitForSpinnerToDisappear();
-
-				exist(snackBar.getCloseButton());
-				contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN);
-			})
-
-			it('should close snackbar on revoke', () => {
-				snackBar.getRevokeButton().click();
-				waitForSpinnerToDisappear();
-
-				notExist(snackBar.getMessage());
-			})
-
-			it('should show status Verworfen', () => {
-				notExist(vorgangPage.getProgressBar());
-
-				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]);
-			})
-
-			it('back to vorgang list', () => {
-				vorgangPage.getSubnavigation().getBackButton().click();
-				waitForSpinnerToDisappear();
-
-				exist(vorgangList.getRoot());
-			})
-
-			it('should have status Verworfen', () => {
-				haveText(vorgangList.getListItem(vorgangVerworfenLoeschenAnfordernRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN])
-			})
-		})
-	})
-});
diff --git a/goofy-client/apps/goofy-e2e/src/support/angular.util.ts b/goofy-client/apps/goofy-e2e/src/support/angular.util.ts
index 5e8d4a3a61c850949129eab62fe897145b264583..27c4f58ca783429f3ead8a3ba2eb0d4a7fa062f9 100644
--- a/goofy-client/apps/goofy-e2e/src/support/angular.util.ts
+++ b/goofy-client/apps/goofy-e2e/src/support/angular.util.ts
@@ -26,7 +26,7 @@ import { containClass, mouseEnter, notContainClass } from './cypress.util';
 export const TOGGLE_ELEMENT: string = 'mat-slide-toggle';
 
 enum AngularClassesE2E {
-	MAT_CHECKED = 'mat-checked',
+	MAT_CHECKED = 'mat-mdc-slide-toggle-checked',
 	MAT_BUTTONG_TOGGLE_CHECKED = 'mat-button-toggle-checked',
 	MAT_FOCUSED = 'mat-focused',
 	CDK_KEYBOARD_FOCUSED = 'cdk-keyboard-focused'
diff --git a/goofy-client/apps/goofy-e2e/src/support/commands.ts b/goofy-client/apps/goofy-e2e/src/support/commands.ts
index b471f61dedb7e41b8cb8a347fae48748cb85d269..7ee49c952b9212d5f85a12852ec954b71951e011 100644
--- a/goofy-client/apps/goofy-e2e/src/support/commands.ts
+++ b/goofy-client/apps/goofy-e2e/src/support/commands.ts
@@ -1,3 +1,4 @@
+
 /*
  * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
  * Ministerpräsidenten des Landes Schleswig-Holstein
@@ -21,6 +22,53 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+enum HttpMethod {
+	POST = 'POST',
+	GET = 'GET'
+}
+
+interface HttpHeader {
+	[headerKey: string]: string
+}
+
+const DATA_TEST_ID: string = 'data-test-id';
+const DATA_TEST_CLASS: string = 'data-test-class';
+
+const ACCES_TOKEN: string = 'access_token';
+const ID_TOKEN: string = 'id_token';
+
+enum Header {
+	CONTENT_TYPE = 'Content-Type',
+	AUTHORIZATION = 'Authorization'
+}
+
+const CYPRESS_CONFIG_BASE_URL: unknown = 'baseUrl';
+
+enum CypressEnv {
+	KEYCLOAK_CLIENT = 'keycloakClient',
+	KEYCLOAK_REALM = 'keycloakRealm',
+	KEYCLOAK_URL = 'keycloakUrl',
+	SEARCH = 'search'
+}
+
+const CONTENT_TYPE_HEADER_VALUE: string = 'application/x-www-form-urlencoded';
+
+interface SearchIndex {
+	vorgangId: string,
+	vorgangName: string,
+	vorgangNummer: string,
+	createdAt: string,
+	antragstellerName: string,
+	antragstellerVorname: string,
+	status: string,
+	organisationseinheitenId: string,
+	aktenzeichen: string,
+	assignedTo: string,
+	_class: string
+}
+
+const SEARCH_INDEX_CLASS: string = 'de.itvsh.ozg.pluto.common.search.IndexedVorgang';
+
 declare namespace Cypress {
 	interface Chainable<Subject> {
 		getTestElementWithOid(oid: string, ...args);
@@ -36,12 +84,13 @@ declare namespace Cypress {
 	}
 }
 
+
 Cypress.Commands.add('getTestElement', (selector, ...args) => {
-	return cy.get(`[data-test-id~="${selector}"]`, ...args)
+	return cy.get(`[${DATA_TEST_ID}~="${selector}"]`, ...args)
 })
 
 Cypress.Commands.add('getTestElementWithClass', (selector, ...args) => {
-	return cy.get(`[data-test-class="${selector}"]`, ...args)
+	return cy.get(`[${DATA_TEST_CLASS}="${selector}"]`, ...args)
 })
 
 Cypress.Commands.add('getTestElementWithOid', (oid, ...args) => {
@@ -49,63 +98,73 @@ Cypress.Commands.add('getTestElementWithOid', (oid, ...args) => {
 })
 
 Cypress.Commands.add('findTestElementWithClass', { prevSubject: true }, (subject: any, selector) => {
-	return subject.find(`[data-test-class="${selector}"]`)
+	return subject.find(`[${DATA_TEST_CLASS}="${selector}"]`)
 })
 
 Cypress.Commands.add('findElement', { prevSubject: true }, (subject: any, selector) => {
 	return subject.find(selector);
 })
 
-Cypress.Commands.add('login', (user, password) => {
-	cy.logout();
+Cypress.Commands.add('login', (user: string, password: string) => {
+	cy.session(user, () => {
+		cy.request(buildLoginRequest(user, password)).then(response => handleLoginResponse(response));
+	});
+})
 
-	cy.request({
-		method: 'POST',
+function buildLoginRequest(user: string, password: string): any {
+	return {
+		method: HttpMethod.POST,
 		followRedirect: false,
 		url: `${getKeycloakBaseRealmUrl()}/token`,
 		headers: {
-			'Content-Type': 'application/x-www-form-urlencoded'
+			[Header.CONTENT_TYPE]: CONTENT_TYPE_HEADER_VALUE
 		},
-		body: {
-			client_id: Cypress.env('keycloakClient'),
-			username: user,
-			password: password,
-			grant_type: 'password',
-			redirect_uri: Cypress.config('baseUrl'),
-			response_mode: 'fragment',
-			response_type: 'code',
-			scope: 'openid'
-		}
-	}).then(response => {
-		const token = response.body.access_token;
-		const authorization: any = `bearer ${token}`;
+		body: buildLoginRequestBody(user, password)
+	}
+}
 
-		cy.visit('', authorization);
+function buildLoginRequestBody(user: string, password: string): any {
+	return {
+		client_id: Cypress.env(CypressEnv.KEYCLOAK_CLIENT),
+		username: user,
+		password: password,
+		grant_type: 'password',
+		redirect_uri: Cypress.config(CYPRESS_CONFIG_BASE_URL),
+		response_mode: 'fragment',
+		response_type: 'code',
+		scope: 'openid'
+	}
+}
 
-		window.sessionStorage.setItem('access_token', token);
-		window.sessionStorage.setItem('id_token', token);
-	});
-})
+function handleLoginResponse(response): void {
+	const authorization: any = `bearer ${response.body.access_token}`;
+	cy.visit('', authorization);
+
+	window.sessionStorage.setItem(ACCES_TOKEN, response.body.access_token);
+	window.sessionStorage.setItem(ID_TOKEN, response.body.id_token);
+
+	cy.setCookie('XSRF-TOKEN', response.body.session_state);
+}
 
 Cypress.Commands.add('getUserInfo', () => {
 	return cy.request({
-		method: 'GET',
+		method: HttpMethod.GET,
 		url: `${getKeycloakBaseRealmUrl()}/userinfo`,
 		headers: {
-			Authorization: `bearer ${window.sessionStorage.getItem('access_token')}`
+			[Header.AUTHORIZATION]: `bearer ${window.sessionStorage.getItem(ACCES_TOKEN)}`
 		}
 	});
 })
 
 Cypress.Commands.add('logout', () => {
 	cy.request({
-		method: 'GET',
+		method: HttpMethod.GET,
 		url: `${getKeycloakBaseRealmUrl()}/logout`,
 		headers: {
-			'Content-Type': 'application/x-www-form-urlencoded'
+			[Header.CONTENT_TYPE]: CONTENT_TYPE_HEADER_VALUE
 		},
 		body: {
-			refresh_token: window.sessionStorage.getItem('id_token')
+			refresh_token: window.sessionStorage.getItem(ID_TOKEN)
 		},
 		failOnStatusCode: false
 	}).then(() => {
@@ -116,62 +175,62 @@ Cypress.Commands.add('logout', () => {
 })
 
 function getKeycloakBaseRealmUrl(): string {
-	return `${Cypress.env('keycloakUrl')}realms/${Cypress.env('keycloakRealm')}/protocol/openid-connect`;
+	return `${Cypress.env(CypressEnv.KEYCLOAK_URL)}realms/${Cypress.env(CypressEnv.KEYCLOAK_REALM)}/protocol/openid-connect`;
 }
 
 Cypress.Commands.add('addVorgangToSearchIndex', (vorgang) => {
 	cy.request({
-		method: 'POST',
+		method: HttpMethod.POST,
 		url: `${buildSearchIndexPostUrl()}/_doc/${vorgang._id.$oid}`,
 		headers: buildAuthorizationHeader(),
 		body: buildSearchIndexBody(vorgang)
 	});
 })
 
-function buildSearchIndexBody(vorgang) {
+function buildSearchIndexBody(vorgang: any): SearchIndex {
 	return {
-		'_class': 'de.itvsh.ozg.pluto.common.search.IndexedVorgang',
-		'vorgangId': vorgang._id.$oid,
-		'vorgangName': vorgang.name,
-		'vorgangNummer': vorgang.nummer,
-		'createdAt': vorgang.createdAt.$date,
-		'antragstellerName': vorgang.eingangs[0].antragsteller.nachname,
-		'antragstellerVorname': vorgang.eingangs[0].antragsteller.vorname,
-		'status': vorgang.status,
-		'organisationseinheitenId': vorgang.eingangs[0].zustaendigeStelle.organisationseinheitenId,
-		'aktenzeichen': vorgang.aktenzeichen,
-		'assignedTo': vorgang.assignedTo
+		vorgangId: vorgang._id.$oid,
+		vorgangName: vorgang.name,
+		vorgangNummer: vorgang.nummer,
+		createdAt: vorgang.createdAt.$date,
+		antragstellerName: vorgang.eingangs[0].antragsteller.nachname,
+		antragstellerVorname: vorgang.eingangs[0].antragsteller.vorname,
+		status: vorgang.status,
+		organisationseinheitenId: vorgang.eingangs[0].zustaendigeStelle.organisationseinheitenId,
+		aktenzeichen: vorgang.aktenzeichen,
+		assignedTo: vorgang.assignedTo,
+		_class: SEARCH_INDEX_CLASS,
 	};
 }
 
 Cypress.Commands.add('removeAllDocumentsFromSearchIndex', () => {
 	cy.request({
-		method: 'POST',
+		method: HttpMethod.POST,
 		url: `${buildSearchIndexPostUrl()}/_delete_by_query`,
 		headers: buildAuthorizationHeader(),
 		body: buildSearchIndexRemoveAllBody()
 	});
 })
 
-function buildSearchIndexPostUrl() {
-	const searchEnv = getSearchEnv();
+function buildSearchIndexPostUrl(): string {
+	const searchEnv: string = getSearchEnv();
 	return `${searchEnv['url']}/${searchEnv['index']}`;
 }
 
-function buildAuthorizationHeader() {
-	return { 'Authorization': `Basic ${buildToken()}` };
+function buildAuthorizationHeader(): HttpHeader {
+	return { [Header.AUTHORIZATION]: `Basic ${buildToken()}` };
 }
 
-function buildToken() {
-	const searchEnv = getSearchEnv();
+function buildToken(): string {
+	const searchEnv: string = getSearchEnv();
 	return btoa(`${searchEnv['user']}:${searchEnv['password']}`);
 }
 
-function getSearchEnv() {
-	return Cypress.env('search');
+function getSearchEnv(): string {
+	return Cypress.env(CypressEnv.SEARCH);
 }
 
-function buildSearchIndexRemoveAllBody() {
+function buildSearchIndexRemoveAllBody(): any {
 	return {
 		'query': {
 			'match_all': {}
diff --git a/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts b/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts
index bde71f182f74051db676b6bf41da1e23ff93072c..62b64501d57ac8bfed9e3492f184b01eae723a5f 100644
--- a/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts
+++ b/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts
@@ -37,6 +37,8 @@ enum CypressTasks {
 	INIT_VORGANG_DATA = 'initVorgangData',
 	INIT_VORGANG_ATTACHED_ITEM_DATA = 'initVorgangAttachedItemData',
 	INIT_USERMANAGER_DATA = 'initUsermanagerData',
+	COUNT_FILES = 'countFiles',
+	DELETE_FOLDER = 'deleteFolder'
 }
 
 enum MongoCollections {
@@ -48,6 +50,8 @@ enum MongoCollections {
 	USER = "User"
 }
 
+const DOWNLOAD_FOLDER: string = 'cypress/downloads';
+
 export function login(userJsonPath: string): void {
 	cy.fixture(userJsonPath).then(user => {
 		cy.login(user.name, user.password);
@@ -108,6 +112,14 @@ export function dropCollections() {
 	cy.task(CypressTasks.DROP_USER_MANAGER_COLLECTIONS, [MongoCollections.USER]);
 }
 
+export function countDownloadFiles(): Cypress.Chainable<number> {
+	return cy.task(CypressTasks.COUNT_FILES, DOWNLOAD_FOLDER);
+}
+
+export function deleteDownloadFolder(): void {
+	cy.task(CypressTasks.DELETE_FOLDER, DOWNLOAD_FOLDER);
+}
+
 export function scrollToWindowBottom(): void {
 	cy.window().scrollTo('bottom');
 }
@@ -143,7 +155,7 @@ export function reload(): void {
 }
 
 export function readFileFromDownloads(fileName: string) {
-	return cy.readFile(`cypress/downloads/${fileName}`);
+	return cy.readFile(`${DOWNLOAD_FOLDER}/${fileName}`);
 }
 
 export function pressTab(): void {
diff --git a/goofy-client/apps/goofy-e2e/src/plugins/index.js b/goofy-client/apps/goofy-e2e/src/support/cypress-tasks.ts
similarity index 77%
rename from goofy-client/apps/goofy-e2e/src/plugins/index.js
rename to goofy-client/apps/goofy-e2e/src/support/cypress-tasks.ts
index 9067346ec0edddf16dbf03231458902863ac2cb2..d92b9e80d3c05c57f3e62671449e84d4ecd40f5b 100644
--- a/goofy-client/apps/goofy-e2e/src/plugins/index.js
+++ b/goofy-client/apps/goofy-e2e/src/support/cypress-tasks.ts
@@ -1,49 +1,9 @@
-/*
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-/// <reference types="cypress" />
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-/**
- * @type {Cypress.PluginConfig}
- */
-const MongoClient = require('mongodb').MongoClient;
+import { rmdir } from 'fs';
+import { Long, MongoClient, ObjectId } from 'mongodb';
+
 const Binary = require('mongodb').Binary;
-const ObjectId = require('mongodb').ObjectId;
-const Long = require('mongodb').Long;
 
-module.exports = (on, config) => {
+module.exports = (on: any, config: any) => {
 	on('task', {
 		initCommandData({collection, data}) {
 			console.log('initCommandData');
@@ -84,7 +44,16 @@ module.exports = (on, config) => {
 			console.log('dropUserManagerCollections: ', collections);
 			dropUserManagerCollectionsFromDatabase(config, collections);
 			return 0;
-		}
+		},
+		countFiles(folderName:string) {
+			console.log('counting files in folder %s', folderName);
+			return countFiles(folderName);					
+		},
+		deleteFolder(folderName:string) {
+			console.log('deleting folder %s', folderName);
+			deleteFolder(folderName);
+			return 0;
+		},
 	});
 
 	// Workaround für Angular 13 und Cypress mit Webpack 4,
@@ -98,32 +67,32 @@ module.exports = (on, config) => {
 	// Lösung:
 	//   - NPM-Paket identifizieren, dass "SystemDateTimeProvider" enthält.
 	//   - NPM-Paket im "test" Attribut unten hinzufügen.
-    const webpackPreprocessor = require('@cypress/webpack-batteries-included-preprocessor');
-    const webpackOptions = webpackPreprocessor.defaultOptions.webpackOptions;
-
-    webpackOptions.module.rules.unshift({
-        test: /[/\\](@angular|@ngxp|angular-oauth2-oidc)[/\\].+\.m?js$/,
-        resolve: {
-            fullySpecified: false,
-        },
-        use: {
-            loader: 'babel-loader',
-            options: {
-                plugins: ['@angular/compiler-cli/linker/babel'],
-                compact: false,
-                cacheDirectory: true
-            }
-        }
-    });
-
-    on('file:preprocessor', webpackPreprocessor({
-        webpackOptions: webpackOptions,
-        typescript: require.resolve('typescript')
-    }));
-
-    return config;
+	const webpackPreprocessor = require('@cypress/webpack-batteries-included-preprocessor');
+	const webpackOptions = webpackPreprocessor.defaultOptions.webpackOptions;
+
+	webpackOptions.module.rules.unshift({
+		test: /[/\\](@angular|@ngxp|angular-oauth2-oidc)[/\\].+\.m?js$/,
+		resolve: {
+			fullySpecified: false,
+		},
+		use: {
+			loader: 'babel-loader',
+			options: {
+				plugins: ['@angular/compiler-cli/linker/babel'],
+				compact: false,
+				cacheDirectory: true
+			}
+		}
+	});
+
+	on('file:preprocessor', webpackPreprocessor({
+		webpackOptions: webpackOptions,
+		typescript: require.resolve('typescript')
+	}));
+
+	return config;
 	// Ende - Workaround für Angular 13 und Cypress mit Webpack 4
-};
+}
 
 function parseCommandData(commands) {
 	commands.forEach(command => parseCommand(command))
@@ -336,4 +305,28 @@ function dropCollections(databaseUrl, databaseName, collections){
 			});
 		}
 	});
+}
+
+function countFiles(folderName:string): Promise<number> {
+	return new Promise((resolve, reject) => {
+		fs.readdir(folderName, (err, files) => {
+			if (err) {
+				console.error(err)
+				return reject(err)
+			}
+			resolve(files.length)
+		})
+	})
+}
+
+function deleteFolder(folderName:string): void {
+	new Promise((resolve, reject) => {
+		rmdir(folderName, { maxRetries: 10, recursive: true }, (err) => {
+			if (err) {
+				console.error(err)
+				return reject(err)
+			}
+			resolve(null)
+		})
+	})
 }
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/support/cypress.util.ts b/goofy-client/apps/goofy-e2e/src/support/cypress.util.ts
index c37486aab81955a516338c2fd08ce5f240decb09..ee3a1ea7f04adbec0e2fbc08c692e6b6c7fa5130 100644
--- a/goofy-client/apps/goofy-e2e/src/support/cypress.util.ts
+++ b/goofy-client/apps/goofy-e2e/src/support/cypress.util.ts
@@ -48,6 +48,10 @@ export function haveValue(element: any, value: string): void {
 	element.should('have.value', value);
 }
 
+export function haveFocus(element: any): void {
+	element.should('have.focus');
+}
+
 export function mouseEnter(element: any): void {
 	element.trigger('mouseenter');
 }
diff --git a/goofy-client/apps/goofy-e2e/src/support/index.ts b/goofy-client/apps/goofy-e2e/src/support/e2e.ts
similarity index 92%
rename from goofy-client/apps/goofy-e2e/src/support/index.ts
rename to goofy-client/apps/goofy-e2e/src/support/e2e.ts
index 3648b5106f64d556365991da18f0c4054d5c2cd8..dfe690bf49b054326bcc103a14ee37e6f209efdb 100644
--- a/goofy-client/apps/goofy-e2e/src/support/index.ts
+++ b/goofy-client/apps/goofy-e2e/src/support/e2e.ts
@@ -43,28 +43,26 @@ import 'cypress-timestamps/support';
 import './commands';
 import './file-upload';
 
-Cypress.Cookies.defaults({
-	preserve: ['XSRF-TOKEN', 'session_id']
-})
-
 Cypress.on('command:start', ({ attributes }) => {
 	if (attributes.type === 'parent') {
-		Cypress.log({ name: `${new Date().toISOString()} - ${attributes.name}` });
+		Cypress.log({
+			name: `${new Date().toISOString()} - ${attributes.name}`,
+		});
 	}
-})
+});
 
 Cypress.on('after:screenshot', ({ testFailure, takenAt }) => {
 	if (testFailure) {
 		console.log(`Error at: ${takenAt}`);
 	}
-})
+});
 
 Cypress.on('fail', (err) => {
 	console.error(err);
 	err.message = new Date().toISOString() + '\n' + err.message;
 	throw err;
-})
+});
 
 Cypress.Keyboard.defaults({
 	keystrokeDelay: 30,
-})
\ No newline at end of file
+});
diff --git a/goofy-client/apps/goofy-e2e/src/support/pre-ea-report-merge.ts b/goofy-client/apps/goofy-e2e/src/support/pre-ea-report-merge.ts
deleted file mode 100644
index 656abb5c66310317a87aa181d77a0c6ed3838a8a..0000000000000000000000000000000000000000
--- a/goofy-client/apps/goofy-e2e/src/support/pre-ea-report-merge.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-const fs = require('fs')
-
-if (fs.existsSync('apps/goofy-e2e/reports_einheitlicher-ansprechpartner/mochawesome-report/.jsons')) {
-	fs.rename('apps/goofy-e2e/reports_einheitlicher-ansprechpartner/mochawesome-report/.jsons', 'apps/goofy-e2e/reports_einheitlicher-ansprechpartner/mochawesome-report/jsons', () => { })
-}
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/support/tech.util.ts b/goofy-client/apps/goofy-e2e/src/support/tech.util.ts
index fb41b54279a6218940dd985f5600cce9566dd0bb..f8fcc0bfe39b31c84546cc045d4ccde00e60de3c 100644
--- a/goofy-client/apps/goofy-e2e/src/support/tech.util.ts
+++ b/goofy-client/apps/goofy-e2e/src/support/tech.util.ts
@@ -77,7 +77,7 @@ export function replaceAllWhitespaces(value: string, replaceWith: string): strin
 }
 
 export function simpleTransliteration(value: string) {
-	return value.normalize('NFKD').replace(/[^-_\w]/g, '');
+	return value.normalize('NFKD').replace(/[^-A-Za-z0-9_]/g, '');
 }
 
 export function createDateToday(): string {
diff --git a/goofy-client/apps/goofy-e2e/start-e2e-environment.sh b/goofy-client/apps/goofy-e2e/start-e2e-environment.sh
index 1a90b7fb229e8069532eacd82d3b588e386eda5f..092840b925f24cb6d11854056d22903aeeaee27b 100755
--- a/goofy-client/apps/goofy-e2e/start-e2e-environment.sh
+++ b/goofy-client/apps/goofy-e2e/start-e2e-environment.sh
@@ -49,7 +49,7 @@ SPRING_PROFILE=dev,e2e,initSearchIndex docker compose -f ${SCRIPT_DIR}/docker-co
 echo
 
 waitForInitSearchIndex() {
-	(docker compose -f ${SCRIPT_DIR}/docker-compose.yml logs | fgrep -q 'Successful filled up index - exiting')
+	(docker compose -f ${SCRIPT_DIR}/docker-compose.yml logs | grep -F -q 'Successful filled up index - exiting')
 }
 
 echo "Waiting for Pluto to finish search index initialisation."
diff --git a/goofy-client/apps/goofy-e2e/tsconfig.e2e.json b/goofy-client/apps/goofy-e2e/tsconfig.e2e.json
deleted file mode 100644
index 9dc3660a79ee2f6daf097b4930427223896e3b25..0000000000000000000000000000000000000000
--- a/goofy-client/apps/goofy-e2e/tsconfig.e2e.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "extends": "./tsconfig.json",
-  "compilerOptions": {
-    "sourceMap": false,
-    "outDir": "../../dist/out-tsc",
-    "allowJs": true,
-    "types": ["cypress", "node"]
-  },
-  "include": ["src/**/*.ts", "src/**/*.js"]
-}
diff --git a/goofy-client/apps/goofy-e2e/tsconfig.json b/goofy-client/apps/goofy-e2e/tsconfig.json
index 4d866746dae60576fad661bfa3985ab75aa31ca4..2cdee4db8b30c135503582f5274a1387ec8cd70c 100644
--- a/goofy-client/apps/goofy-e2e/tsconfig.json
+++ b/goofy-client/apps/goofy-e2e/tsconfig.json
@@ -1,16 +1,28 @@
 {
-  "extends": "../../tsconfig.base.json",
-  "files": [],
-  "include": ["**/*.ts"],
-  "compilerOptions": {
-	"sourceMap": false,
-	"target": "es2020",
-	"lib": ["es2018", "dom"],
-	"types": ["cypress", "cypress-real-events"]
-  },
-  "references": [
-    {
-      "path": "./tsconfig.e2e.json"
-    }
-  ]
-}
\ No newline at end of file
+	"extends": "../../tsconfig.base.json",
+	"compilerOptions": {
+		"sourceMap": false,
+		"outDir": "../dist/out-tsc",
+		"allowJs": true,
+		"types": ["cypress", "node"],
+		"forceConsistentCasingInFileNames": true,
+		"strict": false,
+		"noImplicitOverride": true,
+		"noPropertyAccessFromIndexSignature": true,
+		"noImplicitReturns": true,
+		"noFallthroughCasesInSwitch": true
+	},
+	"include": [
+		"src/**/*.ts",
+		"src/**/*.js",
+		"cypress.config.ts",
+		"cypress-ci-main-tests.config.ts",
+		"cypress-ci-einheitlicher-ansprechpartner.config.ts"
+	],
+	"angularCompilerOptions": {
+		"enableI18nLegacyMessageIdFormat": false,
+		"strictInjectionParameters": true,
+		"strictInputAccessModifiers": true,
+		"strictTemplates": true
+	}
+}
diff --git a/goofy-client/apps/goofy/src/app/app.component.scss b/goofy-client/apps/goofy/src/app/app.component.scss
index 4dd788aa6079c689f30997c800d07109e98d6651..1ebfa234f6bc360bdf66124f9678766a2b1cacfe 100644
--- a/goofy-client/apps/goofy/src/app/app.component.scss
+++ b/goofy-client/apps/goofy/src/app/app.component.scss
@@ -21,9 +21,9 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "breakpoints";
-@import "include-media/dist/include-media";
-@import "variables";
+@import 'breakpoints';
+@import 'include-media/dist/include-media';
+@import 'variables';
 
 :host {
 	display: flex;
diff --git a/goofy-client/apps/goofy/src/app/app.component.ts b/goofy-client/apps/goofy/src/app/app.component.ts
index 8305b387d4d53659caac1ee8e19822d5616ba8cf..2e0fc5facff518c0542061467910a2d1871db99c 100644
--- a/goofy-client/apps/goofy/src/app/app.component.ts
+++ b/goofy-client/apps/goofy/src/app/app.component.ts
@@ -34,8 +34,6 @@ import { JwksValidationHandler } from 'angular-oauth2-oidc-jwks';
 import { Environment } from 'libs/environment-shared/src/lib/environment.model';
 import { Observable, Subscription, filter, tap } from 'rxjs';
 
-// import * as VorgangNavigationUtil from 'libs/vorgang-shared/src/lib/vorgang-navigation.util';
-
 @Component({
 	selector: 'goofy-client-root',
 	templateUrl: './app.component.html',
diff --git a/goofy-client/apps/goofy/src/app/app.module.ts b/goofy-client/apps/goofy/src/app/app.module.ts
index a942a062498bfd992178e15bda0ff0499cfba0b8..0d17c27bbea8ba41941edabdb7953bc5960eb089 100644
--- a/goofy-client/apps/goofy/src/app/app.module.ts
+++ b/goofy-client/apps/goofy/src/app/app.module.ts
@@ -25,7 +25,6 @@ import { registerLocaleData } from '@angular/common';
 import { HttpClientModule } from '@angular/common/http';
 import localeDe from '@angular/common/locales/de';
 import { LOCALE_ID, NgModule } from '@angular/core';
-import { MAT_LEGACY_TOOLTIP_DEFAULT_OPTIONS as MAT_TOOLTIP_DEFAULT_OPTIONS, MatLegacyTooltipDefaultOptions as MatTooltipDefaultOptions } from '@angular/material/legacy-tooltip';
 import { BrowserModule } from '@angular/platform-browser';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { RouterModule, Routes, UrlSerializer } from '@angular/router';
@@ -53,12 +52,6 @@ const routes: Routes = [
 	}
 ];
 
-const tooltipDefaults: MatTooltipDefaultOptions = {
-	showDelay: 400,
-	hideDelay: 0,
-	touchendHideDelay: 0,
-};
-
 @NgModule({
 	declarations: [
 		AppComponent,
@@ -100,7 +93,6 @@ const tooltipDefaults: MatTooltipDefaultOptions = {
 	],
 	providers: [
 		{ provide: LOCALE_ID, useValue: 'de' },
-		{ provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: tooltipDefaults },
 		{ provide: UrlSerializer, useClass: OzgCloudUrlSerializer }
 	],
 	bootstrap: [AppComponent]
diff --git a/goofy-client/apps/goofy/src/assets/benutzerleitfaden/Benutzerleitfaden_2.5.pdf b/goofy-client/apps/goofy/src/assets/benutzerleitfaden/benutzerleitfaden.pdf
similarity index 51%
rename from goofy-client/apps/goofy/src/assets/benutzerleitfaden/Benutzerleitfaden_2.5.pdf
rename to goofy-client/apps/goofy/src/assets/benutzerleitfaden/benutzerleitfaden.pdf
index 5eaf5b9a75ad9306680fd53fca81f625a3f3ec9b..616272da40889365f202e39955b5462d6b59080e 100644
Binary files a/goofy-client/apps/goofy/src/assets/benutzerleitfaden/Benutzerleitfaden_2.5.pdf and b/goofy-client/apps/goofy/src/assets/benutzerleitfaden/benutzerleitfaden.pdf differ
diff --git a/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss b/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss
index 2f6575848e0e05d025087e1cd1725444a8823580..8b60dd8b0a5e39df11d05c0ce8b88bd80386b710 100644
--- a/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss
+++ b/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss
@@ -70,4 +70,6 @@ $goofyDarkTheme: mat.define-dark-theme((
 	)
 ));
 
-$default-font-size: 16px;
\ No newline at end of file
+$default-font-size: 16px;
+
+$iconHeight: 24px;
\ No newline at end of file
diff --git a/goofy-client/apps/goofy/src/styles/base/_setup.scss b/goofy-client/apps/goofy/src/styles/base/_setup.scss
index 501db613c485655f83cbf47b8c6321d2ae92577d..02ffa48cc627960dd9224a2043e76b943575ca06 100644
--- a/goofy-client/apps/goofy/src/styles/base/_setup.scss
+++ b/goofy-client/apps/goofy/src/styles/base/_setup.scss
@@ -37,16 +37,3 @@ body {
 	margin: 0;
 	font-family: Roboto, "Helvetica Neue", sans-serif;
 }
-
-.mat-tooltip {
-	font-size: 12px !important;
-	padding-top: 2px !important;
-	padding-bottom: 2px !important;
-	margin-top: 2px !important;
-	margin-bottom: 2px !important;
-	white-space: pre-line;
-
-	&.word-break {
-		word-break: break-word;
-	}
-}
diff --git a/goofy-client/apps/goofy/src/styles/layout/_main.scss b/goofy-client/apps/goofy/src/styles/layout/_main.scss
index 43d583b22eef71e47af93a8cea9a1a8b9f865134..e026b1fffd5e57d0ed81d9fed9c86f623ffe8f58 100644
--- a/goofy-client/apps/goofy/src/styles/layout/_main.scss
+++ b/goofy-client/apps/goofy/src/styles/layout/_main.scss
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
- @import "variables";
+ @import 'variables';
 
 .l-scroll-area {
 	height: calc(100vh - $header-height - $navigation-height);
diff --git a/goofy-client/apps/goofy/src/styles/main.scss b/goofy-client/apps/goofy/src/styles/main.scss
index 4a6d88927261ec690aa55acb4f6e1115ff349d5e..01997706ad624cc9d8c32872e78cb5f088cfbe79 100644
--- a/goofy-client/apps/goofy/src/styles/main.scss
+++ b/goofy-client/apps/goofy/src/styles/main.scss
@@ -28,12 +28,18 @@
 @import 'abstracts/variables';
 @import 'base/setup';
 @import 'layout/main';
-@import 'material/tabs';
+@import 'material/autocomplete';
+@import 'material/button';
+@import 'material/dialog';
+@import 'material/formfield';
 @import 'material/icons';
+@import 'material/list';
+@import 'material/menu';
+@import 'material/snackbar';
+@import 'material/tabs';
+@import 'material/typography';
 @import 'libs/navigation/src/lib/header-container/header/header.theme';
 @import 'libs/ui/src/lib/ui/expansion-panel/expansion-panel.theme';
-@import 'libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.theme';
-@import 'libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.theme';
 @import 'libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.theme';
 @import 'libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-breadcrumb-container/wiedervorlage-breadcrumb/wiedervorlage-breadcrumb.theme';
 @import 'libs/binary-file/src/lib/binary-file-container/binary-file/binary-file.theme';
@@ -47,33 +53,25 @@
 @import 'libs/ui/src/lib/ui/button-toggle/button-toogle.theme';
 @import 'libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/_vorgang-filter-item.theme.scss';
 @import 'libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss';
-@import 'libs/user-assistance/src/lib/help-menu/_help-menu.theme.scss';
 
-// TODO(v15): As of v15 mat.legacy-core no longer includes default typography styles.
-//  The following line adds:
-//    1. Default typography styles for all components
-//    2. Styles for typography hierarchy classes (e.g. .mat-headline-1)
-//  If you specify typography styles for the components you use elsewhere, you should delete this line.
-//  If you don't need the default component typographies but still want the hierarchy styles,
-//  you can delete this line and instead use:
-//    `@include mat.legacy-typography-hierarchy(mat.define-legacy-typography-config());`
-@include mat.all-legacy-component-typographies();
-@include mat.legacy-core();
+@include mat.all-component-typographies();
+@include mat.core();
 
 @mixin custom-components-theme($theme) {
 	@include expansion-panel($theme);
-	@include button-with-spinner($theme);
+	@include button($theme);
 	@include breadcrumb($theme);
 	@include search-container($theme);
 	@include user-profile-icon($theme);
 	@include internal-server-error-dialog($theme);
+	@include autocomplete($theme);
 }
 
-@include mat.all-legacy-component-themes($goofyTheme);
+@include mat.all-component-themes($goofyTheme);
 @include custom-components-theme($goofyTheme);
 
 
 body.dark {
-	@include mat.all-legacy-component-colors($goofyDarkTheme);
+	@include mat.all-component-colors($goofyDarkTheme);
 	@include custom-components-theme($goofyDarkTheme);
 }
\ No newline at end of file
diff --git a/goofy-client/apps/goofy/src/styles/material/_autocomplete.scss b/goofy-client/apps/goofy/src/styles/material/_autocomplete.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c825d087cb75ed7e3e335beab2811bd59f5050de
--- /dev/null
+++ b/goofy-client/apps/goofy/src/styles/material/_autocomplete.scss
@@ -0,0 +1,74 @@
+@use 'sass:map';
+@use '@angular/material' as mat;
+@use 'variables';
+
+@mixin autocomplete($theme) {
+	$color-config: mat.get-color-config($theme);
+	$primary-palette: map.get($color-config, 'primary');
+
+	.cdk-overlay-pane {
+		&:before {
+			content: "";
+			height: 7px;
+			width: 100%;
+			position: absolute;
+			top: -6px;
+			background: inherit;
+			z-index: 2;
+		}
+	}
+
+	goofy-client-vorgang-search {
+
+		button.mat-mdc-icon-button.mat-mdc-button-base {
+			padding: 8px;
+			width: 40px;
+			height: 40px;
+		}
+
+		.mdc-text-field--no-label:not(.mdc-text-field--outlined):not(.mdc-text-field--textarea) .mat-mdc-form-field-infix {
+			padding: 0.4375em 0;
+			min-height: auto;
+		}
+
+	}
+
+	.mdc-menu-surface.mat-mdc-autocomplete-panel.vorgang-search {
+		max-height: calc(100vh - $header-height);
+		max-width: 600px;
+		width: calc(600px - (800px - 100vw));
+		height: auto;
+		box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.4);
+		position: relative;
+		border-bottom-left-radius: 20px;
+		border-bottom-right-radius: 20px;
+		margin-left: -40px;
+		padding: 0;
+
+		.mat-mdc-option {
+			border-top: 1px solid rgba(0, 0, 0, 0.08);
+			font-size: 14px;
+			padding: 0.5rem 1rem;
+			margin-bottom: 0 !important;
+
+			&:first-child {
+				border-top: none;
+			}
+
+			.mdc-list-item__primary-text {
+				flex-grow: 1;
+			}
+
+			.line .date {
+				span {
+					vertical-align: middle;
+				}
+				mat-icon {
+					margin-right: 0.25rem;
+					min-width: 1.5rem;
+					vertical-align: middle;
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/goofy-client/apps/goofy/src/styles/material/_button.scss b/goofy-client/apps/goofy/src/styles/material/_button.scss
new file mode 100644
index 0000000000000000000000000000000000000000..3511c217cb7cf10c50da10a2cdb0b00f025bf639
--- /dev/null
+++ b/goofy-client/apps/goofy/src/styles/material/_button.scss
@@ -0,0 +1,28 @@
+@use 'sass:map';
+@use '@angular/material' as mat;
+
+@mixin button($theme) {
+	$color-config: mat.get-color-config($theme);
+	$primary: map.get($color-config, 'primary');
+
+	goofy-client-ozgcloud-button-with-spinner,
+	goofy-client-ozgcloud-stroked-button-with-spinner {
+		.mat-primary svg path {
+			fill: mat.get-color-from-palette($primary);
+		}
+	}
+
+	.mdc-button {
+		mat-icon {
+			font-size: 24px !important;
+			width: 24px !important;
+			height: 24px !important
+		}
+
+	}
+
+	.mat-mdc-unelevated-button > .mat-icon, .mat-mdc-raised-button > .mat-icon, .mat-mdc-outlined-button > .mat-icon {
+		margin-left: 0 !important;
+		margin-right: 0 !important;
+	}
+}
diff --git a/goofy-client/apps/goofy/src/styles/material/_dialog.scss b/goofy-client/apps/goofy/src/styles/material/_dialog.scss
new file mode 100644
index 0000000000000000000000000000000000000000..638b9851e6b8f6dd2ccb5347db8d4cc2d50cb0a7
--- /dev/null
+++ b/goofy-client/apps/goofy/src/styles/material/_dialog.scss
@@ -0,0 +1,37 @@
+@use 'sass:map';
+@use '@angular/material' as mat;
+
+@mixin internal-server-error-dialog($theme) {
+	$color-config: mat.get-color-config($theme);
+	$primary-palette: map.get($color-config, 'primary');
+
+	h1 {
+		color: mat.get-color-from-palette($primary-palette) !important;
+		font-size: 24px !important;
+		font-weight: normal !important;
+	}
+
+	.mat-mdc-dialog-title {
+		margin-bottom: 0 !important;
+		padding-top: 16px !important;
+	}
+
+	goofy-client-fixed-dialog .mat-mdc-dialog-title {
+		margin-bottom: 0 !important;
+		padding-top: 0 !important;
+	}
+
+
+	.mdc-dialog__title::before {
+		height: 0 !important;
+	}
+
+	.mat-mdc-dialog-content .mdc-dialog__content,
+	.mdc-dialog .mdc-dialog__content {
+		padding-bottom: 24px !important;
+	}
+
+	.mat-mdc-dialog-actions {
+		padding: 0 24px 24px 24px !important;
+	}
+}
diff --git a/goofy-client/apps/goofy/src/styles/material/_expansion-panel.scss b/goofy-client/apps/goofy/src/styles/material/_expansion-panel.scss
index e1a97f29006c5f3c0c4d315cefb0612c1bc58327..94c3ebb197867f03b3cc58bc97500638717f6e30 100644
--- a/goofy-client/apps/goofy/src/styles/material/_expansion-panel.scss
+++ b/goofy-client/apps/goofy/src/styles/material/_expansion-panel.scss
@@ -21,7 +21,70 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "variables";
+@use 'sass:map';
+@use '@angular/material' as mat;
+@import 'variables';
+
+@mixin expansion-panel($theme) {
+	$color-config: mat.get-color-config($theme);
+	$primary-palette: map.get($color-config, 'primary');
+
+	goofy-client-expansion-panel h3 {
+		color: mat.get-color-from-palette($primary-palette);
+	}
+
+	body.mat-typography goofy-client-expansion-panel {
+		.mat-expansion-panel-header {
+			padding: 0 !important;
+			height: 44px !important;
+		}
+
+		h3 {
+			margin-bottom: 0;
+			font-weight: 500;
+			margin-left: 16px;
+			font-size: 16px;
+		}
+
+		.mat-expansion-panel-body {
+			padding: 0 0 16px 56px;
+		}
+
+		goofy-client-expansion-panel {
+			.mat-expansion-panel-header {
+				height: 40px !important;
+			}
+
+			h3 {
+				color: inherit;
+				font-size: 14px !important;
+				font-weight: 500 !important;
+				margin-left: 0;
+			}
+
+			.mat-expansion-panel-header-title {
+				flex-direction: row-reverse;
+				justify-content: flex-end;
+			}
+
+			.mat-expansion-panel-body {
+				padding: 0 0 0 16px;
+			}
+		}
+	}
+
+	body.mat-typography goofy-client-expansion-panel-with-user {
+		.mat-expansion-panel-body {
+			padding: 0 0 0 32px;
+		}
+	}
+
+	.section.wiedervorlagen {
+		.mat-expansion-panel-body .mat-expansion-panel-body {
+			padding: 0 0 0 24px;
+		}
+	}
+}
 
 .mat-expansion-panel {
 	display: flex;
@@ -35,4 +98,4 @@
 
 :host-context(.dark) .mat-expansion-panel {
 	background: $darkBackgroundExpansionPanelLike;
-}
\ No newline at end of file
+}
diff --git a/goofy-client/apps/goofy/src/styles/material/_formfield.scss b/goofy-client/apps/goofy/src/styles/material/_formfield.scss
new file mode 100644
index 0000000000000000000000000000000000000000..61ac051ae0d6b54d10df9a57cad587aadc6b7a2d
--- /dev/null
+++ b/goofy-client/apps/goofy/src/styles/material/_formfield.scss
@@ -0,0 +1,25 @@
+goofy-client-vorgang-search {
+	.mdc-text-field--filled,
+	.mdc-text-field--filled:hover {
+		.mdc-line-ripple::before,
+		.mdc-line-ripple::after {
+			border-bottom: none;
+		}
+	}
+
+	.mat-mdc-form-field-focus-overlay,
+	.mdc-text-field--filled:not(.mdc-text-field--disabled) {
+		background-color: transparent !important;
+	}
+}
+
+goofy-client-fixed-dialog {
+	.mat-mdc-form-field-focus-overlay,
+	.mdc-text-field--filled:not(.mdc-text-field--disabled) {
+		background-color: transparent !important;
+	}
+
+	.mdc-text-field {
+		padding: 0;
+	}
+}
diff --git a/goofy-client/apps/goofy/src/styles/material/_list.scss b/goofy-client/apps/goofy/src/styles/material/_list.scss
new file mode 100644
index 0000000000000000000000000000000000000000..5426fe1965fa84fa868e75182228e4599a50a6d7
--- /dev/null
+++ b/goofy-client/apps/goofy/src/styles/material/_list.scss
@@ -0,0 +1,33 @@
+body.dark {
+	.mdc-list-item--with-leading-icon .mdc-list-item__start,
+	.mdc-list-item__secondary-text {
+		color: white !important;
+	}
+}
+
+.mdc-list-item--with-leading-icon .mdc-list-item__start,
+.mdc-list-item__secondary-text {
+	color: rgba(0, 0, 0, 0.87) !important;
+}
+
+.mdc-list-item--with-leading-icon .mdc-list-item__start {
+	margin: 0 !important;
+	line-height: 24px !important;
+}
+
+.mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-one-line,
+.mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines {
+	height: auto !important;
+}
+
+.mdc-list-item__secondary-text::before {
+	height: auto !important;
+}
+
+.mdc-list-item__content {
+	padding-left: 6px;
+}
+
+.mdc-list-item {
+	margin-bottom: 8px;
+}
\ No newline at end of file
diff --git a/goofy-client/apps/goofy/src/styles/material/_menu.scss b/goofy-client/apps/goofy/src/styles/material/_menu.scss
new file mode 100644
index 0000000000000000000000000000000000000000..ceaa8694f07f76a50469b040daa6848fa42db7d7
--- /dev/null
+++ b/goofy-client/apps/goofy/src/styles/material/_menu.scss
@@ -0,0 +1,17 @@
+@use 'variables';
+
+.mat-mdc-menu-panel.mat-mdc-menu-panel {
+	max-width: 365px !important;
+	background-color: $background;
+}
+
+goofy-client-help-menu {
+	.mat-mdc-fab {
+		box-shadow: none !important;
+		background-color: transparent !important;
+		border-radius: 10px;
+		height: 40px;
+		width: auto;
+		padding: 0.5rem;
+	}
+}
\ No newline at end of file
diff --git a/goofy-client/apps/goofy/src/styles/material/_snackbar.scss b/goofy-client/apps/goofy/src/styles/material/_snackbar.scss
new file mode 100644
index 0000000000000000000000000000000000000000..659851a0dbc6abc8401af672111e881639dc9be1
--- /dev/null
+++ b/goofy-client/apps/goofy/src/styles/material/_snackbar.scss
@@ -0,0 +1,49 @@
+.mat-mdc-snack-bar-container {
+	goofy-client-snackbar-info > button {
+		color: #2196f3 !important;
+		height: 24px !important;
+	}
+}
+
+.mat-mdc-snack-bar-container.error {
+	.mdc-snackbar__surface {
+		background-color: transparent !important;
+		box-shadow: none !important;
+	}
+
+	.mdc-snackbar__label {
+		padding-top: 11px !important;
+		padding-bottom: 11px !important;
+		color: black !important;
+	}
+
+	.mat-mdc-button-persistent-ripple, .mat-mdc-button-ripple {
+        display: none;
+    }
+
+	min-width: 240px;
+	max-width: 90vw;
+
+	border: 3px solid mat.get-color-from-palette($warnPalette);
+	border-radius: 4px;
+	background-color: lighten(mat.get-color-from-palette($warnPalette), 38%);
+	box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
+	color: rgba(#000, 0.89);
+	position: relative;
+
+	&:before {
+		position: absolute;
+		content: url("/assets/icons/error_outline_white.svg");
+		display: block;
+		background-color: mat.get-color-from-palette($warnPalette);
+		left: 0;
+		top: 0;
+		padding: 11px 9px 11px 7px;
+		color: #fff;
+		height: 100%;
+	}
+
+	> div {
+		margin-left: 44px;
+	}
+}
diff --git a/goofy-client/apps/goofy/src/styles/material/_tabs.scss b/goofy-client/apps/goofy/src/styles/material/_tabs.scss
index af0f1fd585243198566b53656e777d0455ae3912..3cfafb3bb42f45f37fd86fc9aea0b3bef823e346 100644
--- a/goofy-client/apps/goofy/src/styles/material/_tabs.scss
+++ b/goofy-client/apps/goofy/src/styles/material/_tabs.scss
@@ -21,14 +21,17 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-.mat-tab-label {
+.mat-mdc-tab-header {
+	border-bottom: 1px solid rgba(0, 0, 0, 0.12);
+}
+.mat-mdc-tab {
 	padding: 0 !important;
 	min-width: auto !important;
-	margin: 0 12px;
+	margin: 0 12px !important;
 	&:first-child {
-		margin-left: 0;
+		margin-left: 0 !important;
 	}
 	&:last-child {
-		margin-right: 0;
+		margin-right: 0 !important;
 	}
 }
diff --git a/goofy-client/apps/goofy/src/styles/material/_tooltip.scss b/goofy-client/apps/goofy/src/styles/material/_tooltip.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c900b9ece70d04818a1d1b39c76a7a8d4596eec0
--- /dev/null
+++ b/goofy-client/apps/goofy/src/styles/material/_tooltip.scss
@@ -0,0 +1,12 @@
+.mat-tooltip {
+	font-size: 12px !important;
+	padding-top: 2px !important;
+	padding-bottom: 2px !important;
+	margin-top: 2px !important;
+	margin-bottom: 2px !important;
+	white-space: pre-line;
+
+	&.word-break {
+		word-break: break-word;
+	}
+}
diff --git a/goofy-client/apps/goofy/src/styles/material/_typography.scss b/goofy-client/apps/goofy/src/styles/material/_typography.scss
new file mode 100644
index 0000000000000000000000000000000000000000..f0f7ab67a35609d1a675770005b367a1b63b7f7d
--- /dev/null
+++ b/goofy-client/apps/goofy/src/styles/material/_typography.scss
@@ -0,0 +1,10 @@
+.mdc-button,
+.mdc-tab,
+.mdc-fab--extended,
+.mat-mdc-form-field,
+.mat-mdc-floating-label,
+.mat-mdc-menu-content,
+.mdc-list-item__primary-text,
+.mat-mdc-dialog-container .mdc-dialog__content {
+	letter-spacing: normal !important;
+}
\ No newline at end of file
diff --git a/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file/binary-file.component.spec.ts b/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file/binary-file.component.spec.ts
index 87ccdd0e2378d152fa3c158081fb5cc51b997a79..d100e5edbff57a20eaf7296f7eab6ceba2cf15b9 100644
--- a/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file/binary-file.component.spec.ts
+++ b/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file/binary-file.component.spec.ts
@@ -23,13 +23,12 @@
  */
 import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacyTooltip as MatTooltip } from '@angular/material/legacy-tooltip';
 import { faker } from '@faker-js/faker';
 import { ApiDownloadToken } from '@goofy-client/api-root-shared';
 import { BinaryFileLinkRel, BinaryFileResource } from '@goofy-client/binary-file-shared';
 import { createEmptyStateResource, FileSizePipe, HasLinkPipe } from '@goofy-client/tech-shared';
 import { getElementFromFixture } from '@goofy-client/test-utils';
-import { IconButtonWithSpinnerComponent, SpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, MatTooltipDirective, SpinnerComponent } from '@goofy-client/ui';
 import { createBinaryFileResource } from 'libs/binary-file-shared/test/binary-file';
 import { getDataTestClassOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent, MockDirective } from 'ng-mocks';
@@ -49,7 +48,7 @@ describe('BinaryFileComponent', () => {
 				MatIcon,
 				FileSizePipe,
 				HasLinkPipe,
-				MockDirective(MatTooltip),
+				MockDirective(MatTooltipDirective),
 				MockComponent(SpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent)
 			]
diff --git a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.html b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.html
index 7394614860b09030de63d8c1749ecd13ecf0e171..31e1a17bd400b3206bc4f946d019f7a181e739a9 100644
--- a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.html
+++ b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.html
@@ -38,12 +38,12 @@
 			placeholder="Passwort für die Verschlüsselung">
 	</goofy-client-text-editor>
 
-	<goofy-client-button-with-spinner dataTestId="forward-button"
+	<goofy-client-ozgcloud-stroked-button-with-spinner dataTestId="forward-button"
 			toolTip="Vorgang weiterleiten"
 			icon="forward"
 			type="submit"
 			text="Weiterleiten"
 			[stateResource]="forwardStateResource">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 </form>
diff --git a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts
index f3d01ce2877bd5154978c6c0c57aac8ba89977fe..f4dcc3489c576d95e151f73c2c86b1794a1e4bef 100644
--- a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts
+++ b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts
@@ -23,12 +23,12 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms';
+import { MatFormFieldModule } from '@angular/material/form-field';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
-import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
+import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, TextEditorComponent } from '@goofy-client/ui';
+import { OzgcloudStrokedButtonWithSpinnerComponent, TextEditorComponent } from '@goofy-client/ui';
 import { VorgangWithEingangResource } from '@goofy-client/vorgang-shared';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
@@ -53,7 +53,7 @@ describe('VorgangForwardFormComponent', () => {
 			declarations: [
 				VorgangForwardFormComponent,
 				MatIcon,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(TextEditorComponent)
 			],
 			imports: [
diff --git a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.html b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.html
index 203aaebab423a86027a9acb9c023586058e53892..c6d568bca7072f6c54659c587f5922b2c8ace93d 100644
--- a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.html
+++ b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.html
@@ -36,19 +36,19 @@
 </div>
 
 <div class="buttons">
-	<goofy-client-button-with-spinner *ngIf="forwarding | hasLink: linkRel.MARK_AS_SUCCESS"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="forwarding | hasLink: linkRel.MARK_AS_SUCCESS"
 			data-test-id="mark-as-success-button"
 			text="Bestätigen"
 			icon="check_circle_outline"
 			[stateResource]="markAsSuccessCommandStateResource$ | async"
 			(clickEmitter)="markAsSuccess()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
-	<goofy-client-button-with-spinner *ngIf="forwarding | hasLink: linkRel.MARK_AS_FAIL"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="forwarding | hasLink: linkRel.MARK_AS_FAIL"
 			data-test-id="mark-as-fail-button"
 			text="Widerrufen"
 			icon="info_outline"
 			[stateResource]="markAsFailCommandStateResource$ | async"
 			(clickEmitter)="markAsFail()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 </div>
diff --git a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.scss b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.scss
index f0d1883e8ee15c8b0e9b2e368b7537d6ae4e7bdb..9bef324f39988dc2c7dbd060bcb0c6c7b089f010 100644
--- a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.scss
+++ b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.scss
@@ -31,7 +31,7 @@
 	margin: 16px -8px;
 	display: flex;
 
-	goofy-client-button-with-spinner {
+	goofy-client-ozgcloud-stroked-button-with-spinner {
 		margin: 0 8px;
 	}
 }
diff --git a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.spec.ts b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.spec.ts
index 6c9cf45254bbb350e2751a07d38d2997092e522e..4b3375d84d3010bcc6c1522f5f39735cc2588f2a 100644
--- a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.spec.ts
+++ b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.spec.ts
@@ -26,7 +26,7 @@ import { MatIcon } from '@angular/material/icon';
 import { ForwardingLinkRel, ForwardingResource, ForwardingService } from '@goofy-client/forwarding-shared';
 import { HasLinkPipe } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { createForwardingResource } from 'libs/forwarding-shared/test/forwarding';
 import { MockComponent } from 'ng-mocks';
 import { VorgangForwardZustellenContainerComponent } from './vorgang-forward-zustellen-container.component';
@@ -51,7 +51,7 @@ describe('VorgangForwardZustellenContainerComponent', () => {
 				HasLinkPipe,
 				VorgangForwardZustellenContainerComponent,
 				MatIcon,
-				MockComponent(ButtonWithSpinnerComponent)
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent)
 			],
 			providers: [
 				{
diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-assign-user-container/historie-item-assign-user-container.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-assign-user-container/historie-item-assign-user-container.component.scss
index b56b8b71d3afb82c055c91a652ffa371c5144fa7..d6238211bb493815e84e9e0c249c4cb0acc816e7 100644
--- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-assign-user-container/historie-item-assign-user-container.component.scss
+++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-assign-user-container/historie-item-assign-user-container.component.scss
@@ -21,4 +21,4 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "expansion-panel";
+@import 'expansion-panel';
diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-forwarding/historie-item-forwarding.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-forwarding/historie-item-forwarding.component.scss
index ffac2a3fa21a2357dd73e2abdde6606d64959f70..5bdff0dea3cbaef97bcaef245352e2e6af1c6f73 100644
--- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-forwarding/historie-item-forwarding.component.scss
+++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-forwarding/historie-item-forwarding.component.scss
@@ -21,4 +21,4 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "expansion-panel"
\ No newline at end of file
+@import 'expansion-panel'
\ No newline at end of file
diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-unknown/historie-item-unknown.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-unknown/historie-item-unknown.component.scss
index af33108ca1143f7d9d084537e4fa5e1be22649c0..c85698e574b5c212b494a3951d656e50dbf38b6c 100644
--- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-unknown/historie-item-unknown.component.scss
+++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-unknown/historie-item-unknown.component.scss
@@ -21,4 +21,4 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "expansion-panel";
\ No newline at end of file
+@import 'expansion-panel';
\ No newline at end of file
diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.scss
index f08f4f2d0915b1925150eebcdfbc2480d6d625e1..13ffdbdf74b14c777722e352dba64d724a0a2647 100644
--- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.scss
+++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.scss
@@ -21,8 +21,8 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "variables";
-@import "expansion-panel";
+@import 'variables';
+@import 'expansion-panel';
 
 :host {
 	border-bottom: 1px solid $greyLight;
diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list-item/historie-list-item.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list-item/historie-list-item.component.scss
index 4ea73000d82c0aae4e452ec26ac169118a7fae53..4ad74587729bb4e23c2ac29aeb7b70fee5d3828f 100644
--- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list-item/historie-list-item.component.scss
+++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list-item/historie-list-item.component.scss
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "variables";
+@import 'variables';
 
 :host {
 	display: block;
diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list.component.scss
index 004b169f6166c199fbcd380e5df39ac0630c228b..86e14516c34fa09bee546a46b3e3c69dd2ec0dbe 100644
--- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list.component.scss
+++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list.component.scss
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "variables";
+@import 'variables';
 
 ul {
 	margin-top: 0;
diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html
index 7b20106d1f137ccf453f2cb3845c4c4fee6d7576..be5ed6221fd7978fc521f572af806a2b338f8fa3 100644
--- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html
+++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html
@@ -39,22 +39,22 @@
 	</goofy-client-binary-file-attachment-container>
 
 	<div class="buttons">
-		<goofy-client-button-with-spinner
+		<goofy-client-ozgcloud-stroked-button-with-spinner
 			text="Speichern"
 			data-test-id="add-button"
 			icon="save_alt"
 			class="submit-button"
 			[stateResource]="submitInProgress$ | async"
 			(clickEmitter)="submit()">
-		</goofy-client-button-with-spinner>
+		</goofy-client-ozgcloud-stroked-button-with-spinner>
 
-		<goofy-client-button-with-spinner
+		<goofy-client-ozgcloud-stroked-button-with-spinner
 				text="Abbrechen"
 				data-test-id="cancel-button"
 				icon="clear"
 				color=""
 				class="cancel-button"
 				(clickEmitter)="cancel.emit()">
-		</goofy-client-button-with-spinner>
+		</goofy-client-ozgcloud-stroked-button-with-spinner>
 	</div>
 </form>
diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.scss b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.scss
index 78609186ecdda5fd657a9e96ae1f7607a04d58bb..51961869dbe4174bb7fd648721b6df7b08c6a0b4 100644
--- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.scss
+++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.scss
@@ -32,7 +32,7 @@
 	display: flex;
 	margin: 16px -8px;
 
-	goofy-client-button-with-spinner {
+	goofy-client-ozgcloud-stroked-button-with-spinner {
 		margin: 0 8px;
 	}
 }
diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts
index 32a622293e57108d5231435c6b5122f1aea4934a..8e7b629cb562374498ea5f03ba88401d3ef90c57 100644
--- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts
+++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts
@@ -23,12 +23,12 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule } from '@angular/forms';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatFormFieldModule } from '@angular/material/form-field';
 import { BinaryFileAttachmentContainerComponent } from '@goofy-client/binary-file';
 import { KommentarLinkRel, KommentarService } from '@goofy-client/kommentar-shared';
 import { createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, TextAreaEditorComponent } from '@goofy-client/ui';
+import { OzgcloudStrokedButtonWithSpinnerComponent, TextAreaEditorComponent } from '@goofy-client/ui';
 import { MockComponent } from 'ng-mocks';
 import { of } from 'rxjs';
 import { createBinaryFileListResource } from '../../../../../binary-file-shared/test/binary-file';
@@ -48,7 +48,7 @@ describe('KommentarFormComponent', () => {
 			declarations: [
 				KommentarFormComponent,
 				MockComponent(TextAreaEditorComponent),
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(BinaryFileAttachmentContainerComponent),
 			],
 			imports: [
diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.html b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.html
index 312a3aead13076dfd24712b09a4655cb34938b01..e5311fe2d059b1394d4c7f1676e1ac10b9425c32 100644
--- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.html
+++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.html
@@ -40,13 +40,13 @@
 		data-test-id="kommentar-formular">
 	</goofy-client-kommentar-form>
 
-	<goofy-client-button-with-spinner
+	<goofy-client-ozgcloud-stroked-button-with-spinner
 		*ngIf="canCreateNewKommentar$ | async"
 		(clickEmitter)="showFormular()"
 		class="create-button"
 		text="Kommentar"
 		icon="add"
 		dataTestId="create-kommentar">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 </ng-container>
diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.spec.ts b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.spec.ts
index 89e5f7233c158ec9f7346ca38e4766366e59c8cd..f0cc1c211f906c463b02f50c84037d5608c857fd 100644
--- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.spec.ts
+++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.spec.ts
@@ -23,17 +23,17 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { KommentarListLinkRel, KommentarService } from '@goofy-client/kommentar-shared';
+import { createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, ExpansionPanelComponent } from '@goofy-client/ui';
+import { ExpansionPanelComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { cold } from 'jest-marbles';
 import { MockComponent } from 'ng-mocks';
+import { Observable } from 'rxjs';
+import { createKommentarListResource } from '../../../../kommentar-shared/test/kommentar';
+import { createVorgangWithEingangResource } from '../../../../vorgang-shared/test/vorgang';
 import { KommentarFormComponent } from './kommentar-form/kommentar-form.component';
 import { KommentarListInVorgangContainerComponent } from './kommentar-list-in-vorgang-container.component';
 import { KommentarListInVorgangComponent } from './kommentar-list-in-vorgang/kommentar-list-in-vorgang.component';
-import { cold } from 'jest-marbles';
-import { createStateResource } from '@goofy-client/tech-shared';
-import { createKommentarListResource } from '../../../../kommentar-shared/test/kommentar';
-import { Observable } from 'rxjs';
-import { createVorgangWithEingangResource } from '../../../../vorgang-shared/test/vorgang';
 
 describe('KommentarListInVorgangContainerComponent', () => {
 	let component: KommentarListInVorgangContainerComponent;
@@ -48,7 +48,7 @@ describe('KommentarListInVorgangContainerComponent', () => {
 				MockComponent(ExpansionPanelComponent),
 				MockComponent(KommentarListInVorgangComponent),
 				MockComponent(KommentarFormComponent),
-				MockComponent(ButtonWithSpinnerComponent)
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent)
 			],
 			providers: [
 				{
diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.ts b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.ts
index a89cd0122c03a80556be442cc4f09dbac26161e6..df3208154642a8ac4f8c351dc665a92e5015cc78 100644
--- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.ts
+++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.ts
@@ -23,10 +23,10 @@
  */
 import { Component, Input, OnInit } from '@angular/core';
 import { BinaryFileListResource } from '@goofy-client/binary-file-shared';
-import { KommentarLinkRel, KommentarListLinkRel, KommentarListResource, KommentarResource, KommentarService } from '@goofy-client/kommentar-shared';
-import { createEmptyStateResource, StateResource } from "@goofy-client/tech-shared";
-import { Observable, of } from 'rxjs';
+import { KommentarLinkRel, KommentarListResource, KommentarResource, KommentarService } from '@goofy-client/kommentar-shared';
+import { StateResource, createEmptyStateResource } from "@goofy-client/tech-shared";
 import { hasLink } from '@ngxp/rest';
+import { Observable, of } from 'rxjs';
 
 @Component({
 	selector: 'goofy-client-kommentar-list-item-in-vorgang',
diff --git a/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.actions.ts b/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.actions.ts
index c3a62b795e46767355136240ed7621ae7a31cda3..3cc1ebc16bab01635a685cc7199b60473a3765d9 100644
--- a/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.actions.ts
+++ b/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.actions.ts
@@ -12,10 +12,10 @@ export const loadLoeschAnforderung: TypedActionCreatorWithProps<VorgangWithEinga
 export const loadLoeschAnforderungSuccess: TypedActionCreatorWithProps<LoeschAnforderungProps> = createAction('[LoeschAnforderung] Load LoeschAnforderung Success', props<LoeschAnforderungProps>());
 export const loadLoeschAnforderungFailure: TypedActionCreatorWithProps<ApiErrorAction> = createAction('[LoeschAnforderung] Load LoeschAnforderung Failure', props<ApiErrorAction>());
 
-export interface loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps {
+export interface LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps {
 	error: HttpErrorResponse,
 	overviewUrl: string
 }
 
 export const loeschAnforderungZuruecknehmenFailedAndReloadVorgangSuccess: TypedActionCreator = createAction('[LoeschAnforderung] LoeschAnforderung zurücknehmen reload vorgang success');
-export const loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailure: TypedActionCreatorWithProps<loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps> = createAction('[LoeschAnforderung] LoeschAnforderung zurücknehmen reload vorgang failure', props<loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps>());
\ No newline at end of file
+export const loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailure: TypedActionCreatorWithProps<LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps> = createAction('[LoeschAnforderung] LoeschAnforderung zurücknehmen reload vorgang failure', props<LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps>());
\ No newline at end of file
diff --git a/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.effects.ts b/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.effects.ts
index de14570bb3c540ae8ae4ba9da583725d405a2bba..8aeedfcb045ce309dad0d847d8d6dc92f1bda51f 100644
--- a/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.effects.ts
+++ b/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.effects.ts
@@ -9,7 +9,7 @@ import { hasLink } from '@ngxp/rest';
 import { of } from 'rxjs';
 import { catchError, filter, map, switchMap, tap } from 'rxjs/operators';
 import { isVorgangLoeschenCommand } from '../loesch-anforderung.util';
-import { loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps } from './loesch-anforderung.actions';
+import { LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps } from './loesch-anforderung.actions';
 import { LoeschAnforderungRepository } from './loesch-anforderung.repository';
 
 import * as CommandActions from '../../../../command-shared/src/lib/+state/command.actions';
@@ -40,8 +40,8 @@ export class LoeschAnforderungEffects {
 	), { dispatch: false });
 
 	loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailure$ = createEffect(() => this.actions$.pipe(ofType(LoeschAnforderungActions.loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailure),
-		filter((props: loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps) => isNotFound(props.error.error.status)),
-		tap((props: loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps) => {
+		filter((props: LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps) => isNotFound(props.error.error.status)),
+		tap((props: LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps) => {
 			this.snackBarService.showInfo(LOESCH_ANFORDERUNG_ZURUECKNEHMEN_CONCURRENT_TO_DELETE_VORGANG_MESSAGE);
 			this.navigationService.navigate(props.overviewUrl);
 		})
diff --git a/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.html b/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.html
index 612a32fb55907aca731e67813471c304446d59ef..5f62122e26615c580ea8691c31d278b73e684e1a 100644
--- a/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.html
+++ b/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.html
@@ -1,8 +1,8 @@
-<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="endgueltig-loeschen-button"
+<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="endgueltig-loeschen-button"
 	text="Endgültig löschen"
 	svgIcon="delete_finally"
 	(clickEmitter)="endgueltigLoeschen.emit()">
-</goofy-client-button-with-spinner>
+</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="endgueltig-loeschen-icon-button"
 	toolTip="Endgültig löschen"
diff --git a/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.spec.ts b/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.spec.ts
index 097f8e5b77d5ae942949203727f309956bbc3077..60328f58254a6c8dd4bfada6258f63865aa8ff20 100644
--- a/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.spec.ts
+++ b/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.spec.ts
@@ -1,6 +1,6 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { existsAsHtmlElement, notExistsAsHtmlElement } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
 import { EndgueltigLoeschenButtonComponent } from './endgueltig-loeschen-button.component';
@@ -16,7 +16,7 @@ describe('EndgueltigLoeschenButtonComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				EndgueltigLoeschenButtonComponent,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent),
 			],
 		}).compileComponents();
diff --git a/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.html b/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.html
index 33a07bc62b70a6e9d6b33ffee3b01522e17f7781..e86a6fc480c561d25f3da54a8f355fa1d30b390d 100644
--- a/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.html
+++ b/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.html
@@ -1,9 +1,9 @@
-<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="loesch-anforderung-zuruecknehmen-button"
+<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="loesch-anforderung-zuruecknehmen-button"
 	text="Löschanforderung zurücknehmen"
 	svgIcon="undo_request_deletion"
 	[stateResource]="loeschAnforderungZuruecknehmenCommand"
 	(clickEmitter)="loeschAnforderungZuruecknehmen.emit()">
-</goofy-client-button-with-spinner>
+</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="loesch-anforderung-zuruecknehmen-icon-button"
 	svgIcon="undo_request_deletion"
diff --git a/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.spec.ts b/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.spec.ts
index 25848eea2f1e5f9352d44e2f86f8a5d429fa78d6..ed8f7789e886ec1bba7f717157eeb13357716f35 100644
--- a/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.spec.ts
+++ b/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.spec.ts
@@ -1,6 +1,6 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { existsAsHtmlElement, notExistsAsHtmlElement } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from "@goofy-client/ui";
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from "@goofy-client/ui";
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from "ng-mocks";
 import { LoeschAnforderungZuruecknehmenButtonComponent } from './loesch-anforderung-zuruecknehmen-button.component';
@@ -16,7 +16,7 @@ describe('LoeschAnforderungZuruecknehmenButtonComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				LoeschAnforderungZuruecknehmenButtonComponent,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent)
 			],
 		}).compileComponents();
diff --git a/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.html b/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.html
index f6c58ef5bb01f4cc43aa7975321aeafd3fb65cfd..4767b59813e839e0d89f567e855d0acfece06ab3 100644
--- a/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.html
+++ b/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.html
@@ -1,9 +1,9 @@
-<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="loeschen-anfordern-button"
+<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="loeschen-anfordern-button"
 	text="Löschen anfordern"
 	svgIcon="request_deletion"
 	[stateResource]="loeschenAnfordernCommand"
 	(clickEmitter)="loeschenAnfordern.emit()">
-</goofy-client-button-with-spinner>
+</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="loeschen-anfordern-icon-button"
 	svgIcon="request_deletion"
diff --git a/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.spec.ts b/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.spec.ts
index c6595a5af788eb834fcc086892ac57dc4c84ee93..f139b0053be740522548f15dfb0838a24393178a 100644
--- a/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.spec.ts
+++ b/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.spec.ts
@@ -1,6 +1,6 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { existsAsHtmlElement, notExistsAsHtmlElement } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
 import { LoeschenAnfordernButtonComponent } from './loeschen-anfordern-button.component';
@@ -16,7 +16,7 @@ describe('LoeschenAnfordernButtonComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				LoeschenAnfordernButtonComponent,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent)
 			],
 		}).compileComponents();
diff --git a/goofy-client/libs/navigation/src/lib/build-info/build-info.component.scss b/goofy-client/libs/navigation/src/lib/build-info/build-info.component.scss
index 317e2628d4eec056d13bb3ba295c674fc2be3a9f..687bf9dc28611fe0de820edacad151dcd45114db 100644
--- a/goofy-client/libs/navigation/src/lib/build-info/build-info.component.scss
+++ b/goofy-client/libs/navigation/src/lib/build-info/build-info.component.scss
@@ -44,7 +44,6 @@ p {
 	margin: 0;
 	line-height: 1;
 	white-space: nowrap;
-	font-family: 'Roboto';
 	font-style: normal;
 	font-weight: 400;
 	font-size: 11px;
diff --git a/goofy-client/libs/postfach-shared/src/lib/postfach.service.spec.ts b/goofy-client/libs/postfach-shared/src/lib/postfach.service.spec.ts
index bafe872b1286d449e3aa25dd975ecf10de3844f3..a98a4a59f08fe716da57b3d1a85936d65f33e39e 100644
--- a/goofy-client/libs/postfach-shared/src/lib/postfach.service.spec.ts
+++ b/goofy-client/libs/postfach-shared/src/lib/postfach.service.spec.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
+import { MatDialog } from '@angular/material/dialog';
 import { BinaryFileListResource, BinaryFileResource, BinaryFileService } from '@goofy-client/binary-file-shared';
 import { CommandResource, CommandService } from '@goofy-client/command-shared';
 import { NavigationService } from '@goofy-client/navigation-shared';
diff --git a/goofy-client/libs/postfach-shared/src/lib/postfach.service.ts b/goofy-client/libs/postfach-shared/src/lib/postfach.service.ts
index 7cfc91a73b65219abd2c903cc3d7cfcac732b6b4..a14adf982120e4dc574b566801cd47ed49efdc40 100644
--- a/goofy-client/libs/postfach-shared/src/lib/postfach.service.ts
+++ b/goofy-client/libs/postfach-shared/src/lib/postfach.service.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Injectable } from '@angular/core';
-import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
+import { MatDialog } from '@angular/material/dialog';
 import { Params } from '@angular/router';
 import { BinaryFileListResource, BinaryFileResource, BinaryFileService, getBinaryFiles } from '@goofy-client/binary-file-shared';
 import { CommandResource, CommandService, doIfCommandIsDone, hasError, isDone, isPending } from '@goofy-client/command-shared';
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts
index dea79c0f8bbe455801a4328e9324e9884d150b44..b55cb1f2c78959116a5b569d0b3c4f265e2f17d2 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input } from '@angular/core';
-import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
+import { MatDialogRef } from '@angular/material/dialog';
 import { CommandResource } from '@goofy-client/command-shared';
 import { PostfachMailFormDialogData, PostfachMailListLinkRel, PostfachMailListResource, PostfachService } from '@goofy-client/postfach-shared';
 import { EMPTY_STRING, StateResource, hasError, isNotNull, isNotUndefined } from '@goofy-client/tech-shared';
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.html b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.html
index 84e14cd1b588e750854fdb3b97619b0b357c980a..b1e55799273c56e2e560264a4e22f8368aec38b2 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.html
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.html
@@ -25,21 +25,21 @@
 -->
 <ng-container *ngIf="postfachMailListStateResource.resource | hasLink: postfachMailListLinkRel.SEND_POSTFACH_MAIL">
 	<!-- TODO Aufteilen in 3 einzelne Komponenten -->
-	<goofy-client-button-with-spinner *ngIf="!showAsIconButton && text && !toolTip" data-test-id="create-mail-button-with-text"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton && text && !toolTip" data-test-id="create-mail-button-with-text"
 		[showSpinner]="pendingSendPostfachMailCommand.resource | hasLink: commandLinkRel.UPDATE"
 		class="create-button"
 		[text]="text"
 		icon="add"
 		(clickEmitter)="openPostfachNachrichtenDialog.emit()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
-	<goofy-client-button-with-spinner *ngIf="!showAsIconButton && !text && toolTip" data-test-id="create-mail-button-without-text"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton && !text && toolTip" data-test-id="create-mail-button-without-text"
 		[showSpinner]="pendingSendPostfachMailCommand.resource | hasLink: commandLinkRel.UPDATE"
 		class="create-button"
 		[toolTip]="toolTip"
 		icon="add"
 		(clickEmitter)="openPostfachNachrichtenDialog.emit()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 	<goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="send-mail-icon-button"
 		[showSpinner]="pendingSendPostfachMailCommand.resource | hasLink: commandLinkRel.UPDATE"
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.spec.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.spec.ts
index b55c1d860e8d2b65428dfcd45266fbfc1e08da89..033bd924713286de94e6c4cd9affcb8e0aeac5c9 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.spec.ts
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.spec.ts
@@ -24,8 +24,8 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import faker from '@faker-js/faker';
 import { PostfachMailListLinkRel } from '@goofy-client/postfach-shared';
-import { createStateResource, EMPTY_STRING, HasLinkPipe } from '@goofy-client/tech-shared';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { EMPTY_STRING, HasLinkPipe, createStateResource } from '@goofy-client/tech-shared';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { createPostfachMailListResource } from 'libs/postfach-shared/test/postfach';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
@@ -46,7 +46,7 @@ describe('PostfachMailButtonComponent', () => {
 				PostfachMailButtonComponent,
 				HasLinkPipe,
 				MockComponent(IconButtonWithSpinnerComponent),
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 			]
 		})
 			.compileComponents();
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.html b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.html
index 636a5d34e1b01d91565ec32ee766d0e04ba0a642..ec3434bb2bc14910a541a93be5887486e6d864fb 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.html
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.html
@@ -32,12 +32,10 @@
 
 	<goofy-client-text-editor [formControlName]="formServiceClass.FIELD_SUBJECT"
 			label="Betreff"
-			appearance="standard"
 			[autoFocus]="true">
 	</goofy-client-text-editor>
 	<goofy-client-textarea-editor [formControlName]="formServiceClass.FIELD_MAIL_BODY"
 			label="Text"
-			appearance="standard"
 			class="message-editor">
 	</goofy-client-textarea-editor>
 
@@ -45,13 +43,13 @@
 
 	<div class="button-bar-bottom">
 
-		<goofy-client-button-with-spinner data-test-id="postfach-send-button"
+		<goofy-client-ozgcloud-stroked-button-with-spinner data-test-id="postfach-send-button"
 			[stateResource]="sendInProgress$ | async"
 			text="Senden"
 			icon="send"
 			type="submit"
 			class="submit-button">
-		</goofy-client-button-with-spinner>
+		</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 		<goofy-client-postfach-nachricht-reply-editor-container></goofy-client-postfach-nachricht-reply-editor-container>
 	</div>
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.scss b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.scss
index a9ec23d3f18172195186485e81bb750479bba547..25ec89ce44ffff5a7b2f080631c7b5c58e35c201 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.scss
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.scss
@@ -23,7 +23,7 @@
  */
 :host {
 	::ng-deep {
-		.mat-form-field {
+		.mat-mdc-form-field {
 			width: 100%;
 		}
 
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts
index 5320509b21a57d8bdc21032189e39a582a0ee1a8..3f4215bed55617aa91c38bdf0b9994c522162eec 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts
@@ -23,14 +23,14 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
-import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
-import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
+import { MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { PostfachService } from '@goofy-client/postfach-shared';
 import { createStateResource } from '@goofy-client/tech-shared';
 import { Mock, mock, useFromMock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, DialogService, FileUploadComponent, IconButtonWithSpinnerComponent, SpinnerComponent, TextAreaEditorComponent, TextEditorComponent } from '@goofy-client/ui';
+import { DialogService, FileUploadComponent, IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent, SpinnerComponent, TextAreaEditorComponent, TextEditorComponent } from '@goofy-client/ui';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { PostfachTestFactory } from 'libs/postfach-shared/test/postfach';
 import { MockComponent } from 'ng-mocks';
@@ -57,7 +57,7 @@ describe('PostfachMailFormComponent', () => {
 				MockComponent(TextAreaEditorComponent),
 				MockComponent(TextEditorComponent),
 				MockComponent(IconButtonWithSpinnerComponent),
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(PostfachNachrichtReplyEditorContainerComponent),
 				MockComponent(SpinnerComponent),
 				MockComponent(FileUploadComponent),
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.ts
index 4e99f5ee6d450b86448f33eadd0f45d18f35b97a..11923dac26a3444ef8059ea06d534f68844e716a 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.ts
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Inject, OnInit } from '@angular/core';
-import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
+import { MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { CommandResource } from '@goofy-client/command-shared';
 import { StateResource, createEmptyStateResource, isNotNil } from '@goofy-client/tech-shared';
 import { DialogService } from '@goofy-client/ui';
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.html b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.html
index f573d5f2456df379063119c16a4076896cd016b2..64c04c0b8b447910c81fc1082cbc67dccb19d106 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.html
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.html
@@ -28,10 +28,10 @@
 	<mat-icon data-test-id="mail-send-error-icon" class="mail-send-error__icon mat-icon-error">error_outline_white</mat-icon>
 </div>
 <!-- TODO Eigene Component fuer den Button -->
-<goofy-client-button-with-spinner dataTestId="mail-resend-button"
+<goofy-client-ozgcloud-stroked-button-with-spinner dataTestId="mail-resend-button"
 		text="Erneut versuchen"
 		icon="autorenew"
 		[stateResource]="resendPostfachMailStateResource"
 		(clickEmitter)="resend.emit()">
-</goofy-client-button-with-spinner>
+</goofy-client-ozgcloud-stroked-button-with-spinner>
 <!--  -->
\ No newline at end of file
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.scss b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.scss
index a5fdc7e01c439d5199552b3741dca3043c0acc35..5e77efb9e5f2528ab35709ee7213281e83175a9c 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.scss
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.scss
@@ -23,7 +23,7 @@
  */
 @use 'sass:map';
 @use '@angular/material' as mat;
-@import "variables";
+@import 'variables';
 
 .mat-icon-error{
 	color: mat.get-color-from-palette($warnPalette);
@@ -45,7 +45,7 @@
 	}
 }
 
-goofy-client-button-with-spinner {
+goofy-client-ozgcloud-stroked-button-with-spinner {
 	display: block;
 	margin-bottom: 8px;
 }
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.spec.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.spec.ts
index f173ea1c77e2ce38ed63a50e59bbb01a05f56548..60fe72a8a08fef78af27e6238209705c9614a526 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.spec.ts
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIcon } from '@angular/material/icon';
 import { notExistsAsHtmlElement } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { createPostfachMailResource } from 'libs/postfach-shared/test/postfach';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
@@ -41,7 +41,7 @@ describe('OutgoingMailFailedComponent', () => {
 			declarations: [
 				OutgoingMailErrorComponent,
 				MatIcon,
-				MockComponent(ButtonWithSpinnerComponent)
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent)
 			]
 		}).compileComponents();
 	});
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button-container.component.spec.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button-container.component.spec.ts
index 479dd98c8e96f038838fb93069c372cf52057e0d..8e334cbf884c8cd94bca3731cbf69a032d5823c1 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button-container.component.spec.ts
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button-container.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { PostfachService } from '@goofy-client/postfach-shared';
 import { Mock, mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { MockComponent } from 'ng-mocks';
 import { PostfachMailPdfButtonContainerComponent } from './postfach-mail-pdf-button-container.component';
 import { PostfachMailPdfButtonComponent } from './postfach-mail-pdf-button/postfach-mail-pdf-button.component';
@@ -39,7 +39,7 @@ describe('PostfachMailPdfButtonContainerComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				PostfachMailPdfButtonContainerComponent,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(PostfachMailPdfButtonComponent)
 			],
 			providers: [
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.html b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.html
index afbdc29b6f0a120553cd44fb3dff73ec3f7fdd8c..95c943ae410eba1c497ccbbe48928e71bbf12625 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.html
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.html
@@ -26,20 +26,20 @@
 <ng-container *ngIf="postfachMailCount != postfachNachrichtenCount.NONE">
 
 	<ng-container *ngIf="showButtonWithLabel; else showButton">
-		<goofy-client-button-with-spinner data-test-id="postfach-pdf-export-button"
+		<goofy-client-ozgcloud-stroked-button-with-spinner data-test-id="postfach-pdf-export-button"
 			[showSpinner]="isDownloadInProgress"
 			svgIcon="pdf_export"
 			[text]="label" [toolTip]="label"
 			(clickEmitter)="downloadPdf.emit()">
-		</goofy-client-button-with-spinner>
+		</goofy-client-ozgcloud-stroked-button-with-spinner>
 	</ng-container>
 	<ng-template #showButton>
-		<goofy-client-button-with-spinner data-test-id="postfach-pdf-export-label-button"
+		<goofy-client-ozgcloud-stroked-button-with-spinner data-test-id="postfach-pdf-export-label-button"
 			[showSpinner]="isDownloadInProgress"
 			svgIcon="pdf_export"
 			[toolTip]="label"
 			(clickEmitter)="downloadPdf.emit()">
-		</goofy-client-button-with-spinner>
+		</goofy-client-ozgcloud-stroked-button-with-spinner>
 	</ng-template>
 
 </ng-container>
\ No newline at end of file
diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.spec.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.spec.ts
index 8281d08bb6d42b33628fc92a3d7643ea837aaa1c..0971228de535e7ab58714f4daa02fd49fd842c5a 100644
--- a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.spec.ts
+++ b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { PostfachMailListResource, PostfachNachrichtenCount } from '@goofy-client/postfach-shared';
 import { getElementFromFixture } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { createPostfachMailListResource } from 'libs/postfach-shared/test/postfach';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
@@ -41,7 +41,7 @@ describe('PostfachMailPdfButtonComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				PostfachMailPdfButtonComponent,
-				MockComponent(ButtonWithSpinnerComponent)
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent)
 			],
 		}).compileComponents();
 
diff --git a/goofy-client/libs/tech-shared/src/lib/tech.util.ts b/goofy-client/libs/tech-shared/src/lib/tech.util.ts
index 49578dea0312b3342430c049d875ce6f772a0a70..1e77223d9318e59bb225991cf7a5d0bcdcfb969f 100644
--- a/goofy-client/libs/tech-shared/src/lib/tech.util.ts
+++ b/goofy-client/libs/tech-shared/src/lib/tech.util.ts
@@ -39,14 +39,6 @@ export function isEmptyObject(obj: any): boolean {
 	return Object.keys(obj).length === 0;
 }
 
-export function replaceAllWhitespaces(value: string, replaceWith: string) {
-	return value.replace(/ /g, replaceWith);
-}
-
-export function simpleTransliteration(value: string) {
-	return value.normalize('NFKD').replace(/[^-_\w]/g, '');
-}
-
 export function replacePlaceholders(text: string, placeholders: { [key: string]: string }): string {
 	let replaced = text;
 	Object.keys(placeholders).forEach(key => replaced = replacePlaceholder(replaced, key, placeholders[key]));
@@ -96,6 +88,14 @@ export function convertForDataTest(value: string): string {
 	return simpleTransliteration(value);
 }
 
+export function replaceAllWhitespaces(value: string, replaceWith: string) {
+	return value.replace(/ /g, replaceWith);
+}
+
+export function simpleTransliteration(value: string) {
+	return value.normalize('NFKD').replace(/[^-A-Za-z0-9_]/g, '');
+}
+
 export function getStringValue(value: null | undefined | string): string {
 	if (isNil(value)) {
 		return EMPTY_STRING;
diff --git a/goofy-client/libs/test-utils/src/lib/mocking.ts b/goofy-client/libs/test-utils/src/lib/mocking.ts
index e0f99e200bc81fb4bc7c73dc7c7d7e7ad33765f8..141db74e40b6275c057e8889b718015448889e6c 100644
--- a/goofy-client/libs/test-utils/src/lib/mocking.ts
+++ b/goofy-client/libs/test-utils/src/lib/mocking.ts
@@ -56,5 +56,5 @@ export function mockComponent(options: Component): Component {
 }
 
 export function mockClass(clazz: any): Mock<any> {
-	return clazz as jest.Mocked<typeof clazz>;
+	return clazz as jest.Mocked<typeof clazz>; //NOSONAR
 }
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/index.ts b/goofy-client/libs/ui/src/index.ts
index c71a4a86355e23eaaceb1a04a313d60753e4e620..afb85c472f1aa40c64d4d961389a8d8d649a6f0e 100644
--- a/goofy-client/libs/ui/src/index.ts
+++ b/goofy-client/libs/ui/src/index.ts
@@ -29,7 +29,6 @@ export * from './lib/ui/accordion/accordion.component';
 export * from './lib/ui/back-button/back-button.component';
 export * from './lib/ui/basic-dialog/basic-dialog-data.model';
 export * from './lib/ui/basic-dialog/basic-dialog.component';
-export * from './lib/ui/button-with-spinner/button-with-spinner.component';
 export * from './lib/ui/dialog/dialog.service';
 export * from './lib/ui/download-button/download-button.component';
 export * from './lib/ui/editor/autocomplete-editor/autocomplete-editor.component';
@@ -43,9 +42,12 @@ export * from './lib/ui/file-upload/file-upload.component';
 export * from './lib/ui/fixed-dialog/fixed-dialog-data.model';
 export * from './lib/ui/fixed-dialog/fixed-dialog.component';
 export * from './lib/ui/icon-button-with-spinner/icon-button-with-spinner.component';
+export * from './lib/ui/mattooltip/mattooltip.directive';
 export * from './lib/ui/menu-item/menu-item.component';
 export * from './lib/ui/messages';
 export * from './lib/ui/open-url-button/open-url-button.component';
+export * from './lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component';
+export * from './lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component';
 export * from './lib/ui/ozgcloud-icon/ozgcloud-icon.component';
 export * from './lib/ui/ozgcloud-menu/ozgcloud-menu.component';
 export * from './lib/ui/ozgcloud-routing-button/ozgcloud-routing-button.component';
diff --git a/goofy-client/libs/ui/src/lib/font/_font_roboto_mono.scss b/goofy-client/libs/ui/src/lib/font/_font_roboto_mono.scss
deleted file mode 100644
index caf9e3873da561c3147f006e9a718c921c9086fd..0000000000000000000000000000000000000000
--- a/goofy-client/libs/ui/src/lib/font/_font_roboto_mono.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-/* roboto-mono-regular - latin */
-@font-face {
-	font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
-	font-family: 'Roboto Mono';
-	font-style: normal;
-	font-weight: 400;
-	src: url('../fonts/roboto-mono-v22-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
-}
-/* roboto-mono-500 - latin */
-@font-face {
-	font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
-	font-family: 'Roboto Mono';
-	font-style: normal;
-	font-weight: 500;
-	src: url('../fonts/roboto-mono-v22-latin-500.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
-}
-/* roboto-mono-700 - latin */
-@font-face {
-	font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
-	font-family: 'Roboto Mono';
-	font-style: normal;
-	font-weight: 700;
-	src: url('../fonts/roboto-mono-v22-latin-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
-}
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-500.woff2 b/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-500.woff2
deleted file mode 100644
index b4f2bf8c22481b36ce7f9079d40155fa0e31ff42..0000000000000000000000000000000000000000
Binary files a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-500.woff2 and /dev/null differ
diff --git a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-700.woff2 b/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-700.woff2
deleted file mode 100644
index d7170daca1a38b071f13c03f47611f92bb8e0e1a..0000000000000000000000000000000000000000
Binary files a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-700.woff2 and /dev/null differ
diff --git a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-regular.woff2 b/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-regular.woff2
deleted file mode 100644
index f8894bab50f641e86f695e85830a74dd395732fa..0000000000000000000000000000000000000000
Binary files a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-regular.woff2 and /dev/null differ
diff --git a/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.spec.ts b/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.spec.ts
index fc049d3db60f4e84b03264d0ff2415321732319b..1e03485dba5b4b3bcfcfa3bc2a146b84b87f530b 100644
--- a/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.spec.ts
+++ b/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.spec.ts
@@ -23,7 +23,7 @@
  */
 import { HttpErrorResponse, HttpRequest, HttpStatusCode } from '@angular/common/http';
 import { TestBed } from '@angular/core/testing';
-import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog';
+import { MatDialogModule } from '@angular/material/dialog';
 import { AuthService } from '@goofy-client/app-shared';
 import { HttpErrorHandler } from '@goofy-client/tech-shared';
 import { Mock, mock } from '@goofy-client/test-utils';
diff --git a/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.ts b/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.ts
index eb26cc4472beb1b40dceff08cb194afbf8a49e26..b6fe858de0d5cdb32f2ad38c410c70db04855fbc 100644
--- a/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.ts
+++ b/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.ts
@@ -25,11 +25,9 @@ import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest
 import { Injectable } from '@angular/core';
 import { AuthService } from '@goofy-client/app-shared';
 import { ApiError, HttpErrorHandler, isForbidden, isServerError, isUnauthorized } from '@goofy-client/tech-shared';
-import { SnackBarService } from '@goofy-client/ui';
+import { DialogService, Messages, SnackBarService } from 'libs/ui/src';
 import { EMPTY, Observable, throwError } from 'rxjs';
 import { catchError, finalize } from 'rxjs/operators';
-import { DialogService } from '../ui/dialog/dialog.service';
-import { Messages } from '../ui/messages';
 
 @Injectable()
 export class HttpErrorInterceptor implements HttpInterceptor {
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss
index 79197ab3d868efeebf12c71845bf53ff79b523ee..9a97723219a6d633dc7bba4c8cfc0531941fd209 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss
@@ -25,49 +25,12 @@
 @use '@angular/material' as mat;
 @import 'variables';
 
-.message {
-	white-space: pre-wrap
+:host {
+	height: 24px;
 }
 
-::ng-deep .mat-snack-bar-container.error {
-	min-width: 240px;
-	max-width: 90vw;
-
-	border: 3px solid mat.get-color-from-palette($warnPalette);
-	background-color: lighten(mat.get-color-from-palette($warnPalette), 38%);
-	color: rgba(#000, 0.89);
-	position: relative;
-
-	&:before {
-		position: absolute;
-		content: url("/assets/icons/error_outline_white.svg");
-		display: block;
-		background-color: mat.get-color-from-palette($warnPalette);
-		left: 0;
-		top: 0;
-		padding: 11px 9px 11px 7px;
-		color: #fff;
-		height: 100%;
-	}
-
-	> div {
-		margin-left: 44px;
-	}
-}
-
-.wrapper {
-	display: flex;
-	align-items: center;
-}
-
-.mat-button {
-	color: mat.get-color-from-palette($primaryPalette, lighter);
-}
-
-button {
-	margin: -12px -8px -12px 8px
-}
-
-::ng-deep body.dark .mat-snack-bar-container .mat-button {
-	color: mat.get-color-from-palette($primaryPalette);
+.mat-mdc-icon-button.mat-mdc-button-base {
+	width: 24px;
+	height: 24px;
+	padding: 0;
 }
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html
index 2517ebb9eba4326ea3e7dfff3fe4c764fd1aab22..782a21c59cbcd3f788e85f45cf847bb5178bb7da 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html
@@ -23,8 +23,6 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<div class="wrapper">
-	<span data-test-id="snackbar-message" class="message">{{ message }}</span>
+<div data-test-id="snackbar-message" class="message">{{ message }}</div>
 
-	<goofy-client-snackbar-close-button (close)="close()"></goofy-client-snackbar-close-button>
-</div>
+<goofy-client-snackbar-close-button (close)="close()"></goofy-client-snackbar-close-button>
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.scss b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.scss
index 79197ab3d868efeebf12c71845bf53ff79b523ee..8e3d25d7a59ec997571f367ee0e333f8192c7d35 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.scss
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.scss
@@ -21,53 +21,12 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@use 'sass:map';
-@use '@angular/material' as mat;
-@import 'variables';
-
 .message {
 	white-space: pre-wrap
 }
 
-::ng-deep .mat-snack-bar-container.error {
-	min-width: 240px;
-	max-width: 90vw;
-
-	border: 3px solid mat.get-color-from-palette($warnPalette);
-	background-color: lighten(mat.get-color-from-palette($warnPalette), 38%);
-	color: rgba(#000, 0.89);
-	position: relative;
-
-	&:before {
-		position: absolute;
-		content: url("/assets/icons/error_outline_white.svg");
-		display: block;
-		background-color: mat.get-color-from-palette($warnPalette);
-		left: 0;
-		top: 0;
-		padding: 11px 9px 11px 7px;
-		color: #fff;
-		height: 100%;
-	}
-
-	> div {
-		margin-left: 44px;
-	}
-}
-
-.wrapper {
+:host {
 	display: flex;
 	align-items: center;
-}
-
-.mat-button {
-	color: mat.get-color-from-palette($primaryPalette, lighter);
-}
-
-button {
-	margin: -12px -8px -12px 8px
-}
-
-::ng-deep body.dark .mat-snack-bar-container .mat-button {
-	color: mat.get-color-from-palette($primaryPalette);
+	justify-content: space-between;
 }
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts
index 944f38f895da2efb07852b5e122b69b904d2593e..332f2b560bef3cc85d38a7a8e453b753a0124f5a 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts
@@ -23,7 +23,7 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIconModule } from '@angular/material/icon';
-import { MAT_LEGACY_SNACK_BAR_DATA as MAT_SNACK_BAR_DATA, MatLegacySnackBarRef as MatSnackBarRef } from '@angular/material/legacy-snack-bar';
+import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';
 import { mock } from '@goofy-client/test-utils';
 import { MockComponent } from 'ng-mocks';
 import { SnackbarCloseButtonComponent } from '../snackbar-close-button/snackbar-close-button.component';
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts
index 25da2ddea5c90acfd022b9b85007bf358eda1c4f..6ceb37ba7f68ef70c247fd3814eee5fc2611d336 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Inject } from '@angular/core';
-import { MAT_LEGACY_SNACK_BAR_DATA as MAT_SNACK_BAR_DATA, MatLegacySnackBarRef as MatSnackBarRef } from '@angular/material/legacy-snack-bar';
+import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';
 import { SnackBarData } from '../snackbar.model';
 
 @Component({
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html
index c6f78650402d0f71777af6f7d37939252c04f598..ab90eeb659662a6958fa8619b864345bef2ee0b0 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html
@@ -23,7 +23,7 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<span data-test-id="snackbar-message">{{ message }}</span>
+<div data-test-id="snackbar-message">{{ message }}</div>
 
 <button *ngIf="showRevokeButton()" data-test-id="snackbar-revoke-button"
 	mat-button
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.scss b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.scss
index 7c18583b237564084a0378ad81b4920b4908a7e8..e48375ba020059e5d93760c965e90862d788376d 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.scss
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.scss
@@ -21,23 +21,8 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@use 'sass:map';
-@use '@angular/material' as mat;
-@import "variables";
-
-::ng-deep .mat-snack-bar-container {
-	min-width: 240px;
-	max-width: 90vw;
-
-	.mat-button {
-		color: mat.get-color-from-palette($primaryPalette, lighter);
-	}
-}
-
-button {
-	margin: -12px -8px -12px 8px
-}
-
-::ng-deep body.dark .mat-snack-bar-container .mat-button {
-	color: mat.get-color-from-palette($primaryPalette);
+:host {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
 }
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts
index 081db1db257210f1bfbb4bd61a9823ef3912f6b3..f7286034c26704f52b4178b9b7c334146c6016e9 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts
@@ -23,7 +23,7 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIconModule } from '@angular/material/icon';
-import { MAT_LEGACY_SNACK_BAR_DATA as MAT_SNACK_BAR_DATA, MatLegacySnackBarModule as MatSnackBarModule, MatLegacySnackBarRef as MatSnackBarRef } from '@angular/material/legacy-snack-bar';
+import { MAT_SNACK_BAR_DATA, MatSnackBarModule, MatSnackBarRef } from '@angular/material/snack-bar';
 import { mock } from '@goofy-client/test-utils';
 import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel';
 import { createCommandResource } from 'libs/command-shared/test/command';
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts
index 440b15971c0013628f31312d9175bce849e13326..7e441fdb7fba7aad2805bf859f956f80bb0b72d0 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Inject } from '@angular/core';
-import { MAT_LEGACY_SNACK_BAR_DATA as MAT_SNACK_BAR_DATA, MatLegacySnackBarRef as MatSnackBarRef } from '@angular/material/legacy-snack-bar';
+import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';
 import { isRevokeable } from '@goofy-client/command-shared';
 import { isUndefined } from 'lodash-es';
 import { SnackBarData } from '../snackbar.model';
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts
index fd3570d58d575353dc5d2f09807134b8133f84f0..d57564b2d77b9d13c1f4102c16e4eb6749ec4303 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { TestBed } from '@angular/core/testing';
-import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar';
+import { MatSnackBar } from '@angular/material/snack-bar';
 import { MatSnackBarConfig, MatSnackBarRef } from '@angular/material/snack-bar';
 import { faker } from '@faker-js/faker';
 import { CommandResource, CommandStatus } from '@goofy-client/command-shared';
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts
index 68e6aa4f8939a585744578d1f3b54528aad65c37..ef1135d27a678f55536991397ef6c456464971a6 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts
@@ -23,8 +23,7 @@
  */
 import { ComponentType } from '@angular/cdk/overlay';
 import { Injectable } from '@angular/core';
-import { MatLegacySnackBar as MatSnackBar, MatLegacySnackBarRef as MatSnackBarRef } from '@angular/material/legacy-snack-bar';
-import { MatSnackBarConfig } from '@angular/material/snack-bar';
+import { MatSnackBar, MatSnackBarConfig, MatSnackBarRef } from '@angular/material/snack-bar';
 import { CommandResource, CommandStatus } from '@goofy-client/command-shared';
 import { isNotUndefined } from '@goofy-client/tech-shared';
 import { isUndefined } from 'lodash-es';
diff --git a/goofy-client/libs/ui/src/lib/ui/accordion/accordion.component.scss b/goofy-client/libs/ui/src/lib/ui/accordion/accordion.component.scss
index 004b169f6166c199fbcd380e5df39ac0630c228b..86e14516c34fa09bee546a46b3e3c69dd2ec0dbe 100644
--- a/goofy-client/libs/ui/src/lib/ui/accordion/accordion.component.scss
+++ b/goofy-client/libs/ui/src/lib/ui/accordion/accordion.component.scss
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "variables";
+@import 'variables';
 
 ul {
 	margin-top: 0;
diff --git a/goofy-client/libs/ui/src/lib/ui/back-button/back-button.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/back-button/back-button.component.spec.ts
index 7d274830a821c60e39b6501e4bce9c027022e1c5..29ec95547efa0ed707e21897d228eb89a8cdb9d9 100644
--- a/goofy-client/libs/ui/src/lib/ui/back-button/back-button.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/back-button/back-button.component.spec.ts
@@ -4,7 +4,7 @@ import { RouterTestingModule } from '@angular/router/testing';
 import faker from '@faker-js/faker';
 import { getElementFromFixture } from '@goofy-client/test-utils';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
-import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
 import { BackButtonComponent } from './back-button.component';
 
 describe('BackButtonComponent', () => {
@@ -20,7 +20,7 @@ describe('BackButtonComponent', () => {
 			declarations: [
 				BackButtonComponent,
 				MatIcon,
-				MattooltipDirective,
+				MatTooltipDirective,
 			],
 			imports: [
 				RouterTestingModule
diff --git a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.html b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.html
index 04d3734b2d260930451b31d02da910bc28e94802..df0b8a4b6eb368149121817300be113cfef30460 100644
--- a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.html
+++ b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.html
@@ -3,14 +3,17 @@
 	<p data-test-id="dialog-message">{{ data.message }}</p>
 </div>
 <div mat-dialog-actions>
-	<goofy-client-button-with-spinner
+	<goofy-client-ozgcloud-stroked-button-with-spinner
 		dataTestId="dialog-confirmation-button"
 		[mat-dialog-close]="true"
 		svgIcon="{{ data.okSvgIcon }}"
 		text="{{ data.okText }}">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
+
+	<goofy-client-ozgcloud-stroked-button-with-spinner
+		dataTestId="dialog-cancel-button"
+		(click)="onNoClick()"
+		text="Abbrechen">
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
-	<button data-test-id="dialog-cancel-button" mat-stroked-button (click)="onNoClick()">
-		Abbrechen
-	</button>
 </div>
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.scss b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.scss
index 32ca729d1fb8ffca66095b21ea2c8a06d8b80a52..90ac2b7e8a2997c595ab46c0322aa990053bf3a1 100644
--- a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.scss
+++ b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.scss
@@ -7,6 +7,6 @@ button, h1 {
 	color: mat.get-color-from-palette($primaryPalette);
 }
 
-button {
+goofy-client-ozgcloud-stroked-button-with-spinner {
 	margin-left: 1rem;
 }
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts
index baa930740dfddbde7d66b590e9341c8d2b31f974..698f774e5917e52988fe4d2eab88b5acaf4cb7ed 100644
--- a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts
@@ -1,7 +1,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
 import { MatIcon } from '@angular/material/icon';
-import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule as MatDialogModule, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { MockComponent } from 'ng-mocks';
 import { BasicDialogComponent } from './basic-dialog.component';
 
@@ -17,7 +17,7 @@ describe('BasicDialogComponent', () => {
 			declarations: [
 				BasicDialogComponent,
 				MatIcon,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent),
 			],
 			providers: [
diff --git a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts
index f45e7f2a27371170280322db139003e01a619a71..d7df63108bc6320034bf2a541279a9eaa81bc9e1 100644
--- a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts
+++ b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts
@@ -1,5 +1,5 @@
 import { Component, Inject } from '@angular/core';
-import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
+import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
 import { BasicDialogData } from './basic-dialog-data.model';
 
 @Component({
diff --git a/goofy-client/libs/ui/src/lib/ui/button-toggle/_button-toogle.theme.scss b/goofy-client/libs/ui/src/lib/ui/button-toggle/_button-toogle.theme.scss
index 5795dbd8a65e300cc774fe71ffd8553d4e7cfa9f..23a97552a073b3f3a0462b724543ccb2b21cf30c 100644
--- a/goofy-client/libs/ui/src/lib/ui/button-toggle/_button-toogle.theme.scss
+++ b/goofy-client/libs/ui/src/lib/ui/button-toggle/_button-toogle.theme.scss
@@ -2,11 +2,8 @@ goofy-client-button-toggle {
 	.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,
 	.mat-button-toggle-appearance-standard {
 		border-radius: 20px;
-
 		.mat-button-toggle-label-content {
 			line-height: 2rem;
 		}
-
 	}
-
 }
diff --git a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.spec.ts
deleted file mode 100644
index d6227cf0850b1d0f18deb1d835b6dbbd5ee5f402..0000000000000000000000000000000000000000
--- a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.spec.ts
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { MatRipple } from '@angular/material/core';
-import { MatIcon } from '@angular/material/icon';
-import { MatLegacyButton as MatButton } from '@angular/material/legacy-button';
-import { createEmptyStateResource } from '@goofy-client/tech-shared';
-import { getDataTestClassOf } from 'libs/tech-shared/test/data-test';
-import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
-import { MockComponent } from 'ng-mocks';
-import { SpinnerComponent } from '../spinner/spinner.component';
-import { ButtonWithSpinnerComponent } from './button-with-spinner.component';
-
-describe('ButtonWithSpinnerComponent', () => {
-	let component: ButtonWithSpinnerComponent;
-	let fixture: ComponentFixture<ButtonWithSpinnerComponent>;
-
-	const buttonSelector: string = getDataTestClassOf('icon-button');
-	const iconSelector: string = getDataTestClassOf('icon');
-	const text: string = getDataTestClassOf('button-with-spinner-text');
-
-	beforeEach(async () => {
-		await TestBed.configureTestingModule({
-			declarations: [
-				MatButton,
-				MatRipple,
-				MatIcon,
-				ButtonWithSpinnerComponent,
-				MattooltipDirective,
-				MockComponent(SpinnerComponent)
-			]
-		}).compileComponents();
-	});
-
-	beforeEach(() => {
-		fixture = TestBed.createComponent(ButtonWithSpinnerComponent);
-		component = fixture.componentInstance;
-		fixture.detectChanges();
-	});
-
-	it('should create', () => {
-		expect(component).toBeTruthy();
-	});
-
-	describe('Button', () => {
-
-		it('should NOT disabled initial', () => {
-			component.stateResource = createEmptyStateResource();
-			fixture.detectChanges();
-
-			const button = fixture.nativeElement.querySelector(buttonSelector);
-
-			expect(button).not.toBeDisabled()
-		});
-
-		it('should disabled if loading', () => {
-			component.stateResource = createEmptyStateResource(true);
-			fixture.detectChanges();
-
-			const button = fixture.nativeElement.querySelector(buttonSelector);
-
-			expect(button).toBeDisabled();
-		});
-	})
-
-	describe('Icon', () => {
-
-		beforeEach(() => {
-			component.icon = 'add';
-			fixture.detectChanges();
-		})
-
-		it('should visible initial', () => {
-			component.stateResource = createEmptyStateResource();
-			fixture.detectChanges();
-
-			const icon = fixture.nativeElement.querySelector(iconSelector);
-
-			expect(icon).toBeVisible();
-		});
-
-		it('should not visible if loading', () => {
-			component.stateResource = createEmptyStateResource(true);
-			fixture.detectChanges();
-
-			const icon = fixture.nativeElement.querySelector(iconSelector);
-
-			expect(icon).not.toBeVisible();
-		});
-	})
-
-	describe('Text', () => {
-
-		it('should visible if exist', () => {
-			component.text = 'Test text';
-			fixture.detectChanges();
-
-			const textElement = fixture.nativeElement.querySelector(text);
-
-			expect(textElement).toBeInTheDocument();
-		});
-
-		it('should not visible if is null', () => {
-			component.text = null;
-			fixture.detectChanges();
-
-			const textElement = fixture.nativeElement.querySelector(text);
-
-			expect(textElement).not.toBeInTheDocument();
-		});
-	})
-});
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.spec.ts b/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.spec.ts
index 9002c91257c38b8e912e8cf7a76d79d9d99356f8..8dd10e04d2052c76d75bf91164af68afddab21d3 100644
--- a/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.spec.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { TestBed } from '@angular/core/testing';
-import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
+import { MatDialog } from '@angular/material/dialog';
 import { ApiError } from '@goofy-client/tech-shared';
 import { createApiError } from 'libs/tech-shared/test/error';
 import { BasicDialogComponent } from '../basic-dialog/basic-dialog.component';
diff --git a/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.ts b/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.ts
index f7e8b5fbaa2d4dd06b9aaac605758f27b8ed6632..f76356b783fa253fba420227947da0e9a4a78a32 100644
--- a/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.ts
+++ b/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.ts
@@ -24,7 +24,7 @@
 import { NoopScrollStrategy } from '@angular/cdk/overlay';
 import { ComponentType } from "@angular/cdk/portal";
 import { Injectable } from "@angular/core";
-import { MatLegacyDialog as MatDialog, MatLegacyDialogConfig as MatDialogConfig, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
+import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';
 import { ApiError, isNotUndefined } from "@goofy-client/tech-shared";
 import { BasicDialogComponent, BasicDialogData, FixedDialogComponent, FixedDialogData } from "@goofy-client/ui";
 import { InternalServerErrorDialogComponent } from "../notification/internal-server-error-dialog/internal-server-error-dialog.component";
diff --git a/goofy-client/libs/ui/src/lib/ui/download-button/download-button.component.scss b/goofy-client/libs/ui/src/lib/ui/download-button/download-button.component.scss
index 98401b64e76f6868738a7262770a075ab9273fe9..0a99fb3418e543df0aec2bb285645dded123f24a 100644
--- a/goofy-client/libs/ui/src/lib/ui/download-button/download-button.component.scss
+++ b/goofy-client/libs/ui/src/lib/ui/download-button/download-button.component.scss
@@ -1,5 +1,3 @@
-$leftMargin: 8px;
-
-span {
-	margin-left: $leftMargin;
+a {
+	padding: 0 15px;
 }
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts
index 437ed469b5b96a5e3e28602d52644914c68b5d09..164482f5c7c79ff9a5727dfb4eb8617048b4f0c5 100644
--- a/goofy-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts
@@ -23,9 +23,9 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { NgControl, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
-import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
-import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
+import { MatAutocompleteModule } from '@angular/material/autocomplete';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { ConvertForDataTestPipe } from '@goofy-client/tech-shared';
 import { MockComponent } from 'ng-mocks';
diff --git a/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.html b/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.html
index c1f028c04797066cb37402c14449685298848e9e..5dfc95345f11f052a209e9940563f97c9455bbd8 100644
--- a/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.html
+++ b/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.html
@@ -23,7 +23,7 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<mat-form-field appearance="fill">
+<mat-form-field>
 	<mat-label>{{ label }}</mat-label>
 	<input matInput [matDatepicker]="picker" [formControl]="fieldControl" (blur)="touch()"
 		[attr.data-test-id]="(label | convertForDataTest) + '-date-input'"
diff --git a/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts
index bf47a5bbca8c46167e21cf23167d105b291792e8..2c454f6c7eb5db644d9ddade601095a39b72c337 100644
--- a/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts
@@ -26,8 +26,8 @@ import { ReactiveFormsModule } from '@angular/forms';
 import { MatNativeDateModule } from '@angular/material/core';
 import { MatDatepickerModule } from '@angular/material/datepicker';
 import { MatIconModule } from '@angular/material/icon';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
-import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { ConvertForDataTestPipe } from '@goofy-client/tech-shared';
 import { MockComponent } from 'ng-mocks';
diff --git a/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.scss b/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.scss
index 6c5394012ec135f592f0811e6dd8f70ecfb478c8..d60b847e83a4cbbc6262bff546c13d221109fcde 100644
--- a/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.scss
+++ b/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.scss
@@ -30,7 +30,7 @@ mat-label {
 }
 
 ::ng-deep {
-	.mat-menu-panel.reply-option-menu {
+	.mat-mdc-menu-panel.reply-option-menu {
 		margin-left: -8px;
 	}
 }
diff --git a/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.spec.ts
index 11df7ff2aeea74920a5874c548092b01509459e2..53ea33b784e3c565e3ea88de41cfd4dd71fc5ac3 100644
--- a/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule } from '@angular/forms';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatFormFieldModule } from '@angular/material/form-field';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { ConvertForDataTestPipe } from '@goofy-client/tech-shared';
 import { IconButtonWithSpinnerComponent, UiModule } from '@goofy-client/ui';
diff --git a/goofy-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts
index f546d3c54ec17291cf4be70ad4bdb5779a6005b5..3bd4742554d51bc2e3743a10aa05ff8ab39adace 100644
--- a/goofy-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts
@@ -26,8 +26,8 @@ import { AbstractControl, FormGroupDirective, ReactiveFormsModule, UntypedFormBu
 import { MatNativeDateModule } from '@angular/material/core';
 import { MatDatepickerModule } from '@angular/material/datepicker';
 import { MatIconModule } from '@angular/material/icon';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
-import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { ConvertForDataTestPipe, createEmptyStateResource } from '@goofy-client/tech-shared';
 import { MockComponent } from 'ng-mocks';
diff --git a/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.spec.ts
index c5e9b3a9a04564c09eed850333c91c85b8b88f61..f8f69bbca2672f4cac52ae193f9c5ffb93c2f811 100644
--- a/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.spec.ts
@@ -23,8 +23,8 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { NgControl, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
-import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { ConvertForDataTestPipe } from '@goofy-client/tech-shared';
 import { MockComponent } from 'ng-mocks';
diff --git a/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.ts b/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.ts
index 43cfcff857d76f66fb44beba84061c5a837954b4..591babdcf277e4c59d758017db82963326edf0bb 100644
--- a/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.ts
+++ b/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.ts
@@ -37,7 +37,7 @@ export class TextEditorComponent extends FormControlEditorAbstractComponent impl
 	@Input() placeholder: string;
 	@Input() placeholderLabel: string = null;
 	@Input() autocomplete: 'off' | 'email' = 'off';
-	@Input() appearance: 'standard' | 'fill' = 'fill';
+	@Input() appearance: 'outline' | 'fill' = 'fill';
 	@Input() readOnly: boolean;
 	@Input() autoFocus: boolean;
 
diff --git a/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts
index 7233ef47c7c0e56250dfaa4b07de541159b1c62e..8ca66b4042f560b37c9317097e1f44449e751947 100644
--- a/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts
@@ -23,8 +23,8 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { NgControl, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
-import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { ConvertForDataTestPipe } from '@goofy-client/tech-shared';
 import { MockComponent } from 'ng-mocks';
diff --git a/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts b/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts
index fded47204cc693d96da9bc3db996f5daf4674f77..88a680c88fc2864d52f456908cf711923c9dda23 100644
--- a/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts
+++ b/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts
@@ -36,7 +36,7 @@ export class TextAreaEditorComponent extends FormControlEditorAbstractComponent
 
 	@Input() placeholder: string;
 	@Input() label: string = '';
-	@Input() appearance: 'standard' | 'fill' = 'fill'
+	@Input() appearance: 'outline' | 'fill' = 'fill'
 
 	ngAfterViewInit() {
 		this.autosize.resizeToFitContent(true);
diff --git a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/_fixed-dialog.theme.scss b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/_fixed-dialog.theme.scss
index 79885441538c01cb29027a3284b6ccfd36cc2477..0b4c18dfae3bbfe602477119799a5a2b7bee7b18 100644
--- a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/_fixed-dialog.theme.scss
+++ b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/_fixed-dialog.theme.scss
@@ -23,72 +23,97 @@
  */
 .fixed-dialog {
 
-	.mat-dialog-container {
+	.mat-mdc-dialog-container {
 		padding: 0;
 		border-bottom-left-radius: 0;
 		border-bottom-right-radius: 0;
 		position: relative;
-	}
-	.mat-dialog-title {
-		display: flex;
-		background-color: $dark-background;
-		margin: 0;
-		padding: 0 4px 0 16px;
-		color: #fff;
-		font-size: 16px;
-		line-height: 40px;
-		font-weight: normal;
-		justify-content: space-between;
-	}
+		.mat-mdc-dialog-title {
+			display: flex;
+			background-color: $dark-background;
+			margin: 0;
+			padding: 0 4px 0 16px;
+			color: #fff;
+			font-size: 16px;
+			font-weight: normal;
+			justify-content: space-between;
+			align-items: center;
+		}
+		.mdc-dialog__title::before {
+			display: none;
+		}
+		.mat-mdc-icon-button.mat-mdc-button-base {
+			padding: 0;
+			width: 40px;
+			height: 40px;
+		}
+		.mdc-text-field,
+		.mat-mdc-form-field-hint-wrapper,
+		.mat-mdc-form-field-error-wrapper {
+			padding: 0;
+		}
+		.mat-mdc-form-field-error {
+			font-size: 12px;
+		}
+		.mdc-dialog__content {
+			line-height: 20px;
+		}
+		.mat-mdc-dialog-content {
+			max-height: 50vh;
+			min-height: 200px;
+			margin: 0 0 58px 0;
+			padding: 8px 16px;
 
-	.mat-dialog-content {
-		max-height: 50vh;
-		min-height: 200px;
-		margin: 0 0 58px 0;
-		padding: 8px 16px;
+			> * {
+				background-color: inherit;
+			}
+
+			&.minimized {
+				max-height: 0;
+				min-height: initial;
+				overflow: hidden;
+				margin: 0;
+				padding: 0 !important;
 
-		> * {
-			background-color: inherit;
+				.button-bar-bottom {
+					height: 0;
+					overflow: hidden;
+					padding: 0;
+				}
+			}
 		}
 
-		&.minimized {
-			max-height: 0;
+		.mat-mdc-dialog-actions {
 			min-height: initial;
-			overflow: hidden;
-			margin: 0;
-			padding: 0;
+			margin-bottom: 0;
+		}
 
-			.button-bar-bottom {
-				height: 0;
-				overflow: hidden;
-				padding: 0;
-			}
+		.button-bar .mat-icon {
+			padding: 8px 0;
 		}
-	}
 
-	.mat-dialog-actions {
-		min-height: initial;
-		margin-bottom: 0;
-	}
+		.minimized .mat-icon {
+			transform: rotate(180deg);
+			padding: 0;
+		}
 
-	.minimized .mat-icon {
-		transform: rotate(180deg);
+		.button-bar-bottom {
+			position: absolute;
+			bottom: 0;
+			left: 0;
+			right: 0;
+			padding: 0 16px 16px 16px;
+			display: flex;
+			align-items: center;
+		}
 	}
 
-	.button-bar-bottom {
-		position: absolute;
-		bottom: 0;
-		left: 0;
-		right: 0;
-		padding: 16px;
-		display: flex;
-		align-items: center;
-	}
+
 }
 
 body.dark {
 	.fixed-dialog {
-		.mat-dialog-title {
+		.mat-mdc-dialog-title {
 			background-color: $background;
 			color: $dark-background;
 		}
diff --git a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts
index 5bd7cf6b100fd5f0aa637e85fbf3f44c1ef59b55..478e73a89bd8562751ecf3bee180faff9d6ed4b5 100644
--- a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts
@@ -23,7 +23,7 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacyDialogModule as MatDialogModule, MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
+import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { FixedDialogComponent } from './fixed-dialog.component';
 
 describe('FixedDialogComponent', () => {
diff --git a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts
index 9d9ab683783d170caa389ae25a7829b49bf53b6e..374a660110aa936f6345344740b5c9a1395551bb 100644
--- a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts
+++ b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Inject, Injectable, Injector } from '@angular/core';
-import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
+import { MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { VorgangWithEingangResource } from '@goofy-client/vorgang-shared';
 import { FixedDialogData } from './fixed-dialog-data.model';
 
diff --git a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.html b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.html
index 1b82fd2f0324cb70be07b26561fe7acb218e16a3..7eb27762bdfc3a65d7e74eb827fa4389149f2de0 100644
--- a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.html
+++ b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.html
@@ -24,10 +24,10 @@
 
 -->
 <div class="notification-dialog" data-test-id="connection-timeout-retry-dialog">
-	<h2 mat-dialog-title>
+	<h1 mat-dialog-title>
 		<mat-icon data-test-id="icon">error_outline</mat-icon>
 		<span data-test-id="header">Es ist ein Verbindungsfehler aufgetreten ...</span>
-	</h2>
+	</h1>
 	<mat-dialog-content>
 		<p data-test-id="message">
 			Ihre Anfrage wird wiederholt
diff --git a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.scss b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.scss
index 216ac6aa787fb4fc8fb0d1f7638ac76fe522235e..921a943426ae3182104f148bebfbf3aaf0361c9b 100644
--- a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.scss
+++ b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.scss
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-h2 {
+h1 {
 	font-weight: normal;
 	font-size: 24px;
 	display: flex;
diff --git a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts
index b3f4053b95c53965323bb05efc19dd12d419a548..34536651288e4615ea9a09de6e78da167cbe2166 100644
--- a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts
@@ -22,9 +22,9 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MatDialogModule } from '@angular/material/dialog';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog';
-import { ButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { MockComponent } from 'ng-mocks';
 import { ConnectionTimeoutRetryDialogComponent } from './connection-timeout-retry-dialog.component';
 
@@ -39,7 +39,7 @@ describe('ConnectionTimeoutRetryDialogComponent', () => {
 			],
 			declarations: [ConnectionTimeoutRetryDialogComponent,
 				MatIcon,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 
 			]
 		}).compileComponents();
diff --git a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.html b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.html
index ecf63d818dd0a582175f318a65b57376015ec0c1..1ed9aa8d9592ce723aff768baa88590c2decf9e9 100644
--- a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.html
+++ b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.html
@@ -33,8 +33,8 @@
 			Auch nach weiteren Versuchen konnte keine Verbindung aufgebaut werden. <br />
 			Bitte wenden Sie sich an Ihren Administrator.
 		</p>
-		<goofy-client-button-with-spinner tabindex="-1" class="button" icon="refresh" text="Reload" data-test-id="reload-button"
+		<goofy-client-ozgcloud-stroked-button-with-spinner tabindex="-1" class="button" icon="refresh" text="Reload" data-test-id="reload-button"
 			(click)="reload()">
-		</goofy-client-button-with-spinner>
+		</goofy-client-ozgcloud-stroked-button-with-spinner>
 	</mat-dialog-content>
 </div>
diff --git a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts
index 8eb43b66330319132c7e2caacd82cfbcf5373e94..5c5ad0d826fb6b6632907451fffb2b8a8ca815fe 100644
--- a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts
@@ -22,9 +22,9 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MatDialogModule } from '@angular/material/dialog';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog';
-import { ButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { MockComponent } from 'ng-mocks';
 import { ConnectionTimeoutRetryFailDialogComponent } from './connection-timeout-retry-fail-dialog.component';
 
@@ -39,7 +39,7 @@ describe('ConnectionTimeoutRetryFailDialogComponent', () => {
 			],
 			declarations: [ConnectionTimeoutRetryFailDialogComponent,
 				MatIcon,
-				MockComponent(ButtonWithSpinnerComponent)
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent)
 			]
 		}).compileComponents();
 	});
diff --git a/goofy-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts
index 6d7d7d5e9f38b2ecc3e7aabe9627e530444fbb2e..421d286dc5f416be5724a339e21fcd8db329dd75 100644
--- a/goofy-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts
@@ -23,9 +23,9 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacyTooltip as MatTooltip } from '@angular/material/legacy-tooltip';
 import { createEmptyStateResource } from '@goofy-client/tech-shared';
 import { MockComponent, MockDirective } from 'ng-mocks';
+import { MatTooltipDirective } from '../mattooltip/mattooltip.directive';
 import { SpinnerComponent } from '../spinner/spinner.component';
 import { IconButtonWithSpinnerComponent } from './icon-button-with-spinner.component';
 
@@ -41,7 +41,7 @@ describe('IconButtonWithSpinnerComponent', () => {
 			declarations: [
 				IconButtonWithSpinnerComponent,
 				MatIcon,
-				MockDirective(MatTooltip),
+				MockDirective(MatTooltipDirective),
 				MockComponent(SpinnerComponent)
 			],
 		})
diff --git a/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.spec.ts b/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.spec.ts
index 8452e9519798fcfd3e4dd5a02aa4de24b486b252..6ccbe0db7cb07a98b04d907aa9d80911aac1db19 100644
--- a/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.spec.ts
@@ -23,33 +23,33 @@
  */
 import { ElementRef } from '@angular/core';
 import faker from '@faker-js/faker';
-import { MattooltipClassDirective, MattooltipDirective, MattooltipDisabledDirective } from './mattooltip.directive';
+import { MatTooltipClassDirective, MatTooltipDirective, MatTooltipDisabledDirective } from './mattooltip.directive';
 
 describe('MatToolTip Directives', () => {
 
-	describe('MattooltipDirective', () => {
+	describe('MatTooltipDirective', () => {
 		const el: ElementRef = <ElementRef>{};
 		const tooltipText: string = faker.lorem.text();
 
 		it('should create an instance', () => {
-			const directive = new MattooltipDirective(el);
+			const directive = new MatTooltipDirective(el);
 			expect(directive).toBeTruthy();
 		});
 	});
 
-	describe('MattooltipDisabledDirective', () => {
+	describe('MatTooltipDisabledDirective', () => {
 		const el: ElementRef = <ElementRef>{};
 
 		it('should create an instance', () => {
-			const directive = new MattooltipDisabledDirective(el);
+			const directive = new MatTooltipDisabledDirective(el);
 			expect(directive).toBeTruthy();
 		});
 	});
 
-	describe('MattooltipClassDirective', () => {
+	describe('MatTooltipClassDirective', () => {
 
 		it('should create an instance', () => {
-			const directive = new MattooltipClassDirective();
+			const directive = new MatTooltipClassDirective();
 			expect(directive).toBeTruthy();
 		});
 	});
diff --git a/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.ts b/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.ts
index 365a939c485fef4a5d3f54aa5feb4e9fa544b2b6..c50919e90effa9feb006cf878220ca2512691250 100644
--- a/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.ts
+++ b/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.ts
@@ -40,7 +40,7 @@ const ariaDescribedBy: string = 'aria-describedby'
 @Directive({
 	selector: '[matTooltip]'
 })
-export class MattooltipDirective implements OnChanges {
+export class MatTooltipDirective implements OnChanges {
 	@Input() matTooltip: string = EMPTY_STRING;
 
 	constructor(private el: ElementRef) { }
@@ -54,7 +54,7 @@ export class MattooltipDirective implements OnChanges {
 @Directive({
 	selector: '[matTooltipDisabled]'
 })
-export class MattooltipDisabledDirective implements OnInit {
+export class MatTooltipDisabledDirective implements OnInit {
 	@Input() matTooltipDisabled: boolean = false;
 
 	constructor(private el: ElementRef) { }
@@ -70,6 +70,6 @@ export class MattooltipDisabledDirective implements OnInit {
 @Directive({
 	selector: '[matTooltipClass]'
 })
-export class MattooltipClassDirective {
+export class MatTooltipClassDirective {
 	@Input() matTooltipClass: string = EMPTY_STRING;
 }
diff --git a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/_internal-server-error-dialog.theme.scss b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/_internal-server-error-dialog.theme.scss
deleted file mode 100644
index 3539f7b821bf6550a5fe1736e444cdfabfc2da5e..0000000000000000000000000000000000000000
--- a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/_internal-server-error-dialog.theme.scss
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-@use 'sass:map';
-@use '@angular/material' as mat;
-
-@mixin internal-server-error-dialog($theme) {
-	$color-config: mat.get-color-config($theme);
-	$primary-palette: map.get($color-config, 'primary');
-
-	.notification-dialog h2 {
-		color: mat.get-color-from-palette($primary-palette);
-	}
-}
diff --git a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html
index e3283c405dc92aba0093ad430c5e064cae7592cb..f3a1798b807c85dfabd1b8d2cdc7250708f2b480 100644
--- a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html
+++ b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html
@@ -23,18 +23,18 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<h2 mat-dialog-title>
+<h1 mat-dialog-title>
 	<mat-icon data-test-id="error-icon">error_outline</mat-icon>
 	<span data-test-id="error-header">Es ist ein Fehler aufgetreten ...</span>
-</h2>
+</h1>
 <mat-dialog-content>
-	<p data-test-id="error-message">
+	<p data-test-id="error-message" class="error-message">
 		Wir sind nicht ganz sicher, was schiefgelaufen ist. Der Fehler <span *ngIf="showId()">(ID: {{ data.issues[0].exceptionId }})</span> wurde unserem Support gemeldet. Bitte starten sie die Anwendung neu.
 	</p>
 	<a href="/" tabindex="-1" class="button">
-		<goofy-client-button-with-spinner icon="refresh" text="Neu starten"></goofy-client-button-with-spinner>
+		<goofy-client-ozgcloud-stroked-button-with-spinner icon="refresh" text="Neu starten"></goofy-client-ozgcloud-stroked-button-with-spinner>
 	</a>
-	<goofy-client-button-with-spinner icon="logout" text="Abmelden" data-test-id="logout-button"
+	<goofy-client-ozgcloud-stroked-button-with-spinner icon="logout" text="Abmelden" data-test-id="logout-button"
 		(clickEmitter)="authService.logOut()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 </mat-dialog-content>
diff --git a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.scss b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.scss
index 0dbb306201edf485d9c534ea274dfd20d7571c2e..b7646cc7feccde2cf346600e7d2fdd609afd84b0 100644
--- a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.scss
+++ b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.scss
@@ -21,9 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-h2 {
-	font-weight: normal;
-	font-size: 24px;
+h1 {
 	display: flex;
 	align-items: center;
 
@@ -38,3 +36,7 @@ h2 {
 .button {
 	margin-right: 16px;
 }
+
+.error-message {
+	margin-bottom: 20px;
+}
diff --git a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts
index 4ddfaaed557ab6450f36c2de2434423eb1a3f87f..6c1c32e1032b7a42194a2b69cfd9c515c98cf82d 100644
--- a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts
@@ -22,11 +22,11 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacyDialogModule as MatDialogModule, MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
 import { faker } from '@faker-js/faker';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { OAuthService } from 'angular-oauth2-oidc';
 import { createIssue } from 'libs/tech-shared/test/error';
 import { MockComponent } from 'ng-mocks';
@@ -43,7 +43,7 @@ describe('InternalServerErrorDialogComponent', () => {
 			declarations: [
 				InternalServerErrorDialogComponent,
 				MatIcon,
-				MockComponent(ButtonWithSpinnerComponent)
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent)
 			],
 			imports: [
 				MatDialogModule
diff --git a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts
index 8c5b4e42ed426729be271f250391de19ec3135a5..e20668a46c1f492a8f76c0688e8c9b515c5dd3b8 100644
--- a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts
+++ b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Inject } from '@angular/core';
-import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
+import { MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { ApiError, hasExceptionId } from '@goofy-client/tech-shared';
 import { OAuthService } from 'angular-oauth2-oidc';
 
diff --git a/goofy-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.scss b/goofy-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.scss
index 98401b64e76f6868738a7262770a075ab9273fe9..0a99fb3418e543df0aec2bb285645dded123f24a 100644
--- a/goofy-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.scss
+++ b/goofy-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.scss
@@ -1,5 +1,3 @@
-$leftMargin: 8px;
-
-span {
-	margin-left: $leftMargin;
+a {
+	padding: 0 15px;
 }
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.html b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.html
similarity index 69%
rename from goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.html
rename to goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.html
index e183fdff7348f2b073d992d60c492764dd383feb..a061fc0449b87e6fa426617c7a12ced56579818b 100644
--- a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.html
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.html
@@ -29,24 +29,15 @@
 		[disabled]="isDisabled"
 		[matTooltip]="toolTip"
 		[class.with-text]="text"
-		[class.mat-stroked-button]="strokedButton"
 		(click)="clickEmitter.emit($event)">
 
-	<mat-icon *ngIf="icon" data-test-class="icon"
-			[style.visibility]="isDisabled ? 'hidden' : 'visible'">
-		{{ icon }}
-	</mat-icon>
-
-	<mat-icon *ngIf="svgIcon" data-test-class="icon"
-			[svgIcon]="svgIcon"
-			[style.visibility]="isDisabled ? 'hidden' : 'visible'">
-	</mat-icon>
-
-	<span *ngIf="text" data-test-class="button-with-spinner-text">{{ text }}</span>
-
-	<goofy-client-spinner
-			[diameter]="22" padding="0"
-			[stateResource]="getStateResource()" [show]="showSpinner">
-	</goofy-client-spinner>
+	<goofy-client-ozgcloud-button-content
+		[icon]="icon"
+		[svgIcon]="svgIcon"
+		[text]="text"
+		[stateResource]="stateResource"
+		[showSpinner]="showSpinner"
+		[isDisabled]="isDisabled"
+	></goofy-client-ozgcloud-button-content>
 
 </button>
diff --git a/goofy-client/apps/goofy-e2e/src/support/delete-old-reports.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.scss
similarity index 89%
rename from goofy-client/apps/goofy-e2e/src/support/delete-old-reports.ts
rename to goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.scss
index 3a7e7d5170a0d442ac2272f1082c2f440ada2ca4..8069fed25cd27089f993e6233b46148263192a6e 100644
--- a/goofy-client/apps/goofy-e2e/src/support/delete-old-reports.ts
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.scss
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
  * Ministerpräsidenten des Landes Schleswig-Holstein
  * Staatskanzlei
@@ -21,6 +21,11 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-const fs = require('fs')
-
-fs.rmdirSync(`apps/goofy-e2e/reports/${process.env.REPORT_FOLDER}`, { recursive: true });
\ No newline at end of file
+button {
+	min-width: 36px;
+	min-height: 36px;
+	padding: 0;
+	&.with-text {
+		padding: 0 15px;
+	}
+}
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1ded0801c248b23436378f817c58cecb18679d50
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.spec.ts
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MatButton } from '@angular/material/button';
+import { MatRipple } from '@angular/material/core';
+import { createCommandResource } from 'libs/command-shared/test/command';
+import { getDataTestClassOf } from 'libs/tech-shared/test/data-test';
+import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MockComponent } from 'ng-mocks';
+import { OzgcloudButtonContentComponent } from '../shared/ozgcloud-button-content/ozgcloud-button-content.component';
+import { OzgcloudButtonWithSpinnerComponent } from './ozgcloud-button-with-spinner.component';
+
+import * as ResourceUtils from 'libs/tech-shared/src/lib/resource/resource.util';
+
+describe('OzgcloudButtonWithSpinnerComponent', () => {
+	let component: OzgcloudButtonWithSpinnerComponent;
+	let fixture: ComponentFixture<OzgcloudButtonWithSpinnerComponent>;
+
+	const buttonSelector: string = getDataTestClassOf('icon-button');
+
+	beforeEach(async () => {
+		await TestBed.configureTestingModule({
+			declarations: [
+				MatButton,
+				MatRipple,
+				OzgcloudButtonWithSpinnerComponent,
+				MatTooltipDirective,
+				MockComponent(OzgcloudButtonContentComponent)
+			]
+		}).compileComponents();
+	});
+
+	beforeEach(() => {
+		fixture = TestBed.createComponent(OzgcloudButtonWithSpinnerComponent);
+		component = fixture.componentInstance;
+		fixture.detectChanges();
+	});
+
+	it('should create', () => {
+		expect(component).toBeTruthy();
+	});
+
+	describe('isDisabled', () => {
+		it('should return true if showSpinner is true and stateResource is loading', () => {
+			component.showSpinner = true;
+			component.stateResource.loading = true;
+
+			const result: boolean = component.isDisabled;
+
+			expect(result).toBeTruthy();
+		})
+
+		it('should return true if showSpinner is false and stateResource is loading', () => {
+			component.showSpinner = false;
+			component.stateResource.loading = true;
+
+			const result: boolean = component.isDisabled;
+
+			expect(result).toBeTruthy();
+		})
+
+		it('should return true if showSpinner is true and stateResource is not loading', () => {
+			component.showSpinner = true;
+			component.stateResource.loading = false;
+
+			const result: boolean = component.isDisabled;
+
+			expect(result).toBeTruthy();
+		})
+
+		it('should return false if showSpinner is false and stateResource is not loading', () => {
+			component.showSpinner = false;
+			component.stateResource.loading = false;
+
+			const result: boolean = component.isDisabled;
+
+			expect(result).toBeFalsy();
+		})
+	})
+
+	describe('ngOnInit', () => {
+		it('should call getStateResource()', () => {
+			component.getStateResource = jest.fn();
+
+			component.ngOnInit();
+
+			expect(component.getStateResource).toHaveBeenCalled();
+		})
+	})
+
+	describe('getStateResource', () => {
+		it('should call createEmptyStateResource if stateResource is undefined', () => {
+			const spy = jest.spyOn(ResourceUtils, 'createEmptyStateResource');
+			component.stateResource = undefined;
+
+			component.getStateResource();
+
+			expect(spy).toHaveBeenCalled();
+		})
+
+		it('should call createEmptyStateResource if stateResource is null', () => {
+			const spy = jest.spyOn(ResourceUtils, 'createEmptyStateResource');
+			component.stateResource = null;
+
+			component.getStateResource();
+
+			expect(spy).toHaveBeenCalled();
+		})
+
+		it('should return non empty stateResource', () => {
+			component.stateResource = ResourceUtils.createStateResource(createCommandResource());
+
+			component.getStateResource();
+
+			const valid: boolean = ResourceUtils.isValidStateResouce(component.stateResource);
+			expect(valid).toBeTruthy();
+		})
+	})
+
+	describe('Button', () => {
+
+		it('should NOT be disabled initialy', () => {
+			component.stateResource = ResourceUtils.createEmptyStateResource();
+			fixture.detectChanges();
+
+			const button = fixture.nativeElement.querySelector(buttonSelector);
+
+			expect(button).not.toBeDisabled()
+		});
+
+		it('should be disabled if loading', () => {
+			component.stateResource = ResourceUtils.createEmptyStateResource(true);
+			fixture.detectChanges();
+
+			const button = fixture.nativeElement.querySelector(buttonSelector);
+
+			expect(button).toBeDisabled();
+		});
+	})
+});
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.ts
similarity index 79%
rename from goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.ts
rename to goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.ts
index 810babe14b3e6ebd2e4c7ec1571a822cc2c22a58..3ce63acc1803e4c9b1d2719a81e46607e01a1cfc 100644
--- a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.ts
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.ts
@@ -21,17 +21,17 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, EventEmitter, Input, Output } from '@angular/core';
+import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
 import { StateResource, createEmptyStateResource } from '@goofy-client/tech-shared';
 import { Resource } from '@ngxp/rest';
 import { isNil } from 'lodash-es';
 
 @Component({
-	selector: 'goofy-client-button-with-spinner',
-	templateUrl: './button-with-spinner.component.html',
-	styleUrls: ['./button-with-spinner.component.scss']
+	selector: 'goofy-client-ozgcloud-button-with-spinner',
+	templateUrl: './ozgcloud-button-with-spinner.component.html',
+	styleUrls: ['./ozgcloud-button-with-spinner.component.scss']
 })
-export class ButtonWithSpinnerComponent {
+export class OzgcloudButtonWithSpinnerComponent implements OnInit {
 
 	@Input() icon: string;
 	@Input() svgIcon: string;
@@ -42,12 +42,15 @@ export class ButtonWithSpinnerComponent {
 	@Input() toolTip: string = '';
 	@Input() dataTestId: string;
 	@Input() showSpinner: boolean = false;
-	@Input() strokedButton: boolean = true;
 
 	@Output() public clickEmitter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
 
 	get isDisabled(): boolean {
-		return this.showSpinner || this.getStateResource().loading;
+		return this.showSpinner || this.stateResource.loading;
+	}
+
+	ngOnInit(): void {
+		this.stateResource = this.getStateResource();
 	}
 
 	getStateResource(): StateResource<Resource> {
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.html b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..3c2cb884f7837cf3855ef68c300b26a85ac89079
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.html
@@ -0,0 +1,43 @@
+<!--
+
+    Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+    Ministerpräsidenten des Landes Schleswig-Holstein
+    Staatskanzlei
+    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+
+    Lizenziert unter der EUPL, Version 1.2 oder - sobald
+    diese von der Europäischen Kommission genehmigt wurden -
+    Folgeversionen der EUPL ("Lizenz");
+    Sie dürfen dieses Werk ausschließlich gemäß
+    dieser Lizenz nutzen.
+    Eine Kopie der Lizenz finden Sie hier:
+
+    https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+
+    Sofern nicht durch anwendbare Rechtsvorschriften
+    gefordert oder in schriftlicher Form vereinbart, wird
+    die unter der Lizenz verbreitete Software "so wie sie
+    ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+    ausdrücklich oder stillschweigend - verbreitet.
+    Die sprachspezifischen Genehmigungen und Beschränkungen
+    unter der Lizenz sind dem Lizenztext zu entnehmen.
+
+-->
+<button mat-stroked-button data-test-class="icon-button" [attr.data-test-id]="dataTestId"
+		[color]="color"
+		[type]="type"
+		[disabled]="isDisabled"
+		[matTooltip]="toolTip"
+		[class.with-text]="text"
+		(click)="clickEmitter.emit($event)">
+
+	<goofy-client-ozgcloud-button-content
+		[icon]="icon"
+		[svgIcon]="svgIcon"
+		[text]="text"
+		[stateResource]="stateResource"
+		[showSpinner]="showSpinner"
+		[isDisabled]="isDisabled"
+	></goofy-client-ozgcloud-button-content>
+
+</button>
diff --git a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.scss b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.scss
similarity index 82%
rename from goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.scss
rename to goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.scss
index c4dea65393834200633b2be7c9f6830aa32446fa..8069fed25cd27089f993e6233b46148263192a6e 100644
--- a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.scss
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.scss
@@ -21,23 +21,6 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-$leftMargin: 8px;
-
-span {
-	margin-left: $leftMargin;
-}
-
-goofy-client-spinner {
-	position: absolute;
-	top: 0;
-	left: $leftMargin;
-	display: flex;
-	height: 100%;
-	width: 100%;
-	justify-content: flex-start;
-	align-items: center;
-}
-
 button {
 	min-width: 36px;
 	min-height: 36px;
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d0ef6e5df6a0779a2b7d29ff87ac26863229c978
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.spec.ts
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MatButton } from '@angular/material/button';
+import { MatRipple } from '@angular/material/core';
+import { createCommandResource } from 'libs/command-shared/test/command';
+import { getDataTestClassOf } from 'libs/tech-shared/test/data-test';
+import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MockComponent } from 'ng-mocks';
+import { OzgcloudButtonContentComponent } from '../shared/ozgcloud-button-content/ozgcloud-button-content.component';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from './ozgcloud-stroked-button-with-spinner.component';
+
+import * as ResourceUtils from 'libs/tech-shared/src/lib/resource/resource.util';
+
+describe('OzgcloudStrokedButtonWithSpinnerComponent', () => {
+	let component: OzgcloudStrokedButtonWithSpinnerComponent;
+	let fixture: ComponentFixture<OzgcloudStrokedButtonWithSpinnerComponent>;
+
+	const buttonSelector: string = getDataTestClassOf('icon-button');
+
+	beforeEach(async () => {
+		await TestBed.configureTestingModule({
+			declarations: [
+				MatButton,
+				MatRipple,
+				OzgcloudStrokedButtonWithSpinnerComponent,
+				MatTooltipDirective,
+				MockComponent(OzgcloudButtonContentComponent)
+			]
+		}).compileComponents();
+	});
+
+	beforeEach(() => {
+		fixture = TestBed.createComponent(OzgcloudStrokedButtonWithSpinnerComponent);
+		component = fixture.componentInstance;
+		fixture.detectChanges();
+	});
+
+	it('should create', () => {
+		expect(component).toBeTruthy();
+	});
+
+	describe('isDisabled', () => {
+		it('should return true if showSpinner is true and stateResource is loading', () => {
+			component.showSpinner = true;
+			component.stateResource.loading = true;
+
+			const result: boolean = component.isDisabled;
+
+			expect(result).toBeTruthy();
+		})
+
+		it('should return true if showSpinner is false and stateResource is loading', () => {
+			component.showSpinner = false;
+			component.stateResource.loading = true;
+
+			const result: boolean = component.isDisabled;
+
+			expect(result).toBeTruthy();
+		})
+
+		it('should return true if showSpinner is true and stateResource is not loading', () => {
+			component.showSpinner = true;
+			component.stateResource.loading = false;
+
+			const result: boolean = component.isDisabled;
+
+			expect(result).toBeTruthy();
+		})
+
+		it('should return false if showSpinner is false and stateResource is not loading', () => {
+			component.showSpinner = false;
+			component.stateResource.loading = false;
+
+			const result: boolean = component.isDisabled;
+
+			expect(result).toBeFalsy();
+		})
+	})
+
+	describe('ngOnInit', () => {
+		it('should call getStateResource()', () => {
+			component.getStateResource = jest.fn();
+
+			component.ngOnInit();
+
+			expect(component.getStateResource).toHaveBeenCalled();
+		})
+	})
+
+	describe('getStateResource', () => {
+		it('should call createEmptyStateResource if stateResource is undefined', () => {
+			const spy = jest.spyOn(ResourceUtils, 'createEmptyStateResource');
+			component.stateResource = undefined;
+
+			component.getStateResource();
+
+			expect(spy).toHaveBeenCalled();
+		})
+
+		it('should call createEmptyStateResource if stateResource is null', () => {
+			const spy = jest.spyOn(ResourceUtils, 'createEmptyStateResource');
+			component.stateResource = null;
+
+			component.getStateResource();
+
+			expect(spy).toHaveBeenCalled();
+		})
+
+		it('should return non empty stateResource', () => {
+			component.stateResource = ResourceUtils.createStateResource(createCommandResource());
+
+			component.getStateResource();
+
+			const valid: boolean = ResourceUtils.isValidStateResouce(component.stateResource);
+			expect(valid).toBeTruthy();
+		})
+	})
+
+	describe('Button', () => {
+
+		it('should NOT be disabled initialy', () => {
+			component.stateResource = ResourceUtils.createEmptyStateResource();
+			fixture.detectChanges();
+
+			const button = fixture.nativeElement.querySelector(buttonSelector);
+
+			expect(button).not.toBeDisabled()
+		});
+
+		it('should be disabled if loading', () => {
+			component.stateResource = ResourceUtils.createEmptyStateResource(true);
+			fixture.detectChanges();
+
+			const button = fixture.nativeElement.querySelector(buttonSelector);
+
+			expect(button).toBeDisabled();
+		});
+	})
+});
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1fe4fe73ee15ba3c1274f2526face4722851021d
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.ts
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
+import { StateResource, createEmptyStateResource } from '@goofy-client/tech-shared';
+import { Resource } from '@ngxp/rest';
+import { isNil } from 'lodash-es';
+
+@Component({
+	selector: 'goofy-client-ozgcloud-stroked-button-with-spinner',
+	templateUrl: './ozgcloud-stroked-button-with-spinner.component.html',
+	styleUrls: ['./ozgcloud-stroked-button-with-spinner.component.scss']
+})
+export class OzgcloudStrokedButtonWithSpinnerComponent implements OnInit {
+
+	@Input() icon: string;
+	@Input() svgIcon: string;
+	@Input() text: string;
+	@Input() stateResource: StateResource<Resource>;
+	@Input() color: string = 'primary';
+	@Input() type: 'button' | 'submit' = 'button';
+	@Input() toolTip: string = '';
+	@Input() dataTestId: string;
+	@Input() showSpinner: boolean = false;
+	@Input() strokedButton: boolean = true;
+
+	@Output() public clickEmitter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
+
+	get isDisabled(): boolean {
+		return this.showSpinner || this.stateResource.loading;
+	}
+
+	ngOnInit(): void {
+		this.stateResource = this.getStateResource();
+	}
+
+	getStateResource(): StateResource<Resource> {
+		return isNil(this.stateResource) ? createEmptyStateResource<Resource>() : this.stateResource;
+	}
+}
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.html b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..574caa535e6bd04080e6d0ea850b7c2caea9e261
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.html
@@ -0,0 +1,17 @@
+<mat-icon *ngIf="icon" data-test-class="icon"
+		[style.visibility]="isDisabled ? 'hidden' : 'visible'">
+	{{ icon }}
+</mat-icon>
+
+<mat-icon *ngIf="svgIcon" data-test-class="icon"
+		[svgIcon]="svgIcon"
+		[style.visibility]="isDisabled ? 'hidden' : 'visible'">
+</mat-icon>
+
+<span *ngIf="text" data-test-class="button-with-spinner-text">{{ text }}</span>
+
+<goofy-client-spinner
+		[diameter]="22" padding="0"
+		[stateResource]="stateResource"
+		[show]="showSpinner">
+</goofy-client-spinner>
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.scss b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..51ca9b238141c180a3662adeea18b850acd71d28
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.scss
@@ -0,0 +1,22 @@
+$leftMargin: 8px;
+
+:host {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+span {
+	margin-left: $leftMargin;
+}
+
+goofy-client-spinner {
+	position: absolute;
+	top: 0;
+	display: flex;
+	height: 100%;
+	width: 100%;
+	justify-content: flex-start;
+	align-items: center;
+}
+
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dcec09dddd50d60748ba045794ac94b4c3a72060
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.spec.ts
@@ -0,0 +1,79 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MatIcon } from '@angular/material/icon';
+import { getDataTestClassOf } from 'libs/tech-shared/test/data-test';
+import { MockComponent } from 'ng-mocks';
+import { SpinnerComponent } from '../../../spinner/spinner.component';
+import { OzgcloudButtonContentComponent } from './ozgcloud-button-content.component';
+
+describe('OzgcloudButtonContentComponent', () => {
+	let component: OzgcloudButtonContentComponent;
+	let fixture: ComponentFixture<OzgcloudButtonContentComponent>;
+
+	const iconSelector: string = getDataTestClassOf('icon');
+	const text: string = getDataTestClassOf('button-with-spinner-text');
+
+	beforeEach(async () => {
+		await TestBed.configureTestingModule({
+			declarations: [
+				MatIcon,
+				MockComponent(SpinnerComponent),
+				OzgcloudButtonContentComponent
+			],
+		}).compileComponents();
+
+		fixture = TestBed.createComponent(OzgcloudButtonContentComponent);
+		component = fixture.componentInstance;
+		fixture.detectChanges();
+	});
+
+	it('should create', () => {
+		expect(component).toBeTruthy();
+	});
+
+	describe('Icon', () => {
+
+		beforeEach(() => {
+			component.icon = 'add';
+		})
+
+		it('should be visible', () => {
+			component.isDisabled = false;
+			fixture.detectChanges();
+
+			const icon = fixture.nativeElement.querySelector(iconSelector);
+
+			expect(icon).toBeVisible();
+		});
+
+		it('should not be visible', () => {
+			component.isDisabled = true;
+			fixture.detectChanges();
+
+			const icon = fixture.nativeElement.querySelector(iconSelector);
+
+			expect(icon).not.toBeVisible();
+		});
+	})
+
+	describe('Text', () => {
+
+		it('should be visible if exist', () => {
+			component.text = 'Test text';
+			fixture.detectChanges();
+
+			const textElement = fixture.nativeElement.querySelector(text);
+
+			expect(textElement).toBeInTheDocument();
+		});
+
+		it('should not be visible if is null', () => {
+			component.text = null;
+			fixture.detectChanges();
+
+			const textElement = fixture.nativeElement.querySelector(text);
+
+			expect(textElement).not.toBeInTheDocument();
+		});
+	})
+
+});
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4a7c57ed021b3396fa0bb3483e618367a6309ea6
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.ts
@@ -0,0 +1,19 @@
+import { Component, Input } from '@angular/core';
+import { StateResource } from '@goofy-client/tech-shared';
+import { Resource } from '@ngxp/rest';
+
+@Component({
+	selector: 'goofy-client-ozgcloud-button-content',
+	templateUrl: './ozgcloud-button-content.component.html',
+	styleUrls: ['./ozgcloud-button-content.component.scss'],
+})
+export class OzgcloudButtonContentComponent {
+
+	@Input() icon: string;
+	@Input() svgIcon: string;
+	@Input() text: string;
+	@Input() stateResource: StateResource<Resource>;
+	@Input() showSpinner: boolean = false;
+	@Input() isDisabled: boolean = false;
+
+}
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.scss b/goofy-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.scss
index d981d714ce1489424fa764faa69d7e6e8f462791..95f1adbcfaa0000d68178e5b675f9c768cc3146c 100644
--- a/goofy-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.scss
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.scss
@@ -1,8 +1,6 @@
-:host {
-	vertical-align: initial !important;
-}
+@import 'variables';
 
-mat-icon {
+:host {
 	display: inline-block;
-	vertical-align: middle;
-}
+	height: $iconHeight;
+}
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.scss b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.scss
index e3fe170bf2dd173f7dbe7998a7510ac492d857f1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.scss
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.scss
@@ -1,6 +0,0 @@
-::ng-deep {
-	.mat-menu-panel.menu {
-		max-width: 350px;
-		background-color: #fafafa;
-	}
-}
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts
index fae42566896908052b5abb309f9961da2e5bd6fc..d2a8dbed4d5ccc6c6531fc8b7369b511d08645a8 100644
--- a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts
@@ -1,5 +1,5 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu';
+import { MatMenuModule } from '@angular/material/menu';
 import { OzgcloudMenuComponent } from './ozgcloud-menu.component';
 
 describe('OzgcloudMenuComponent', () => {
diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts
index 047d29ad006d13abc475f6ba22b5b339f5010690..e634603a692352e7f9fceb09217996625777b1c1 100644
--- a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts
+++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts
@@ -1,5 +1,5 @@
 import { Component, ViewChild } from '@angular/core';
-import { MatLegacyMenu as MatMenu } from '@angular/material/legacy-menu';
+import { MatMenu } from '@angular/material/menu';
 
 @Component({
 	selector: 'goofy-client-ozgcloud-menu',
diff --git a/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts
index b8f81df666f3c762e9007e378adeee09f82ff489..7f6ae1de86bfe2c0bbc182b3280daec48805a4f5 100644
--- a/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { MatLegacyProgressBar as MatProgressBar } from '@angular/material/legacy-progress-bar';
+import { MatProgressBar } from '@angular/material/progress-bar';
 import { createEmptyStateResource } from '@goofy-client/tech-shared';
 import { ProgressBarComponent } from './progress-bar.component';
 
diff --git a/goofy-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.spec.ts
index 73e42ba20a84b0af673e748fe5269c7c20b71765..108c2d62672dc5532d278e7df93efe194a898771 100644
--- a/goofy-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.spec.ts
@@ -23,8 +23,8 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatRippleModule } from '@angular/material/core';
-import { MatLegacySlideToggle as MatSlideToggle } from '@angular/material/legacy-slide-toggle';
-import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MatSlideToggle } from '@angular/material/slide-toggle';
+import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
 import { SlideToggleComponent } from './slide-toggle.component';
 
 describe('SlideToggleComponent', () => {
@@ -38,7 +38,7 @@ describe('SlideToggleComponent', () => {
 			],
 			declarations: [
 				SlideToggleComponent,
-				MattooltipDirective,
+				MatTooltipDirective,
 				MatSlideToggle
 			],
 		}).compileComponents();
diff --git a/goofy-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts
index 3eb0ac268d79cabdd6b288fd2d929e82b344f261..bee8cfbc41884d1e0761b218ab181ca051434c0d 100644
--- a/goofy-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts
@@ -23,7 +23,7 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacySpinner as MatSpinner } from '@angular/material/legacy-progress-spinner';
+import { MatSpinner } from '@angular/material/progress-spinner';
 import { createEmptyStateResource } from '@goofy-client/tech-shared';
 import { getElementFromFixture } from '@goofy-client/test-utils';
 import { getDataTestClassOf } from 'libs/tech-shared/test/data-test';
diff --git a/goofy-client/libs/ui/src/lib/ui/ui.module.ts b/goofy-client/libs/ui/src/lib/ui/ui.module.ts
index dc3507bffca24c209602fef94c0423de0c3d2207..b1f4f114189dad671bb5ec17c980166a547bbbe3 100644
--- a/goofy-client/libs/ui/src/lib/ui/ui.module.ts
+++ b/goofy-client/libs/ui/src/lib/ui/ui.module.ts
@@ -26,25 +26,25 @@ import { HTTP_INTERCEPTORS } from '@angular/common/http';
 import { NgModule } from '@angular/core';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
 import { DateFnsAdapter, MatDateFnsModule } from '@angular/material-date-fns-adapter';
+import { MatAutocompleteModule } from '@angular/material/autocomplete';
 import { MatBadgeModule } from '@angular/material/badge';
+import { MatButtonModule } from '@angular/material/button';
 import { MatButtonToggleModule } from '@angular/material/button-toggle';
+import { MatCheckboxModule } from '@angular/material/checkbox';
 import { DateAdapter, MAT_DATE_LOCALE, MatRippleModule } from '@angular/material/core';
 import { MatDatepickerModule } from '@angular/material/datepicker';
+import { MatDialogModule } from '@angular/material/dialog';
 import { MatExpansionModule } from '@angular/material/expansion';
+import { MatFormFieldModule } from '@angular/material/form-field';
 import { MatIconModule } from '@angular/material/icon';
-import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete';
-import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
-import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox';
-import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
-import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
-import { MatLegacyListModule as MatListModule } from '@angular/material/legacy-list';
-import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu';
-import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar';
-import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner';
-import { MatLegacySlideToggleModule as MatSlideToggleModule } from '@angular/material/legacy-slide-toggle';
-import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar';
-import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs';
+import { MatInputModule } from '@angular/material/input';
+import { MatListModule } from '@angular/material/list';
+import { MatMenuModule } from '@angular/material/menu';
+import { MatProgressBarModule } from '@angular/material/progress-bar';
+import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
+import { MatSlideToggleModule } from '@angular/material/slide-toggle';
+import { MatSnackBarModule } from '@angular/material/snack-bar';
+import { MatTabsModule } from '@angular/material/tabs';
 import { RouterModule } from '@angular/router';
 import { TechSharedModule } from '@goofy-client/tech-shared';
 import { de } from 'date-fns/locale';
@@ -60,7 +60,6 @@ import { BackButtonComponent } from './back-button/back-button.component';
 import { BasicDialogComponent } from './basic-dialog/basic-dialog.component';
 import { ButtonToggleGroupComponent } from './button-toggle-group/button-toggle-group.component';
 import { ButtonToggleComponent } from './button-toggle/button-toggle.component';
-import { ButtonWithSpinnerComponent } from './button-with-spinner/button-with-spinner.component';
 import { DownloadButtonComponent } from './download-button/download-button.component';
 import { AutocompleteEditorComponent } from './editor/autocomplete-editor/autocomplete-editor.component';
 import { DateEditorComponent } from './editor/date-editor/date-editor.component';
@@ -74,10 +73,13 @@ import { FixedDialogComponent } from './fixed-dialog/fixed-dialog.component';
 import { ConnectionTimeoutRetryDialogComponent } from './http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component';
 import { ConnectionTimeoutRetryFailDialogComponent } from './http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component';
 import { IconButtonWithSpinnerComponent } from './icon-button-with-spinner/icon-button-with-spinner.component';
-import { MattooltipClassDirective, MattooltipDirective, MattooltipDisabledDirective } from './mattooltip/mattooltip.directive';
+import { MatTooltipClassDirective, MatTooltipDirective, MatTooltipDisabledDirective } from './mattooltip/mattooltip.directive';
 import { MenuItemComponent } from './menu-item/menu-item.component';
 import { InternalServerErrorDialogComponent } from './notification/internal-server-error-dialog/internal-server-error-dialog.component';
 import { OpenUrlButtonComponent } from './open-url-button/open-url-button.component';
+import { OzgcloudButtonWithSpinnerComponent } from './ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from './ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component';
+import { OzgcloudButtonContentComponent } from './ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component';
 import { OzgcloudIconComponent } from './ozgcloud-icon/ozgcloud-icon.component';
 import { OzgcloudMenuComponent } from './ozgcloud-menu/ozgcloud-menu.component';
 import { OzgcloudRoutingButtonComponent } from './ozgcloud-routing-button/ozgcloud-routing-button.component';
@@ -90,85 +92,150 @@ import { SpinnerComponent } from './spinner/spinner.component';
 import { SubnavigationComponent } from './subnavigation/subnavigation.component';
 import { ValidationErrorComponent } from './validation-error/validation-error.component';
 
-const components = [
-	SubnavigationComponent,
-	SpinnerComponent,
-	ButtonWithSpinnerComponent,
-	IconButtonWithSpinnerComponent,
-	ProgressBarComponent,
-	ExpansionPanelComponent,
-	SnackbarInfoComponent,
-	SnackbarErrorComponent,
-	EnumEditorComponent,
-	FileUploadComponent,
-	DateEditorComponent,
-	TextEditorComponent,
-	TextAreaEditorComponent,
-	ValidationErrorComponent,
-	AutocompleteEditorComponent,
-	FixedDialogComponent,
-	EnumEditorComponent,
-	InternalServerErrorDialogComponent,
-	FileUploadEditorComponent,
-	MattooltipDirective,
-	MattooltipDisabledDirective,
-	MattooltipClassDirective,
-	MenuItemComponent,
-	PostfachIconComponent,
-	AccordionComponent,
-	AppIconComponent,
-	SlideToggleComponent,
-	BackButtonComponent,
-	ButtonToggleGroupComponent,
-	ButtonToggleComponent,
-	OzgcloudIconComponent,
-	OzgcloudRoutingButtonComponent,
-	OzgcloudSvgIconComponent,
-	OzgcloudSvgIconBigComponent,
-	SpinnerTransparencyComponent,
-	OpenUrlButtonComponent,
-	DownloadButtonComponent,
-	OzgcloudMenuComponent
-];
-
-const modules = [
-	MatButtonModule,
-	MatIconModule,
-	MatProgressBarModule,
-	MatProgressSpinnerModule,
-	MatMenuModule,
-	MatSlideToggleModule,
-	MatExpansionModule,
-	MatRippleModule,
-	MatSnackBarModule,
-	MatCheckboxModule,
-	MatFormFieldModule,
-	MatInputModule,
-	MatListModule,
-	MatDatepickerModule,
-	MatDateFnsModule,
-	FormsModule,
-	ReactiveFormsModule,
-	MatAutocompleteModule,
-	MatDialogModule,
-	MatTabsModule,
-	MatBadgeModule,
-	CommonModule,
-	TechSharedModule,
-	RouterModule,
-	MatButtonToggleModule,
-];
-
 @NgModule({
 	declarations: [
-		components,
+		SubnavigationComponent,
+		SpinnerComponent,
+		OzgcloudButtonWithSpinnerComponent,
+		OzgcloudStrokedButtonWithSpinnerComponent,
+		IconButtonWithSpinnerComponent,
+		ProgressBarComponent,
+		ExpansionPanelComponent,
+		SnackbarInfoComponent,
+		SnackbarErrorComponent,
+		EnumEditorComponent,
+		FileUploadComponent,
+		DateEditorComponent,
+		TextEditorComponent,
+		TextAreaEditorComponent,
+		ValidationErrorComponent,
+		AutocompleteEditorComponent,
+		FixedDialogComponent,
+		EnumEditorComponent,
+		InternalServerErrorDialogComponent,
+		FileUploadEditorComponent,
+		MatTooltipDirective,
+		MatTooltipDisabledDirective,
+		MatTooltipClassDirective,
+		MenuItemComponent,
+		PostfachIconComponent,
+		AccordionComponent,
+		AppIconComponent,
+		SlideToggleComponent,
+		BackButtonComponent,
+		ButtonToggleGroupComponent,
+		ButtonToggleComponent,
+		OzgcloudIconComponent,
+		OzgcloudRoutingButtonComponent,
+		OzgcloudSvgIconComponent,
+		OzgcloudSvgIconBigComponent,
+		SpinnerTransparencyComponent,
+		OpenUrlButtonComponent,
+		DownloadButtonComponent,
+		OzgcloudMenuComponent,
+		ConnectionTimeoutRetryDialogComponent,
+		ConnectionTimeoutRetryFailDialogComponent,
+		SnackbarCloseButtonComponent,
+		BasicDialogComponent,
+		OzgcloudButtonContentComponent
+	],
+	imports: [
+		MatButtonModule,
+		MatIconModule,
+		MatProgressBarModule,
+		MatProgressSpinnerModule,
+		MatMenuModule,
+		MatSlideToggleModule,
+		MatExpansionModule,
+		MatRippleModule,
+		MatSnackBarModule,
+		MatCheckboxModule,
+		MatFormFieldModule,
+		MatInputModule,
+		MatListModule,
+		MatDatepickerModule,
+		MatDateFnsModule,
+		FormsModule,
+		ReactiveFormsModule,
+		MatAutocompleteModule,
+		MatDialogModule,
+		MatTabsModule,
+		MatBadgeModule,
+		CommonModule,
+		TechSharedModule,
+		RouterModule,
+		MatButtonToggleModule
+	],
+	exports: [
+		MatButtonModule,
+		MatIconModule,
+		MatProgressBarModule,
+		MatProgressSpinnerModule,
+		MatMenuModule,
+		MatSlideToggleModule,
+		MatExpansionModule,
+		MatRippleModule,
+		MatSnackBarModule,
+		MatCheckboxModule,
+		MatFormFieldModule,
+		MatInputModule,
+		MatListModule,
+		MatDatepickerModule,
+		MatDateFnsModule,
+		FormsModule,
+		ReactiveFormsModule,
+		MatAutocompleteModule,
+		MatDialogModule,
+		MatTabsModule,
+		MatBadgeModule,
+		CommonModule,
+		TechSharedModule,
+		RouterModule,
+		MatButtonToggleModule,
+		SubnavigationComponent,
+		SpinnerComponent,
+		OzgcloudButtonWithSpinnerComponent,
+		OzgcloudStrokedButtonWithSpinnerComponent,
+		IconButtonWithSpinnerComponent,
+		ProgressBarComponent,
+		ExpansionPanelComponent,
+		SnackbarInfoComponent,
+		SnackbarErrorComponent,
+		EnumEditorComponent,
+		FileUploadComponent,
+		DateEditorComponent,
+		TextEditorComponent,
+		TextAreaEditorComponent,
+		ValidationErrorComponent,
+		AutocompleteEditorComponent,
+		FixedDialogComponent,
+		EnumEditorComponent,
+		InternalServerErrorDialogComponent,
+		FileUploadEditorComponent,
+		MatTooltipDirective,
+		MatTooltipDisabledDirective,
+		MatTooltipClassDirective,
+		MenuItemComponent,
+		PostfachIconComponent,
+		AccordionComponent,
+		AppIconComponent,
+		SlideToggleComponent,
+		BackButtonComponent,
+		ButtonToggleGroupComponent,
+		ButtonToggleComponent,
+		OzgcloudIconComponent,
+		OzgcloudRoutingButtonComponent,
+		OzgcloudSvgIconComponent,
+		OzgcloudSvgIconBigComponent,
+		SpinnerTransparencyComponent,
+		OpenUrlButtonComponent,
+		DownloadButtonComponent,
+		OzgcloudMenuComponent,
 		ConnectionTimeoutRetryDialogComponent,
 		ConnectionTimeoutRetryFailDialogComponent,
 		SnackbarCloseButtonComponent,
 		BasicDialogComponent,
 	],
-	imports: [...modules],
-	exports: [...modules, ...components],
 	providers: [
 		{
 			provide: HTTP_INTERCEPTORS,
diff --git a/goofy-client/libs/user-assistance/src/lib/help-menu/_help-menu.theme.scss b/goofy-client/libs/user-assistance/src/lib/help-menu/_help-menu.theme.scss
deleted file mode 100644
index e2dd3e9a0986d661fda9d2a9a317ec7d93cc27db..0000000000000000000000000000000000000000
--- a/goofy-client/libs/user-assistance/src/lib/help-menu/_help-menu.theme.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-goofy-client-help-menu {
-	.mat-fab {
-		box-shadow: none !important;
-		background-color: transparent !important;
-		border-radius: 10px;
-		height: 40px;
-		width: auto;
-		.mat-button-wrapper {
-			padding: 0.5rem;
-		}
-	}
-}
\ No newline at end of file
diff --git a/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/documentation.component.scss b/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/documentation.component.scss
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a440dd243c68309efbcf544aa7f680ad7b94efc7 100644
--- a/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/documentation.component.scss
+++ b/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/documentation.component.scss
@@ -0,0 +1,3 @@
+:host {
+	white-space: nowrap;
+}
\ No newline at end of file
diff --git a/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/dowload-documentation-button/download-documentation-button.component.ts b/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/dowload-documentation-button/download-documentation-button.component.ts
index cc44375e2821e8a51fff5d37f8a3e58b4b236e61..4e26419b8f4543755cb6bb677f0ca920d2291427 100644
--- a/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/dowload-documentation-button/download-documentation-button.component.ts
+++ b/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/dowload-documentation-button/download-documentation-button.component.ts
@@ -1,6 +1,6 @@
 import { Component, Input } from '@angular/core';
 
-const FILE_NAME_REGEX: string = '^.*\\/(.*.pdf)$';
+const FILE_NAME_REGEX: RegExp = /^.*\/(.*.pdf)$/;
 
 @Component({
 	selector: 'goofy-client-download-documentation-button',
diff --git a/goofy-client/libs/user-assistance/src/lib/help-menu/help-menu.component.scss b/goofy-client/libs/user-assistance/src/lib/help-menu/help-menu.component.scss
index 659bfb479d6bb866431b89c8634ca8306ea0a666..f37eb84c894b33653670999079d6904caa4a59e3 100644
--- a/goofy-client/libs/user-assistance/src/lib/help-menu/help-menu.component.scss
+++ b/goofy-client/libs/user-assistance/src/lib/help-menu/help-menu.component.scss
@@ -4,9 +4,6 @@
 	display: flex;
 	align-items: center;
 	color: $grey;
-	.text {
-		margin-top: 1px;
-	}
 }
 
 goofy-client-ozgcloud-icon {
diff --git a/goofy-client/libs/user-profile/src/lib/link-with-user-name-tooltip-container/link-with-user-name-tooltip/link-with-user-name-tooltip.component.spec.ts b/goofy-client/libs/user-profile/src/lib/link-with-user-name-tooltip-container/link-with-user-name-tooltip/link-with-user-name-tooltip.component.spec.ts
index 9ef8caa38544a8a8a169635e57373d090e92ab03..0c0e248074f713e6b24d87eefe5443d074d74ed2 100644
--- a/goofy-client/libs/user-profile/src/lib/link-with-user-name-tooltip-container/link-with-user-name-tooltip/link-with-user-name-tooltip.component.spec.ts
+++ b/goofy-client/libs/user-profile/src/lib/link-with-user-name-tooltip-container/link-with-user-name-tooltip/link-with-user-name-tooltip.component.spec.ts
@@ -25,7 +25,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { RouterTestingModule } from '@angular/router/testing';
 import { createStateResource } from '@goofy-client/tech-shared';
 import { UserProfileResource } from '@goofy-client/user-profile-shared';
-import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
 import { createUserProfileResource } from 'libs/user-profile-shared/test/user-profile';
 import { LinkWithUserNameTooltipComponent } from './link-with-user-name-tooltip.component';
 
@@ -43,7 +43,7 @@ describe('LinkWithUserNameTooltipComponent', () => {
 			],
 			declarations: [
 				LinkWithUserNameTooltipComponent,
-				MattooltipDirective
+				MatTooltipDirective
 			],
 		}).compileComponents();
 	});
diff --git a/goofy-client/libs/user-profile/src/lib/text-with-user-name-tooltip-container/text-with-user-name-tooltip/text-with-user-name-tooltip.component.spec.ts b/goofy-client/libs/user-profile/src/lib/text-with-user-name-tooltip-container/text-with-user-name-tooltip/text-with-user-name-tooltip.component.spec.ts
index d1d97ad800dfe6d434c2a3fa099392a6f5df5c39..50c2ff52b4beb2257dc582808cfa9ba05214368b 100644
--- a/goofy-client/libs/user-profile/src/lib/text-with-user-name-tooltip-container/text-with-user-name-tooltip/text-with-user-name-tooltip.component.spec.ts
+++ b/goofy-client/libs/user-profile/src/lib/text-with-user-name-tooltip-container/text-with-user-name-tooltip/text-with-user-name-tooltip.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { createStateResource } from '@goofy-client/tech-shared';
 import { UserProfileResource } from '@goofy-client/user-profile-shared';
-import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
 import { createUserProfileResource } from 'libs/user-profile-shared/test/user-profile';
 import { TextWithUserNameTooltipComponent } from './text-with-user-name-tooltip.component';
 
@@ -39,7 +39,7 @@ describe('TextWithUserNameTooltipComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				TextWithUserNameTooltipComponent,
-				MattooltipDirective,
+				MatTooltipDirective,
 			],
 		}).compileComponents();
 	});
diff --git a/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.scss b/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.scss
index 15cc0f1b665139576d7d143dad6b34765409a3d9..ca9d41ae4bf0898241098cfcf8d57b8d53f9724c 100644
--- a/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.scss
+++ b/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.scss
@@ -23,7 +23,7 @@
  */
 @use 'sass:map';
 @use '@angular/material' as mat;
-@import "variables";
+@import 'variables';
 
 .user-profile {
 	width: 36px;
diff --git a/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.spec.ts b/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.spec.ts
index 7a396cb279bcc559e93281d93b47ba6313d4d39d..2c46e012c9f2568d11e8418b422d8dcec55e8ef1 100644
--- a/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.spec.ts
+++ b/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.spec.ts
@@ -24,12 +24,12 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIcon } from '@angular/material/icon';
 import { faker } from '@faker-js/faker';
-import { ApiError, createEmptyStateResource, createErrorStateResource, createStateResource, EMPTY_STRING, MessageCode } from '@goofy-client/tech-shared';
+import { ApiError, EMPTY_STRING, MessageCode, createEmptyStateResource, createErrorStateResource, createStateResource } from '@goofy-client/tech-shared';
 import { getElementFromFixture } from '@goofy-client/test-utils';
 import { SpinnerComponent } from '@goofy-client/ui';
-import { NO_NAME_MESSAGE, userProfileMessage, UserProfileResource } from '@goofy-client/user-profile-shared';
+import { NO_NAME_MESSAGE, UserProfileResource, userProfileMessage } from '@goofy-client/user-profile-shared';
 import { getDataTestClassOf } from 'libs/tech-shared/test/data-test';
-import { MattooltipDirective, MattooltipDisabledDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MatTooltipDirective, MatTooltipDisabledDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
 import { createUserProfileResource } from 'libs/user-profile-shared/test/user-profile';
 import { MockComponent } from 'ng-mocks';
 import { createApiError, createIssue } from '../../../../tech-shared/test/error';
@@ -51,8 +51,8 @@ describe('UserIconComponent', () => {
 			declarations: [
 				UserIconComponent,
 				MatIcon,
-				MattooltipDirective,
-				MattooltipDisabledDirective,
+				MatTooltipDirective,
+				MatTooltipDisabledDirective,
 				MockComponent(SpinnerComponent)
 			]
 		})
diff --git a/goofy-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts b/goofy-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts
index 89469ef25845c71fa6f38b363bf6380f1b408c1e..5d50b4783d2fdbcfc5d30baf28dac0455d956fb1 100644
--- a/goofy-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts
+++ b/goofy-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input, OnInit, ViewChild } from '@angular/core';
-import { MatLegacyMenuTrigger as MatMenuTrigger } from '@angular/material/legacy-menu';
+import { MatMenuTrigger } from '@angular/material/menu';
 import { StateResource } from '@goofy-client/tech-shared';
 import { UserProfileResource, UserProfileService } from '@goofy-client/user-profile-shared';
 import { Observable, tap } from 'rxjs';
diff --git a/goofy-client/libs/user-profile/src/lib/user-profile-search-container/user-profile-search/user-profile-search.component.spec.ts b/goofy-client/libs/user-profile/src/lib/user-profile-search-container/user-profile-search/user-profile-search.component.spec.ts
index 8b55d8b04861caf5cf39b0596d8a109b39eb87d3..4e39de54b68d7a3c71246b7729b65d0a4a4ccb0f 100644
--- a/goofy-client/libs/user-profile/src/lib/user-profile-search-container/user-profile-search/user-profile-search.component.spec.ts
+++ b/goofy-client/libs/user-profile/src/lib/user-profile-search-container/user-profile-search/user-profile-search.component.spec.ts
@@ -23,7 +23,7 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatFormFieldModule } from '@angular/material/form-field';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { mock } from '@goofy-client/test-utils';
 import { AutocompleteEditorComponent } from '@goofy-client/ui';
diff --git a/goofy-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts b/goofy-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts
index d7b9222c00673505dbe05c65a93a58b145d70554..7f3f1bc3ab1fdd19bf3050f50e3737de3eb97cca 100644
--- a/goofy-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts
+++ b/goofy-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
+import { MatButtonModule } from '@angular/material/button';
 import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import { ApiRootLinkRel } from '@goofy-client/api-root-shared';
 import { HasLinkPipe, createEmptyStateResource, createStateResource } from '@goofy-client/tech-shared';
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html
index 4feb77da5d53a07255e1e433f4012c378a116016..c9734b41bf9cad1a25345e241ae974146ca9b020 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html
@@ -25,12 +25,12 @@
 -->
 <ng-container *ngIf="vorgang | hasLink: linkRel.ABSCHLIESSEN">
 
-	<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="abschliessen-button"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="abschliessen-button"
 		text="Abschließen"
 		icon="done"
 		[stateResource]="commandStateResource$ | async"
 		(clickEmitter)="abschliessen()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 	<goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="abschliessen-icon-button"
 		icon="done"
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts
index beb4ac66e306345b050869681b315003b7b6130f..88b000dc9e31fb47c119cdde91e2ec408cb2d23f 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
@@ -46,7 +46,7 @@ describe('AbschliessenButtonComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				AbschliessenButtonComponent,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent),
 				HasLinkPipe
 			],
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.html
index 03c6bc82731755903824acde8f8de155c1b9d1c1..893f71b3477092344997446a77fcf646a098bcdd 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.html
@@ -25,12 +25,12 @@
 -->
 <ng-container *ngIf="vorgang | hasLink: linkRel.ANNEHMEN">
 
-	<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="annehmen-button"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="annehmen-button"
 		text="Annehmen"
 		icon="check_circle_outline"
 		[stateResource]="commandStateResource$ | async"
 		(clickEmitter)="annehmen()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 	<goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="annehmen-icon-button"
 		icon="check_circle_outline"
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.spec.ts
index c45c73fb294465417b8a784a2feac586d9ca519b..d7e1fd7703068b5e1c864f7fd5929872c5c05d65 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
@@ -46,7 +46,7 @@ describe('AnnehmenButtonComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				AnnehmenButtonComponent,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent),
 				HasLinkPipe
 			],
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.html
index c0cb8cadca0b541dd881e990c3b4318b55cf5b3c..066894ec68f95c7f2b552690324e9d02783d1d88 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.html
@@ -25,12 +25,12 @@
 -->
 <ng-container *ngIf="vorgang | hasLink: linkRel.BEARBEITEN">
 
-	<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="bearbeiten-button"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="bearbeiten-button"
 		text="Bearbeiten"
 		icon="edit_icon"
 		[stateResource]="commandStateResource$ | async"
 		(clickEmitter)="bearbeiten()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 	<goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="bearbeiten-icon-button"
 		svgIcon="edit"
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.spec.ts
index 513aaae5ecf99cc49be56c9c56e45e1f2eead17b..23b0d0306b64d5c0d75b727af28f5100c26c10f5 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.spec.ts
@@ -22,9 +22,9 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { createStateResource, HasLinkPipe } from '@goofy-client/tech-shared';
+import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
@@ -45,7 +45,7 @@ describe('BearbeitenButtonComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				BearbeitenButtonComponent,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent),
 				HasLinkPipe
 			],
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.html
index d18ce06c95d3ced026ed65a8ce7dcaeccf7fcc0d..c9b40ffb445afbb960328cde56d2e5d670980bcf 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.html
@@ -25,12 +25,12 @@
 -->
 <ng-container *ngIf="vorgang | hasLink: linkRel.BESCHEIDEN">
 
-	<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="bescheiden-button"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="bescheiden-button"
 		text="Bescheiden"
 		svgIcon="stamp"
 		[stateResource]="commandStateResource$ | async"
 		(clickEmitter)="bescheiden()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 	<goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="bescheiden-icon-button"
 		svgIcon="stamp"
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts
index a481108f53506e0eda54e81df69ff79ecf3d0ee1..744f76b7702e6e65aa5777f31b5d7991e8669829 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
@@ -47,7 +47,7 @@ describe('BescheidenButtonComponent', () => {
 			declarations: [
 				BescheidenButtonComponent,
 				HasLinkPipe,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent)
 			],
 			providers: [
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.html
index 378cb27ef72ca0e56a2761ece947b93531fc9fa5..a31a193ee0d9d751156c028081c354655a602f70 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.html
@@ -25,12 +25,12 @@
 -->
 <ng-container *ngIf="vorgang | hasLink: linkRel.VERWERFEN">
 
-	<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="verwerfen-button"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="verwerfen-button"
 		text="Verwerfen"
 		svgIcon="discard_document"
 		[stateResource]="commandStateResource$ | async"
 		(clickEmitter)="verwerfen()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 	<goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="verwerfen-icon-button"
 		svgIcon="discard_document"
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.spec.ts
index c9b24b56c49e09a3dbd190d1e7ba23ef3096a4e7..08f11d59d273b54f3b84ad3c853221794ea25941 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
@@ -46,7 +46,7 @@ describe('VerwerfenButtonComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				VerwerfenButtonComponent,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent),
 				HasLinkPipe
 			],
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.html
index 7f5b16a1f31e69aba092c5ad44fc831ba4f372b7..cce50c8dcfb60e1fb50da2c2054cc65500870547 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.html
@@ -25,12 +25,12 @@
 -->
 <ng-container *ngIf="vorgang | hasLink: linkRel.WIEDEREROEFFNEN">
 
-	<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="wiedereroeffnen-button"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="wiedereroeffnen-button"
 		text="Wiedereröffnen"
 		icon="undo"
 		[stateResource]="commandStateResource$ | async"
 		(clickEmitter)="wiedereroeffnen()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 	<goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="wiedereroeffnen-icon-button"
 		icon="undo"
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.spec.ts
index 581a82533a60a4451e06f9caf33f1f8e8ff4ef3b..d8fd9aee50aae6af0fffa80c975f39a212c0ec00 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
@@ -46,7 +46,7 @@ describe('WiedereroeffnenButtonComponent', () => {
 			declarations: [
 				WiedereroeffnenButtonComponent,
 				HasLinkPipe,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent)
 			],
 			providers: [
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.html
index 1e5a52c35863094a54548c8df16f08ac0e9f4a51..0d48160c61ffb8c4693020bfa999defd596751b5 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.html
@@ -25,12 +25,12 @@
 -->
 <ng-container *ngIf="vorgang | hasLink: linkRel.ZURUECKHOLEN">
 
-	<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="zurueckholen-button"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="zurueckholen-button"
 		text="Zurückholen"
 		icon="undo"
 		[stateResource]="commandStateResource$ | async"
 		(click)="zurueckholen()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 	<goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="zurueckholen-icon-button"
 		icon="undo"
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.spec.ts
index b7e845cc296b6c778c7ccc2aa68c5bf3d02ac810..f4b750b13276e3a576fd789e6d638e9993933975 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
@@ -47,7 +47,7 @@ describe('ZurueckholenButtonComponent', () => {
 			declarations: [
 				ZurueckholenButtonComponent,
 				HasLinkPipe,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent)
 			],
 			providers: [
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.html
index 554e07c6e57b480141cb4f360d19fc15fae53c95..3bce6a332a7a104d7c160b2e649f30b82c696777 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.html
@@ -25,12 +25,12 @@
 -->
 <ng-container *ngIf="vorgang | hasLink: linkRel.ZURUECKSTELLEN">
 
-	<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="zurueckstellen-button"
+	<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="zurueckstellen-button"
 		text="Zurückstellen"
 		icon="undo"
 		[stateResource]="commandStateResource$ | async"
 		(clickEmitter)="zurueckstellen()">
-	</goofy-client-button-with-spinner>
+	</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 	<goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="zurueckstellen-icon-button"
 		icon="undo"
diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.spec.ts
index 9997c65a3342f7e1e43b258714302d35d6b8c47c..d039aabe413c9704d4cda9eb177d8b7331176ee0 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.spec.ts
@@ -24,7 +24,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
@@ -47,7 +47,7 @@ describe('ZurueckstellenButtonComponent', () => {
 			declarations: [
 				ZurueckstellenButtonComponent,
 				HasLinkPipe,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent)
 			],
 			providers: [
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.html
index d77af4023d461f23e98b57e018026c14ad756f03..cf2614dab7295acadeb7ed1a6bd97ede4009e1b0 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.html
@@ -26,25 +26,25 @@
 <h3>Antragstellerdaten</h3>
 <mat-list *ngIf="antragstellerExists; else noAntragsteller" data-test-id="antragsteller-mat-list">
 	<mat-list-item *ngIf="name" >
-		<mat-icon mat-list-icon class="material-icons-outlined" aria-label="Name" aria-hidden="false">assignment_ind</mat-icon>
-		<div mat-line data-test-id="antragsteller-name">{{ name }}</div>
+		<mat-icon matListItemIcon class="material-icons-outlined" aria-label="Name" aria-hidden="false">assignment_ind</mat-icon>
+		<div matListItemLine data-test-id="antragsteller-name">{{ name }}</div>
 	</mat-list-item>
 	<mat-list-item *ngIf="antragsteller.email">
-		<mat-icon mat-list-icon class="material-icons-outlined" aria-label="E-Mail-Adresse" aria-hidden="false">email</mat-icon>
-		<div mat-line data-test-id="antragsteller-email">{{ antragsteller.email }}</div>
+		<mat-icon matListItemIcon class="material-icons-outlined" aria-label="E-Mail-Adresse" aria-hidden="false">email</mat-icon>
+		<div matListItemLine data-test-id="antragsteller-email">{{ antragsteller.email }}</div>
 	</mat-list-item>
 	<mat-list-item *ngIf="antragsteller.telefon">
-		<mat-icon mat-list-icon class="material-icons-outlined" aria-label="Telefonnummer" aria-hidden="false">call_black</mat-icon>
-		<div mat-line data-test-id="antragsteller-telefon">{{ antragsteller.telefon }}</div>
+		<mat-icon matListItemIcon class="material-icons-outlined" aria-label="Telefonnummer" aria-hidden="false">call_black</mat-icon>
+		<div matListItemLine data-test-id="antragsteller-telefon">{{ antragsteller.telefon }}</div>
 	</mat-list-item>
 	<mat-list-item *ngIf="antragstellerStrasseHausnummer || antragstellerPlzOrt" data-test-id="antragsteller-adresse">
-		<mat-icon mat-list-icon class="material-icons-outlined" aria-label="Adresse" aria-hidden="false">location_on</mat-icon>
-		<div mat-line data-test-id="antragsteller-strasse-hausnummer">{{ antragstellerStrasseHausnummer }}</div>
-		<div mat-line data-test-id="antragsteller-plz-ort">{{ antragstellerPlzOrt }}</div>
+		<mat-icon matListItemIcon class="material-icons-outlined" aria-label="Adresse" aria-hidden="false">location_on</mat-icon>
+		<div matListItemLine data-test-id="antragsteller-strasse-hausnummer">{{ antragstellerStrasseHausnummer }}</div>
+		<div matListItemLine data-test-id="antragsteller-plz-ort">{{ antragstellerPlzOrt }}</div>
 	</mat-list-item>
 	<mat-list-item *ngIf="geburt">
-		<mat-icon mat-list-icon class="material-icons-outlined" aria-label="Geburtsdatum und Geburtsort" aria-hidden="false">cake</mat-icon>
-		<div mat-line data-test-id="antragsteller-geburt">{{ geburt }}</div>
+		<mat-icon matListItemIcon class="material-icons-outlined" aria-label="Geburtsdatum und Geburtsort" aria-hidden="false">cake</mat-icon>
+		<div matListItemLine data-test-id="antragsteller-geburt">{{ geburt }}</div>
 	</mat-list-item>
 </mat-list>
 
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.scss b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.scss
index 8984444b5f007b3e533fe2ddd5861561478e096a..7590abc0f79483e6ce2c98d6f925204c4822433f 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.scss
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.scss
@@ -21,34 +21,6 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-// Bei Bedarf in einen globalen Style verschieben.
-:host ::ng-deep {
-  .mat-list-base {
-    padding-top: 0;
-  }
-  .mat-list-base .mat-list-item,
-  .mat-list-base .mat-list-item.mat-list-item-with-avatar {
-    height: auto;
-    .mat-list-item-content {
-      padding: 0;
-      .mat-list-text {
-        padding-left: 6px;
-      }
-    }
-    .mat-icon {
-      padding: 2px 0 3px;
-    }
-    .mat-list-text > *,
-    .mat-line:nth-child(n+2) {
-      font-size: 14px;
-    }
-    .mat-line {
-      word-wrap: break-word;
-      white-space: pre-wrap;
-    }
-  }
-}
-
 h3 {
 	font-weight: 500;
 }
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.spec.ts
index d635652fd016263cf999253c1062154966c5fdf3..5a06ecec0f7beef48567fb870f1cfa2a0904aba7 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.spec.ts
@@ -26,7 +26,7 @@ import localeDe from '@angular/common/locales/de';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatRipple } from '@angular/material/core';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacyList as MatList, MatLegacyListItem as MatListItem } from '@angular/material/legacy-list';
+import { MatList, MatListItem } from '@angular/material/list';
 import { EMPTY_STRING } from '@goofy-client/tech-shared';
 import { Antragsteller } from '@goofy-client/vorgang-shared';
 import { getElementFromFixture } from 'libs/test-utils/src/lib/helper';
@@ -189,7 +189,7 @@ describe('VorgangDetailAntragstellerComponent', () => {
 		it('should be visible', () => {
 			const element = getElementFromFixture(fixture, antragstellerAdresse);
 
-			expect(element).toHaveClass('mat-list-item');
+			expect(element).toHaveClass('mdc-list-item');
 		});
 
 		it('should not be visible', () => {
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.scss b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.scss
index d7dae48756ba7455ba866b0b5d5b7f8425aad1c7..b5b56914f09e62caff0d9854980aea66191ec939 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.scss
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.scss
@@ -21,9 +21,9 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "breakpoints";
-@import "include-media/dist/include-media";
-@import "variables";
+@import 'breakpoints';
+@import 'include-media/dist/include-media';
+@import 'variables';
 
 :host {
 	position: relative;
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts
index e51f6661660e55cf0e984c5ed6021019401dc19d..c361c0a4d2aea3fff0424788795e77f595247f12 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts
@@ -22,12 +22,12 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog';
+import { MatDialogModule } from '@angular/material/dialog';
 import { VorgangForwardingContainerComponent } from '@goofy-client/forwarding';
 import { KommentarListInVorgangContainerComponent } from '@goofy-client/kommentar';
 import { PostfachMailListContainerComponent } from '@goofy-client/postfach';
 import { HasLinkPipe, ToEmbeddedResourcesPipe, createEmptyStateResource, createStateResource } from '@goofy-client/tech-shared';
-import { ButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { VorgangHeaderLinkRel, VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@goofy-client/vorgang-shared';
 import { WiedervorlageListInVorgangContainerComponent } from '@goofy-client/wiedervorlage';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
@@ -63,7 +63,7 @@ describe('VorgangDetailAreaComponent', () => {
 				MockComponent(SpinnerComponent),
 				MockComponent(VorgangDetailHeaderComponent),
 				MockComponent(VorgangDetailFormularButtonsComponent),
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(WiedervorlageListInVorgangContainerComponent),
 				MockComponent(KommentarListInVorgangContainerComponent),
 				MockComponent(PostfachMailListContainerComponent),
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.scss b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.scss
index 82592a13acc75a3a375f627dd393ca83f37aa4a6..752da8e715baef4bfef8fa45e0d721083e1cbfa5 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.scss
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.scss
@@ -25,7 +25,7 @@
 	margin-left: 48px;
 
 	::ng-deep {
-		goofy-client-button-with-spinner {
+		goofy-client-ozgcloud-stroked-button-with-spinner {
 			margin: 0 8px;
 		}
 	}
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.spec.ts
index 582c72dda4d9ba00d08ff0da516f961dc36a0ebb..4ec28f80b22f25b6e499b05c86ba07803264b291 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.spec.ts
@@ -25,7 +25,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { EndgueltigLoeschenButtonContainerComponent, LoeschAnforderungZuruecknehmenButtonContainerComponent, LoeschenAnfordernButtonContainerComponent } from '@goofy-client/loesch-anforderung';
 import { HasLinkPipe } from '@goofy-client/tech-shared';
 import { existsAsHtmlElement, notExistsAsHtmlElement } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
@@ -51,7 +51,7 @@ describe('VorgangDetailFormularButtonsComponent', () => {
 			declarations: [
 				VorgangDetailFormularButtonsComponent,
 				HasLinkPipe,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(AnnehmenButtonComponent),
 				MockComponent(BearbeitenButtonComponent),
 				MockComponent(VerwerfenButtonComponent),
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html
index 21d2178ff59a2575312fbd54ed1110f75dbaef79..9aa3b558e94fa6ed3c4f34e72f3a7b3547fe173b 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html
@@ -26,7 +26,7 @@
 <goofy-client-expansion-panel *ngIf="vorgangWithEingang.eingang" data-test-id="formulardaten-panel"
 	headline="Formulardaten">
 
-	<mat-tab-group animationDuration="0" [selectedIndex]="defaultSelection">
+	<mat-tab-group mat-stretch-tabs="false" mat-align-tabs="start" animationDuration="0" [selectedIndex]="defaultSelection">
 		<mat-tab label="Antragsdaten">
 			<goofy-client-vorgang-detail-antrag-data [eingang]="vorgangWithEingang.eingang" [antragsData]="antragsData"></goofy-client-vorgang-detail-antrag-data>
 		</mat-tab>
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts
index fc86ce4c021bcc6abad2e820c806cadb5fec8b99..b47775078b5ab9017c45b7b39056118851fed714 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs';
+import { MatTabsModule } from '@angular/material/tabs';
 import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import { HistorieContainerComponent } from '@goofy-client/historie';
 import { HasLinkPipe, NotHasLinkPipe } from '@goofy-client/tech-shared';
@@ -50,7 +50,7 @@ describe('VorgangDetailFormularDatenComponent', () => {
 		return `div[role=tab]:nth-child(${ index })`
 	}
 
-	const disabledTabClass: string = 'mat-tab-disabled';
+	const disabledTabClass: string = 'mat-mdc-tab-disabled';
 
 	const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource();
 	const vorgangWithHistorie: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.HISTORIE]);
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-header/vorgang-detail-header.component.scss b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-header/vorgang-detail-header.component.scss
index 99c7e9e6ad89df2284effdeaf3ed9782aa763ec4..5fd548620e9d7697331d507805a8399b98f86aea 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-header/vorgang-detail-header.component.scss
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-header/vorgang-detail-header.component.scss
@@ -21,9 +21,9 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "breakpoints";
-@import "include-media/dist/include-media";
-@import "variables";
+@import 'breakpoints';
+@import 'include-media/dist/include-media';
+@import 'variables';
 
 :host {
 	display: grid;
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html
index 1c329b9e9c0791cecb73888c89900c4e660a9f63..635de1e1acb8dc3e65198580f502a5b2540f30e3 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html
@@ -1,7 +1,6 @@
-<goofy-client-button-with-spinner dataTestId="export-vorgang"
+<goofy-client-ozgcloud-button-with-spinner dataTestId="export-vorgang"
 	[showSpinner]="(exportStateResource$ | async)?.loading"
 	(clickEmitter)="export()"
 	text="Herunterladen"
-	icon="save_alt"
-	[strokedButton]="false">
-</goofy-client-button-with-spinner>
\ No newline at end of file
+	icon="save_alt">
+</goofy-client-ozgcloud-button-with-spinner>
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts
index a859d4474ae101e53f028637e6296ac26e781dd9..61c5d016774d927717667a8fb3acb0caa44c8220 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts
@@ -1,7 +1,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { StateResource, createStateResource } from '@goofy-client/tech-shared';
 import { dispatchEventFromFixture, mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { OzgcloudButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { VorgangService } from '@goofy-client/vorgang-shared';
 import { MockComponent } from 'ng-mocks';
 import { of } from 'rxjs';
@@ -20,7 +20,7 @@ describe('VorgangExportContainerComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				VorgangExportContainerComponent,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudButtonWithSpinnerComponent),
 			],
 			providers: [
 				{
diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/aktenzeichen/aktenzeichen.component.spec.ts b/goofy-client/libs/vorgang-shared-ui/src/lib/aktenzeichen/aktenzeichen.component.spec.ts
index ce9281d41fdf94fc5d110426ea0c347ddf181840..b6354ae73c874ca75f65507c5489622c172729f7 100644
--- a/goofy-client/libs/vorgang-shared-ui/src/lib/aktenzeichen/aktenzeichen.component.spec.ts
+++ b/goofy-client/libs/vorgang-shared-ui/src/lib/aktenzeichen/aktenzeichen.component.spec.ts
@@ -23,7 +23,7 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { VorgangResource } from '@goofy-client/vorgang-shared';
-import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
 import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang';
 import { VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN } from '../vorgang-util';
 import { AktenzeichenComponent } from './aktenzeichen.component';
@@ -40,7 +40,7 @@ describe('AktenzeichenComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				AktenzeichenComponent,
-				MattooltipDirective
+				MatTooltipDirective
 			]
 		}).compileComponents();
 	});
diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-in-postfach-breadcrumb-container/vorgang-in-postfach-breadcrumb/vorgang-in-postfach-breadcrumb.component.scss b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-in-postfach-breadcrumb-container/vorgang-in-postfach-breadcrumb/vorgang-in-postfach-breadcrumb.component.scss
index c8508d6f0d2495ef29709fe4a001ab330c053222..fc20de9113991e7e70654e30b5f19da9be8e3bdb 100644
--- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-in-postfach-breadcrumb-container/vorgang-in-postfach-breadcrumb/vorgang-in-postfach-breadcrumb.component.scss
+++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-in-postfach-breadcrumb-container/vorgang-in-postfach-breadcrumb/vorgang-in-postfach-breadcrumb.component.scss
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "variables";
+@import 'variables';
 
 :host {
 	display: block;
diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-nummer/vorgang-nummer.component.spec.ts b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-nummer/vorgang-nummer.component.spec.ts
index 5e96722836f42524b3d2918789ddb3a52eb356ad..755d50460166314610cde82f10fad018669960d7 100644
--- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-nummer/vorgang-nummer.component.spec.ts
+++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-nummer/vorgang-nummer.component.spec.ts
@@ -27,7 +27,7 @@ import { MatIconTestingModule } from '@angular/material/icon/testing';
 import { getElementFromFixture } from '@goofy-client/test-utils';
 import { VorgangResource } from '@goofy-client/vorgang-shared';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
-import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
 import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang';
 import { VorgangNummerComponent } from './vorgang-nummer.component';
 
@@ -42,7 +42,7 @@ describe('VorgangNummerComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				MatIcon,
-				MattooltipDirective,
+				MatTooltipDirective,
 				VorgangNummerComponent
 			],
 			imports: [
diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.html b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.html
index 8863a78a241f9ba584274cd48473bf7c18a769f9..716e4c376d67777d04be46cc2da8b3778df8c730 100644
--- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.html
+++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.html
@@ -33,7 +33,7 @@
 		mat-icon-button aria-label="Vorgang suchen">
 		<mat-icon matPrefix class="search-icon">search</mat-icon>
 	</button>
-	<mat-form-field floatLabel="never">
+	<mat-form-field floatLabel="never" subscriptSizing="dynamic">
 		<input matInput data-test-id="search-input"
 			   #searchInput
 			   placeholder="Vorgang suchen"
diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.scss b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.scss
index 4111cd48e71495c531f894bc19a64757219e4410..074edac131a01f41476756748682caed62f313c4 100644
--- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.scss
+++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.scss
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "variables";
+@import 'variables';
 
 mat-form-field {
 	flex-grow: 1;
@@ -31,8 +31,7 @@ input {
 	border: 0;
 	background-color: transparent;
 	outline: 0;
-	flex-grow: 1;
-	font-size: 18px;
+	font-size: 18px !important;
 	color: inherit;
 	min-width: 0; // Firefox workaround for close icon
 	width: calc(100% - 40px);
@@ -55,72 +54,6 @@ input {
 	}
 }
 
-::ng-deep {
-	.cdk-overlay-pane {
-		&:before {
-			content: "";
-			height: 7px;
-			width: 100%;
-			position: absolute;
-			top: -6px;
-			background: inherit;
-			z-index: 2;
-		}
-	}
-
-	goofy-client-vorgang-search {
-		.mat-form-field-underline {
-			display: none;
-		}
-		.mat-form-field-appearance-legacy {
-			.mat-form-field-wrapper {
-				padding-bottom: 0;
-				font-size: 18px;
-
-				.mat-form-field-flex {
-					align-items: center;
-					height: 40px;
-
-					.mat-form-field-infix {
-						border-top: none;
-					}
-				}
-			}
-		}
-	}
-
-	.mat-autocomplete-panel.vorgang-search {
-		max-height: calc(100vh - $header-height);
-		max-width: 600px;
-		width: calc(600px - (800px - 100vw));
-		height: auto;
-		box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.4);
-		position: relative;
-		border-bottom-left-radius: 20px;
-		border-bottom-right-radius: 20px;
-		margin-left: -40px;
-
-		.mat-option {
-			border-top: 1px solid rgba(0, 0, 0, 0.08);
-
-			&:first-child {
-				border-top: none;
-			}
-			font-size: 14px;
-			height: auto;
-			line-height: normal;
-			padding: 0.5rem 1rem;
-
-			.line {
-				mat-icon {
-					margin-right: 0.25rem;
-					min-width: 1.5rem;
-				}
-			}
-		}
-	}
-}
-
 .autocomplete-spinner {
 	position: absolute;
 	width: 100%;
diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts
index a861f7bebd3a3896684824920fdf673ae189452c..48846c6084529b48789d7c742d236aef661682a4 100644
--- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts
+++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts
@@ -24,10 +24,10 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete';
-import { MatLegacyButton as MatButton } from '@angular/material/legacy-button';
-import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
-import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
+import { MatAutocompleteModule } from '@angular/material/autocomplete';
+import { MatButton } from '@angular/material/button';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { RouterTestingModule } from '@angular/router/testing';
 import { NavigationService } from '@goofy-client/navigation-shared';
diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts
index 838ecb52d7e1c409cae00edb0bc505a229948ad6..55ff86367ea442a220017e5acd1da2c64be64857 100644
--- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts
+++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts
@@ -23,7 +23,7 @@
  */
 import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
 import { MatAutocomplete } from '@angular/material/autocomplete';
-import { MatLegacyButton as MatButton } from '@angular/material/legacy-button';
+import { MatButton } from '@angular/material/button';
 import { StateResource, isNotNil } from '@goofy-client/tech-shared';
 import { VorgangHeaderLinkRel, VorgangListLinkRel, VorgangListResource } from '@goofy-client/vorgang-shared';
 import { VorgangSearchFormService } from './vorgang-search.formservice';
diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.scss b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.scss
index 3f4bc35cd972dbabc5b726a1c11d06f123de7e27..31d3a555ee22587580982771d98cc034405fe659 100644
--- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.scss
+++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.scss
@@ -23,7 +23,7 @@
  */
 @use 'sass:map';
 @use '@angular/material' as mat;
-@import "variables";
+@import 'variables';
 
 .dot {
 	border-radius: 50%;
diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/wiedervorlage-icon/wiedervorlage-icon.component.scss b/goofy-client/libs/vorgang-shared-ui/src/lib/wiedervorlage-icon/wiedervorlage-icon.component.scss
index 2b7e150569fa34647fa8037a907dc124f8cf989d..6933eccb16aa120fffc60bfd4dc84fc02157157f 100644
--- a/goofy-client/libs/vorgang-shared-ui/src/lib/wiedervorlage-icon/wiedervorlage-icon.component.scss
+++ b/goofy-client/libs/vorgang-shared-ui/src/lib/wiedervorlage-icon/wiedervorlage-icon.component.scss
@@ -1,9 +1,10 @@
 @use 'sass:map';
 @use '@angular/material' as mat;
-@import "variables";
+@import 'variables';
 
 :host {
 	margin-right: 6px;
+	height: $iconHeight;
 }
 
 .red {
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-created-at/vorgang-created-at.component.spec.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-created-at/vorgang-created-at.component.spec.ts
index ad769d0cfc8fbbd6ae96ff9b5148c85eb06e68f8..7c5d2379389d3245b76014f9da98e5ed3a6afbf0 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-created-at/vorgang-created-at.component.spec.ts
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-created-at/vorgang-created-at.component.spec.ts
@@ -30,7 +30,7 @@ import { FormatDateWithTimePipe, FormatDateWithoutYearWithTimePipe, formatDateWi
 import { getElementFromFixture } from '@goofy-client/test-utils';
 import { VorgangResource } from '@goofy-client/vorgang-shared';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
-import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
 import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang';
 import { VorgangCreatedAtComponent } from './vorgang-created-at.component';
 
@@ -47,7 +47,7 @@ describe('VorgangCreatedAtComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				MatIcon,
-				MattooltipDirective,
+				MatTooltipDirective,
 				FormatDateWithoutYearWithTimePipe,
 				FormatDateWithTimePipe,
 				VorgangCreatedAtComponent
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.scss
index 47a1fe388236b6b912a107d19abbc5d794a704a6..8d4b05c75e265fecbdbbf2f92bd2a45c401a92c0 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.scss
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.scss
@@ -21,9 +21,9 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "breakpoints";
-@import "include-media/dist/include-media";
-@import "variables";
+@import 'breakpoints';
+@import 'include-media/dist/include-media';
+@import 'variables';
 
 .list-item {
 	display: grid;
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts
index d8185e75c78b532665337a056d256cafb872d47e..7a4ac8982b440298f840e96e1200d0070f8e6d60 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts
@@ -38,7 +38,7 @@ import { VorgangHeaderLinkRel } from '@goofy-client/vorgang-shared';
 import { AktenzeichenComponent, VorgangNummerComponent, VorgangStatusDotComponent, VorgangStatusTextComponent } from '@goofy-client/vorgang-shared-ui';
 import { WiedervorlageListInVorgangListContainerComponent } from '@goofy-client/wiedervorlage';
 import { getDataTestClassOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test';
-import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
 import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
 import { VorgangCreatedAtComponent } from './vorgang-created-at/vorgang-created-at.component';
@@ -63,7 +63,7 @@ describe('VorgangListItemComponent', () => {
 			declarations: [
 				VorgangListItemComponent,
 				MatIcon,
-				MattooltipDirective,
+				MatTooltipDirective,
 				EnumToLabelPipe,
 				ToResourceUriPipe,
 				HasLinkPipe,
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-next-frist-button/vorgang-next-frist-button.component.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-next-frist-button/vorgang-next-frist-button.component.scss
index 275c598e62c3551759b28497ebc56b3d12f137f8..38097e77f4843948a373643bef0c067d19c748ff 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-next-frist-button/vorgang-next-frist-button.component.scss
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-next-frist-button/vorgang-next-frist-button.component.scss
@@ -23,7 +23,7 @@
  */
 @use 'sass:map';
 @use '@angular/material' as mat;
-@import "variables";
+@import 'variables';
 
 .frist {
 	background-color: inherit;
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/_vorgang-filter-item.theme.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/_vorgang-filter-item.theme.scss
index 93d228811dfb494f43564d7daf13310f83ac72af..838558d2813db49aa0981bc25ac162b54e1fea54 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/_vorgang-filter-item.theme.scss
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/_vorgang-filter-item.theme.scss
@@ -35,6 +35,7 @@ goofy-client-vorgang-filter-menu {
 			display: none;
 		}
 	}
+
 	.mat-button-toggle-checked .filter-item-content  {
 		font-weight: bold;
 
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-list-page.component.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-list-page.component.scss
index 9a171e68db7a51c79288235fcaca9cc733f32d42..62cd872b8afc3904b6f3132d717815020e3ecf85 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-list-page.component.scss
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-list-page.component.scss
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "variables";
+@import 'variables';
 
 h1 {
 	text-align: center;
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss
index 9e9ebbf1038dbc38aa20ba301797d99268e5f39d..af312bf2d5faeddfc810bcee1fbd8a8393ab9ae6 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss
@@ -15,7 +15,7 @@ goofy-client-vorgang-search-view-item {
 goofy-client-vorgang-view-item,
 goofy-client-vorgang-search-view-item {
 	goofy-client-ozgcloud-routing-button {
-		.mat-button {
+		.mat-mdc-button {
 			text-align: left;
 			width: 100%;
 			border-radius: 1rem;
@@ -23,14 +23,14 @@ goofy-client-vorgang-search-view-item {
 			padding: 0 0.875rem;
 		}
 
-		&.selected .mat-button {
+		&.selected .mat-mdc-button {
 			background-color: $activeButton;
 			font-weight: 500;
 		}
-
-		.mat-button-wrapper {
+		.mdc-button__label {
 			display: flex;
 			align-items: center;
+			width: 100%;
 
 			.label {
 				flex-grow: 1;
@@ -43,7 +43,7 @@ body.dark {
 	goofy-client-vorgang-view-item,
 	goofy-client-vorgang-search-view-item-container {
 		goofy-client-ozgcloud-routing-button {
-			&.selected .mat-button {
+			&.selected .mat-mdc-button {
 				background-color: #212121;
 			}
 		}
diff --git a/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html b/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html
index b793b5665d8e37166039abde8ae09b3be30e06ab..bb9f884b89f29f9e6f154ad2b10c989efcc0c111 100644
--- a/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html
+++ b/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html
@@ -23,11 +23,11 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<goofy-client-button-with-spinner *ngIf="!showAsIconButton" text="Speichern" data-test-id="speichern-button"
+<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" text="Speichern" data-test-id="speichern-button"
 	icon="save_alt"
 	[stateResource]="submitInProgress$ | async"
 	(clickEmitter)="submit()">
-</goofy-client-button-with-spinner>
+</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton"
 	icon="save_alt" toolTip="Wiedervorlage speichern"
diff --git a/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts b/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts
index 676f5479e38aa46ab39643e40213875745a06f85..eb436b9cf48cf238761a9e5bd8ee58da43701f2f 100644
--- a/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts
+++ b/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts
@@ -25,9 +25,9 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ActivatedRoute } from '@angular/router';
 import { CommandResource } from '@goofy-client/command-shared';
 import { NavigationService } from '@goofy-client/navigation-shared';
-import { createStateResource, StateResource } from '@goofy-client/tech-shared';
+import { StateResource, createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { WiedervorlageService } from '@goofy-client/wiedervorlage-shared';
 import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel';
 import { createCommandResource } from 'libs/command-shared/test/command';
@@ -50,7 +50,7 @@ describe('SubmitWiedervorlageButtonComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				SubmitWiedervorlageButtonComponent,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent)
 			],
 			providers: [
diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.html b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.html
index 86888c66834b634a6ecefcf5f0964c29673f0f30..a4d2cbf0101054bb9fa52fed14de54034fa48b34 100644
--- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.html
+++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.html
@@ -28,9 +28,9 @@
 	<div class="create-button" *ngIf="wiedervorlageListResource | hasLink: wiedervorlageListLinkRel.CREATE_WIEDERVORLAGE">
 		<a [routerLink]="'wiedervorlage/' + wiedervorlageRoute.NEW" tabindex="-1">
 
-			<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="create-wiedervorlage"
+			<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="create-wiedervorlage"
 				class="create-button" text="Wiedervorlage" icon="add">
-			</goofy-client-button-with-spinner>
+			</goofy-client-ozgcloud-stroked-button-with-spinner>
 
 			<goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="create-wiedervorlage-icon-button"
 				icon="update" toolTip="Wiedervorlage erstellen">
diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.spec.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.spec.ts
index 06fe1dd18a7e9300863c0babba163bc7631577ad..53a201f3c966a254fb114677c17be2e78b130646 100644
--- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.spec.ts
+++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.spec.ts
@@ -23,8 +23,8 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { RouterTestingModule } from '@angular/router/testing';
-import { createStateResource, HasLinkPipe } from '@goofy-client/tech-shared';
-import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
+import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui';
 import { WiedervorlageListLinkRel } from '@goofy-client/wiedervorlage-shared';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { createWiedervorlageListResource } from 'libs/wiedervorlage-shared/test/wiedervorlage';
@@ -42,7 +42,7 @@ describe('WiedervorlageCreateButtonComponent', () => {
 			declarations: [
 				WiedervorlageCreateButtonComponent,
 				HasLinkPipe,
-				MockComponent(ButtonWithSpinnerComponent),
+				MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
 				MockComponent(IconButtonWithSpinnerComponent)
 			],
 			imports: [
diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts
index e17a322961f598ea36303a3720afdacebccea000..4042e93484e944d4a92f21ad97cf0947a06dbc1c 100644
--- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts
+++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts
@@ -29,12 +29,12 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MAT_DATE_LOCALE } from '@angular/material/core';
 import { MatIcon } from '@angular/material/icon';
 import { RouterTestingModule } from '@angular/router/testing';
-import { ConvertForDataTestPipe, formatFullDate, FormatToPrettyDatePipe, HasLinkPipe, ToResourceUriPipe, ToTrafficLightTooltipPipe } from '@goofy-client/tech-shared';
+import { ConvertForDataTestPipe, FormatToPrettyDatePipe, HasLinkPipe, ToResourceUriPipe, ToTrafficLightTooltipPipe, formatFullDate } from '@goofy-client/tech-shared';
 import { dispatchEventFromFixture } from '@goofy-client/test-utils';
 import { ExpansionPanelComponent } from '@goofy-client/ui';
 import { LinkWithUserNameTooltipContainerComponent, TextWithUserNameTooltipContainerComponent } from '@goofy-client/user-profile';
 import { WiedervorlageResource } from '@goofy-client/wiedervorlage-shared';
-import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
+import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive';
 import { createWiedervorlageResource } from 'libs/wiedervorlage-shared/test/wiedervorlage';
 import { MockComponent } from 'ng-mocks';
 import { WiedervorlageStatusComponent } from '../../../wiedervorlage-status/wiedervorlage-status.component';
@@ -61,7 +61,7 @@ describe('WiedervorlageInVorgangComponent', () => {
 				ToTrafficLightTooltipPipe,
 				ConvertForDataTestPipe,
 				MatIcon,
-				MattooltipDirective,
+				MatTooltipDirective,
 				HasLinkPipe,
 				MockComponent(ExpansionPanelComponent),
 				MockComponent(WiedervorlageStatusComponent),
diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-list-container/wiedervorlage-list-in-vorgang-list-container.component.spec.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-list-container/wiedervorlage-list-in-vorgang-list-container.component.spec.ts
index e7f68b2d41653a4e882f0fafd9e2339161829055..c174db9d8587043d7422655586292a52673feb47 100644
--- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-list-container/wiedervorlage-list-in-vorgang-list-container.component.spec.ts
+++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-list-container/wiedervorlage-list-in-vorgang-list-container.component.spec.ts
@@ -22,9 +22,9 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { MatLegacyTooltip as MatTooltip } from '@angular/material/legacy-tooltip';
-import { createStateResource, FormatToPrettyDatePipe, ToTrafficLightTooltipPipe } from '@goofy-client/tech-shared';
+import { FormatToPrettyDatePipe, ToTrafficLightTooltipPipe, createStateResource } from '@goofy-client/tech-shared';
 import { mock } from '@goofy-client/test-utils';
+import { MatTooltipDirective } from '@goofy-client/ui';
 import { WiedervorlageService } from '@goofy-client/wiedervorlage-shared';
 import { createWiedervorlageListResource } from 'libs/wiedervorlage-shared/test/wiedervorlage';
 import { MockComponent } from 'ng-mocks';
@@ -42,7 +42,7 @@ describe('WiedervorlageListInVorgangListContainerComponent', () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				WiedervorlageListInVorgangListContainerComponent,
-				MatTooltip,
+				MatTooltipDirective,
 				FormatToPrettyDatePipe,
 				ToTrafficLightTooltipPipe,
 				MockComponent(WiedervorlageStatusComponent)
diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-breadcrumb-container/wiedervorlage-breadcrumb/wiedervorlage-breadcrumb.component.scss b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-breadcrumb-container/wiedervorlage-breadcrumb/wiedervorlage-breadcrumb.component.scss
index d2ff2cd19eddc71487e2320fe1f164b7f2a2e32c..5dcc5f416150e682b0b567988893eb3ec147cfab 100644
--- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-breadcrumb-container/wiedervorlage-breadcrumb/wiedervorlage-breadcrumb.component.scss
+++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-breadcrumb-container/wiedervorlage-breadcrumb/wiedervorlage-breadcrumb.component.scss
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-@import "variables";
+@import 'variables';
 
 :host {
 	display: block;
diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.scss b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.scss
index 56d7903303d3a21e06df37646f497e7e0d54ec9f..1a2b0053867f54776399136d91eaf307fffe5278 100644
--- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.scss
+++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.scss
@@ -23,7 +23,7 @@
  */
 @use 'sass:map';
 @use '@angular/material' as mat;
-@import "variables";
+@import 'variables';
 
 :host {
 	display: flex;
diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts
index 140790a5c7523026bdabe2e047598f08abd6f196..864cacb42a5eec0633d06fdae157631f5c0bf74d 100644
--- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts
+++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts
@@ -23,8 +23,8 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIcon } from '@angular/material/icon';
-import { MatLegacyTooltip as MatTooltip } from '@angular/material/legacy-tooltip';
 import { ToTrafficLightPipe } from '@goofy-client/tech-shared';
+import { MatTooltipDirective } from '@goofy-client/ui';
 import { createWiedervorlageResource } from 'libs/wiedervorlage-shared/test/wiedervorlage';
 import { MockDirective } from 'ng-mocks';
 import { WiedervorlageStatusComponent } from './wiedervorlage-status.component';
@@ -40,7 +40,7 @@ describe('WiedervorlageStatusComponent', () => {
 			declarations: [
 				WiedervorlageStatusComponent,
 				ToTrafficLightPipe,
-				MockDirective(MatTooltip),
+				MockDirective(MatTooltipDirective),
 				MatIcon
 			]
 		})
diff --git a/goofy-client/package-lock.json b/goofy-client/package-lock.json
index 10b14ffa4b27a46ef2939f8e675a77ce7c43d90c..f7e6c78364530df617dc20000bf696f1abe10aad 100644
--- a/goofy-client/package-lock.json
+++ b/goofy-client/package-lock.json
@@ -33,9 +33,9 @@
 				"date-fns": "^2.29.3",
 				"file-saver": "2.0.5",
 				"include-media": "^1.4.10",
-				"js-base64": "^3.7.3",
+				"js-base64": "^3.7.5",
 				"lodash-es": "4.17.21",
-				"rxjs": "~7.8.0",
+				"rxjs": "~7.8.1",
 				"sanitize-filename-ts": "^1.0.2",
 				"tslib": "^2.3.0",
 				"typeface-roboto": "1.1.13",
@@ -50,8 +50,8 @@
 				"@angular/compiler-cli": "15.1.4",
 				"@angular/language-service": "15.1.4",
 				"@bahmutov/cypress-extends": "1.1.0",
-				"@cypress/webpack-batteries-included-preprocessor": "^2.3.0",
-				"@cypress/webpack-preprocessor": "^5.16.3",
+				"@cypress/webpack-batteries-included-preprocessor": "^2.4.1",
+				"@cypress/webpack-preprocessor": "^5.17.1",
 				"@faker-js/faker": "^6.3.1",
 				"@ngrx/schematics": "15.0.0",
 				"@ngrx/store-devtools": "15.0.0",
@@ -62,16 +62,16 @@
 				"@nrwl/linter": "15.6.3",
 				"@nrwl/workspace": "15.6.3",
 				"@testing-library/jest-dom": "5.16.4",
-				"@types/file-saver": "2.0.5",
+				"@types/file-saver": "2.0.6",
 				"@types/jest": "28.1.8",
-				"@types/lodash-es": "4.17.6",
+				"@types/lodash-es": "4.17.10",
 				"@types/node": "^16.18.1",
 				"@typescript-eslint/eslint-plugin": "5.44.0",
 				"@typescript-eslint/parser": "5.44.0",
-				"cypress": "^9.7.0",
+				"cypress": "^12.17.4",
 				"cypress-file-upload": "5.0.8",
-				"cypress-mochawesome-reporter": "3.3.0",
-				"cypress-real-events": "^1.7.6",
+				"cypress-mochawesome-reporter": "3.6.0",
+				"cypress-real-events": "^1.10.3",
 				"cypress-timestamps": "^1.2.3",
 				"eslint": "8.15.0",
 				"eslint-config-prettier": "8.3.0",
@@ -85,10 +85,10 @@
 				"jest-preset-angular": "12.2.3",
 				"jest-sonar-reporter": "^2.0.0",
 				"mongodb": "4.5.0",
-				"ng-mocks": "^14.1.0",
+				"ng-mocks": "^14.11.0",
 				"nx": "15.6.3",
 				"prettier": "2.7.1",
-				"sonarqube-scanner": "2.9.1",
+				"sonarqube-scanner": "3.1.0",
 				"ts-jest": "28.0.8",
 				"ts-node": "10.9.1",
 				"typescript": "4.8.4"
@@ -3341,9 +3341,9 @@
 			}
 		},
 		"node_modules/@cypress/request": {
-			"version": "2.88.11",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/request/-/request-2.88.11.tgz",
-			"integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==",
+			"version": "2.88.12",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/request/-/request-2.88.12.tgz",
+			"integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==",
 			"devOptional": true,
 			"license": "Apache-2.0",
 			"dependencies": {
@@ -3362,7 +3362,7 @@
 				"performance-now": "^2.1.0",
 				"qs": "~6.10.3",
 				"safe-buffer": "^5.1.2",
-				"tough-cookie": "~2.5.0",
+				"tough-cookie": "^4.1.3",
 				"tunnel-agent": "^0.6.0",
 				"uuid": "^8.3.2"
 			},
@@ -4347,9 +4347,9 @@
 			"license": "ISC"
 		},
 		"node_modules/@cypress/webpack-preprocessor": {
-			"version": "5.17.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.17.0.tgz",
-			"integrity": "sha512-HyFqHkrOrIIYOt4G+r3VK0kVYTcev1tEcqBI/0DJ4AzEuEgW/TB+cX56txy4Cgn60XXdJoul2utclZwUqOsPZA==",
+			"version": "5.17.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.17.1.tgz",
+			"integrity": "sha512-FE/e8ikPc8z4EVopJCaior3RGy0jd2q9Xcp5NtiwNG4XnLfEnUFTZlAGwXe75sEh4fNMPrBJW1KIz77PX5vGAw==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -8945,9 +8945,9 @@
 			}
 		},
 		"node_modules/@types/file-saver": {
-			"version": "2.0.5",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/file-saver/-/file-saver-2.0.5.tgz",
-			"integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==",
+			"version": "2.0.6",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/file-saver/-/file-saver-2.0.6.tgz",
+			"integrity": "sha512-Mw671DVqoMHbjw0w4v2iiOro01dlT/WhWp5uwecBa0Wg8c+bcZOjgF1ndBnlaxhtvFCgTRBtsGivSVhrK/vnag==",
 			"dev": true,
 			"license": "MIT"
 		},
@@ -9037,9 +9037,9 @@
 			"license": "MIT"
 		},
 		"node_modules/@types/lodash-es": {
-			"version": "4.17.6",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/lodash-es/-/lodash-es-4.17.6.tgz",
-			"integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==",
+			"version": "4.17.10",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/lodash-es/-/lodash-es-4.17.10.tgz",
+			"integrity": "sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -9053,9 +9053,9 @@
 			"license": "MIT"
 		},
 		"node_modules/@types/node": {
-			"version": "16.18.23",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-16.18.23.tgz",
-			"integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==",
+			"version": "16.18.54",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-16.18.54.tgz",
+			"integrity": "sha512-oTmGy68gxZZ21FhTJVVvZBYpQHEBZxHKTsGshobMqm9qWpbqdZsA5jvsuPZcHu0KwpmLrOHWPdEfg7XDpNT9UA==",
 			"license": "MIT"
 		},
 		"node_modules/@types/parse-json": {
@@ -10110,6 +10110,16 @@
 				"node": ">=8.9.0"
 			}
 		},
+		"node_modules/adm-zip": {
+			"version": "0.5.10",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/adm-zip/-/adm-zip-0.5.10.tgz",
+			"integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==",
+			"dev": true,
+			"license": "MIT",
+			"engines": {
+				"node": ">=6.0"
+			}
+		},
 		"node_modules/agent-base": {
 			"version": "6.0.2",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/agent-base/-/agent-base-6.0.2.tgz",
@@ -11200,6 +11210,14 @@
 			"dev": true,
 			"license": "BSD-2-Clause"
 		},
+		"node_modules/browser-stdout": {
+			"version": "1.3.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/browser-stdout/-/browser-stdout-1.3.1.tgz",
+			"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+			"dev": true,
+			"license": "ISC",
+			"peer": true
+		},
 		"node_modules/browserify-aes": {
 			"version": "1.2.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/browserify-aes/-/browserify-aes-1.2.0.tgz",
@@ -11366,24 +11384,6 @@
 				"ieee754": "^1.1.13"
 			}
 		},
-		"node_modules/buffer-alloc": {
-			"version": "1.2.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
-			"integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"buffer-alloc-unsafe": "^1.1.0",
-				"buffer-fill": "^1.0.0"
-			}
-		},
-		"node_modules/buffer-alloc-unsafe": {
-			"version": "1.1.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-			"integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
-			"dev": true,
-			"license": "MIT"
-		},
 		"node_modules/buffer-crc32": {
 			"version": "0.2.13",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
@@ -11394,13 +11394,6 @@
 				"node": "*"
 			}
 		},
-		"node_modules/buffer-fill": {
-			"version": "1.0.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-fill/-/buffer-fill-1.0.0.tgz",
-			"integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==",
-			"dev": true,
-			"license": "MIT"
-		},
 		"node_modules/buffer-from": {
 			"version": "1.1.2",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -11550,9 +11543,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001474",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz",
-			"integrity": "sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q==",
+			"version": "1.0.30001539",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz",
+			"integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==",
 			"funding": [
 				{
 					"type": "opencollective",
@@ -12046,9 +12039,9 @@
 			}
 		},
 		"node_modules/commander": {
-			"version": "5.1.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-5.1.0.tgz",
-			"integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+			"version": "6.2.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-6.2.1.tgz",
+			"integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
 			"devOptional": true,
 			"license": "MIT",
 			"engines": {
@@ -13069,16 +13062,16 @@
 			"license": "MIT"
 		},
 		"node_modules/cypress": {
-			"version": "9.7.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress/-/cypress-9.7.0.tgz",
-			"integrity": "sha512-+1EE1nuuuwIt/N1KXRR2iWHU+OiIt7H28jJDyyI4tiUftId/DrXYEwoDa5+kH2pki1zxnA0r6HrUGHV5eLbF5Q==",
+			"version": "12.17.4",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress/-/cypress-12.17.4.tgz",
+			"integrity": "sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==",
 			"devOptional": true,
 			"hasInstallScript": true,
 			"license": "MIT",
 			"dependencies": {
-				"@cypress/request": "^2.88.10",
+				"@cypress/request": "2.88.12",
 				"@cypress/xvfb": "^1.2.4",
-				"@types/node": "^14.14.31",
+				"@types/node": "^16.18.39",
 				"@types/sinonjs__fake-timers": "8.1.1",
 				"@types/sizzle": "^2.3.2",
 				"arch": "^2.2.0",
@@ -13090,12 +13083,12 @@
 				"check-more-types": "^2.24.0",
 				"cli-cursor": "^3.1.0",
 				"cli-table3": "~0.6.1",
-				"commander": "^5.1.0",
+				"commander": "^6.2.1",
 				"common-tags": "^1.8.0",
 				"dayjs": "^1.10.4",
-				"debug": "^4.3.2",
+				"debug": "^4.3.4",
 				"enquirer": "^2.3.6",
-				"eventemitter2": "^6.4.3",
+				"eventemitter2": "6.4.7",
 				"execa": "4.1.0",
 				"executable": "^4.1.1",
 				"extract-zip": "2.0.1",
@@ -13108,12 +13101,13 @@
 				"listr2": "^3.8.3",
 				"lodash": "^4.17.21",
 				"log-symbols": "^4.0.0",
-				"minimist": "^1.2.6",
+				"minimist": "^1.2.8",
 				"ospath": "^1.2.2",
 				"pretty-bytes": "^5.6.0",
+				"process": "^0.11.10",
 				"proxy-from-env": "1.0.0",
 				"request-progress": "^3.0.0",
-				"semver": "^7.3.2",
+				"semver": "^7.5.3",
 				"supports-color": "^8.1.1",
 				"tmp": "~0.2.1",
 				"untildify": "^4.0.0",
@@ -13123,7 +13117,7 @@
 				"cypress": "bin/cypress"
 			},
 			"engines": {
-				"node": ">=12.0.0"
+				"node": "^14.0.0 || ^16.0.0 || >=18.0.0"
 			}
 		},
 		"node_modules/cypress-file-upload": {
@@ -13140,17 +13134,21 @@
 			}
 		},
 		"node_modules/cypress-mochawesome-reporter": {
-			"version": "3.3.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-3.3.0.tgz",
-			"integrity": "sha512-X4HU1JpuB62MXLh46660KmIs/L6noWV2KpxaXPDorz1zwgj26NN+BPCLP80D9cCFUwX3hNH0pKFZDwVR7vM8wg==",
+			"version": "3.6.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-3.6.0.tgz",
+			"integrity": "sha512-NeYpeZVB5YCU10I3a1yA2qHt+YREo0jZw4Gj83JTJ7YX/ZLFfd8MYKl2O19d/yYC8np/fpMufp5gt3ympd9DWQ==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
+				"commander": "^10.0.1",
 				"fs-extra": "^10.0.1",
 				"mochawesome": "^7.1.3",
 				"mochawesome-merge": "^4.2.1",
 				"mochawesome-report-generator": "^6.2.0"
 			},
+			"bin": {
+				"generate-mochawesome-report": "cli.js"
+			},
 			"engines": {
 				"node": ">=14"
 			},
@@ -13161,6 +13159,16 @@
 				"cypress": ">=6.2.0"
 			}
 		},
+		"node_modules/cypress-mochawesome-reporter/node_modules/commander": {
+			"version": "10.0.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-10.0.1.tgz",
+			"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+			"dev": true,
+			"license": "MIT",
+			"engines": {
+				"node": ">=14"
+			}
+		},
 		"node_modules/cypress-mochawesome-reporter/node_modules/fs-extra": {
 			"version": "10.1.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/fs-extra/-/fs-extra-10.1.0.tgz",
@@ -13177,13 +13185,13 @@
 			}
 		},
 		"node_modules/cypress-real-events": {
-			"version": "1.7.6",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-real-events/-/cypress-real-events-1.7.6.tgz",
-			"integrity": "sha512-yP6GnRrbm6HK5q4DH6Nnupz37nOfZu/xn1xFYqsE2o4G73giPWQOdu6375QYpwfU1cvHNCgyD2bQ2hPH9D7NMw==",
+			"version": "1.10.3",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-real-events/-/cypress-real-events-1.10.3.tgz",
+			"integrity": "sha512-YN3fn+CJIAM638sE6uMvv2/n3PsWowdd0rOiN6ZoyezNAMyENfuQHvccLKZpN+apGfQZYetCml6QXLYgDid2fg==",
 			"dev": true,
 			"license": "MIT",
 			"peerDependencies": {
-				"cypress": "^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x"
+				"cypress": "^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x || ^13.x"
 			}
 		},
 		"node_modules/cypress-timestamps": {
@@ -13196,13 +13204,6 @@
 				"format-duration": "^2.0.0"
 			}
 		},
-		"node_modules/cypress/node_modules/@types/node": {
-			"version": "14.18.42",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-14.18.42.tgz",
-			"integrity": "sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==",
-			"devOptional": true,
-			"license": "MIT"
-		},
 		"node_modules/cypress/node_modules/ansi-styles": {
 			"version": "4.3.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -13302,6 +13303,35 @@
 				"node": ">=8"
 			}
 		},
+		"node_modules/cypress/node_modules/lru-cache": {
+			"version": "6.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lru-cache/-/lru-cache-6.0.0.tgz",
+			"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+			"devOptional": true,
+			"license": "ISC",
+			"dependencies": {
+				"yallist": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/cypress/node_modules/semver": {
+			"version": "7.5.4",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/semver/-/semver-7.5.4.tgz",
+			"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+			"devOptional": true,
+			"license": "ISC",
+			"dependencies": {
+				"lru-cache": "^6.0.0"
+			},
+			"bin": {
+				"semver": "bin/semver.js"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
 		"node_modules/cypress/node_modules/supports-color": {
 			"version": "8.1.1",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/supports-color/-/supports-color-8.1.1.tgz",
@@ -13318,6 +13348,13 @@
 				"url": "https://github.com/chalk/supports-color?sponsor=1"
 			}
 		},
+		"node_modules/cypress/node_modules/yallist": {
+			"version": "4.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yallist/-/yallist-4.0.0.tgz",
+			"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+			"devOptional": true,
+			"license": "ISC"
+		},
 		"node_modules/dashdash": {
 			"version": "1.14.1",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/dashdash/-/dashdash-1.14.1.tgz",
@@ -13407,6 +13444,20 @@
 				}
 			}
 		},
+		"node_modules/decamelize": {
+			"version": "4.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decamelize/-/decamelize-4.0.0.tgz",
+			"integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
 		"node_modules/decimal.js": {
 			"version": "10.4.3",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decimal.js/-/decimal.js-10.4.3.tgz",
@@ -13423,246 +13474,6 @@
 				"node": ">=0.10"
 			}
 		},
-		"node_modules/decompress": {
-			"version": "4.2.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress/-/decompress-4.2.1.tgz",
-			"integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"decompress-tar": "^4.0.0",
-				"decompress-tarbz2": "^4.0.0",
-				"decompress-targz": "^4.0.0",
-				"decompress-unzip": "^4.0.1",
-				"graceful-fs": "^4.1.10",
-				"make-dir": "^1.0.0",
-				"pify": "^2.3.0",
-				"strip-dirs": "^2.0.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/decompress-tar": {
-			"version": "4.1.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-tar/-/decompress-tar-4.1.1.tgz",
-			"integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"file-type": "^5.2.0",
-				"is-stream": "^1.1.0",
-				"tar-stream": "^1.5.2"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/decompress-tar/node_modules/bl": {
-			"version": "1.2.3",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/bl/-/bl-1.2.3.tgz",
-			"integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"readable-stream": "^2.3.5",
-				"safe-buffer": "^5.1.1"
-			}
-		},
-		"node_modules/decompress-tar/node_modules/is-stream": {
-			"version": "1.1.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz",
-			"integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/decompress-tar/node_modules/isarray": {
-			"version": "1.0.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/isarray/-/isarray-1.0.0.tgz",
-			"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-			"dev": true,
-			"license": "MIT"
-		},
-		"node_modules/decompress-tar/node_modules/readable-stream": {
-			"version": "2.3.8",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/readable-stream/-/readable-stream-2.3.8.tgz",
-			"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"core-util-is": "~1.0.0",
-				"inherits": "~2.0.3",
-				"isarray": "~1.0.0",
-				"process-nextick-args": "~2.0.0",
-				"safe-buffer": "~5.1.1",
-				"string_decoder": "~1.1.1",
-				"util-deprecate": "~1.0.1"
-			}
-		},
-		"node_modules/decompress-tar/node_modules/safe-buffer": {
-			"version": "5.1.2",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/safe-buffer/-/safe-buffer-5.1.2.tgz",
-			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-			"dev": true,
-			"license": "MIT"
-		},
-		"node_modules/decompress-tar/node_modules/string_decoder": {
-			"version": "1.1.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/string_decoder/-/string_decoder-1.1.1.tgz",
-			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"safe-buffer": "~5.1.0"
-			}
-		},
-		"node_modules/decompress-tar/node_modules/tar-stream": {
-			"version": "1.6.2",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tar-stream/-/tar-stream-1.6.2.tgz",
-			"integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"bl": "^1.0.0",
-				"buffer-alloc": "^1.2.0",
-				"end-of-stream": "^1.0.0",
-				"fs-constants": "^1.0.0",
-				"readable-stream": "^2.3.0",
-				"to-buffer": "^1.1.1",
-				"xtend": "^4.0.0"
-			},
-			"engines": {
-				"node": ">= 0.8.0"
-			}
-		},
-		"node_modules/decompress-tarbz2": {
-			"version": "4.1.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
-			"integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"decompress-tar": "^4.1.0",
-				"file-type": "^6.1.0",
-				"is-stream": "^1.1.0",
-				"seek-bzip": "^1.0.5",
-				"unbzip2-stream": "^1.0.9"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/decompress-tarbz2/node_modules/file-type": {
-			"version": "6.2.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-6.2.0.tgz",
-			"integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/decompress-tarbz2/node_modules/is-stream": {
-			"version": "1.1.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz",
-			"integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/decompress-targz": {
-			"version": "4.1.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-targz/-/decompress-targz-4.1.1.tgz",
-			"integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"decompress-tar": "^4.1.1",
-				"file-type": "^5.2.0",
-				"is-stream": "^1.1.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/decompress-targz/node_modules/is-stream": {
-			"version": "1.1.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz",
-			"integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/decompress-unzip": {
-			"version": "4.0.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
-			"integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"file-type": "^3.8.0",
-				"get-stream": "^2.2.0",
-				"pify": "^2.3.0",
-				"yauzl": "^2.4.2"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/decompress-unzip/node_modules/file-type": {
-			"version": "3.9.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-3.9.0.tgz",
-			"integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/decompress-unzip/node_modules/get-stream": {
-			"version": "2.3.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/get-stream/-/get-stream-2.3.1.tgz",
-			"integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"object-assign": "^4.0.1",
-				"pinkie-promise": "^2.0.0"
-			},
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/decompress/node_modules/make-dir": {
-			"version": "1.3.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/make-dir/-/make-dir-1.3.0.tgz",
-			"integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"pify": "^3.0.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/decompress/node_modules/make-dir/node_modules/pify": {
-			"version": "3.0.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pify/-/pify-3.0.0.tgz",
-			"integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">=4"
-			}
-		},
 		"node_modules/dedent": {
 			"version": "0.7.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/dedent/-/dedent-0.7.0.tgz",
@@ -14957,9 +14768,9 @@
 			"license": "MIT"
 		},
 		"node_modules/eventemitter2": {
-			"version": "6.4.9",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/eventemitter2/-/eventemitter2-6.4.9.tgz",
-			"integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==",
+			"version": "6.4.7",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/eventemitter2/-/eventemitter2-6.4.7.tgz",
+			"integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
 			"devOptional": true,
 			"license": "MIT"
 		},
@@ -15712,16 +15523,6 @@
 			"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==",
 			"license": "MIT"
 		},
-		"node_modules/file-type": {
-			"version": "5.2.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-5.2.0.tgz",
-			"integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">=4"
-			}
-		},
 		"node_modules/file-uri-to-path": {
 			"version": "1.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
@@ -17888,13 +17689,6 @@
 				"url": "https://github.com/sponsors/ljharb"
 			}
 		},
-		"node_modules/is-natural-number": {
-			"version": "4.0.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-natural-number/-/is-natural-number-4.0.1.tgz",
-			"integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==",
-			"dev": true,
-			"license": "MIT"
-		},
 		"node_modules/is-number": {
 			"version": "7.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-number/-/is-number-7.0.0.tgz",
@@ -20811,32 +20605,6 @@
 			"dev": true,
 			"license": "MIT"
 		},
-		"node_modules/jsdom/node_modules/tough-cookie": {
-			"version": "4.1.2",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-4.1.2.tgz",
-			"integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
-			"dev": true,
-			"license": "BSD-3-Clause",
-			"dependencies": {
-				"psl": "^1.1.33",
-				"punycode": "^2.1.1",
-				"universalify": "^0.2.0",
-				"url-parse": "^1.5.3"
-			},
-			"engines": {
-				"node": ">=6"
-			}
-		},
-		"node_modules/jsdom/node_modules/universalify": {
-			"version": "0.2.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/universalify/-/universalify-0.2.0.tgz",
-			"integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">= 4.0.0"
-			}
-		},
 		"node_modules/jsesc": {
 			"version": "2.5.2",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/jsesc/-/jsesc-2.5.2.tgz",
@@ -21178,45 +20946,6 @@
 				}
 			}
 		},
-		"node_modules/load-json-file": {
-			"version": "2.0.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/load-json-file/-/load-json-file-2.0.0.tgz",
-			"integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"graceful-fs": "^4.1.2",
-				"parse-json": "^2.2.0",
-				"pify": "^2.0.0",
-				"strip-bom": "^3.0.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/load-json-file/node_modules/parse-json": {
-			"version": "2.2.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/parse-json/-/parse-json-2.2.0.tgz",
-			"integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"error-ex": "^1.2.0"
-			},
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/load-json-file/node_modules/strip-bom": {
-			"version": "3.0.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-bom/-/strip-bom-3.0.0.tgz",
-			"integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">=4"
-			}
-		},
 		"node_modules/loader-runner": {
 			"version": "4.3.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -21266,13 +20995,6 @@
 			"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
 			"license": "MIT"
 		},
-		"node_modules/lodash.get": {
-			"version": "4.4.2",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.get/-/lodash.get-4.4.2.tgz",
-			"integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
-			"dev": true,
-			"license": "MIT"
-		},
 		"node_modules/lodash.isempty": {
 			"version": "4.4.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
@@ -22315,6 +22037,286 @@
 				"node": ">=10"
 			}
 		},
+		"node_modules/mocha": {
+			"version": "10.2.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mocha/-/mocha-10.2.0.tgz",
+			"integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"dependencies": {
+				"ansi-colors": "4.1.1",
+				"browser-stdout": "1.3.1",
+				"chokidar": "3.5.3",
+				"debug": "4.3.4",
+				"diff": "5.0.0",
+				"escape-string-regexp": "4.0.0",
+				"find-up": "5.0.0",
+				"glob": "7.2.0",
+				"he": "1.2.0",
+				"js-yaml": "4.1.0",
+				"log-symbols": "4.1.0",
+				"minimatch": "5.0.1",
+				"ms": "2.1.3",
+				"nanoid": "3.3.3",
+				"serialize-javascript": "6.0.0",
+				"strip-json-comments": "3.1.1",
+				"supports-color": "8.1.1",
+				"workerpool": "6.2.1",
+				"yargs": "16.2.0",
+				"yargs-parser": "20.2.4",
+				"yargs-unparser": "2.0.0"
+			},
+			"bin": {
+				"_mocha": "bin/_mocha",
+				"mocha": "bin/mocha.js"
+			},
+			"engines": {
+				"node": ">= 14.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/mochajs"
+			}
+		},
+		"node_modules/mocha/node_modules/ansi-colors": {
+			"version": "4.1.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ansi-colors/-/ansi-colors-4.1.1.tgz",
+			"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/mocha/node_modules/argparse": {
+			"version": "2.0.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/argparse/-/argparse-2.0.1.tgz",
+			"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+			"dev": true,
+			"license": "Python-2.0",
+			"peer": true
+		},
+		"node_modules/mocha/node_modules/escape-string-regexp": {
+			"version": "4.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+			"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/mocha/node_modules/find-up": {
+			"version": "5.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/find-up/-/find-up-5.0.0.tgz",
+			"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"dependencies": {
+				"locate-path": "^6.0.0",
+				"path-exists": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/mocha/node_modules/glob": {
+			"version": "7.2.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/glob/-/glob-7.2.0.tgz",
+			"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+			"dev": true,
+			"license": "ISC",
+			"peer": true,
+			"dependencies": {
+				"fs.realpath": "^1.0.0",
+				"inflight": "^1.0.4",
+				"inherits": "2",
+				"minimatch": "^3.0.4",
+				"once": "^1.3.0",
+				"path-is-absolute": "^1.0.0"
+			},
+			"engines": {
+				"node": "*"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/isaacs"
+			}
+		},
+		"node_modules/mocha/node_modules/glob/node_modules/minimatch": {
+			"version": "3.1.2",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/minimatch/-/minimatch-3.1.2.tgz",
+			"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+			"dev": true,
+			"license": "ISC",
+			"peer": true,
+			"dependencies": {
+				"brace-expansion": "^1.1.7"
+			},
+			"engines": {
+				"node": "*"
+			}
+		},
+		"node_modules/mocha/node_modules/has-flag": {
+			"version": "4.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/has-flag/-/has-flag-4.0.0.tgz",
+			"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/mocha/node_modules/js-yaml": {
+			"version": "4.1.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/js-yaml/-/js-yaml-4.1.0.tgz",
+			"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"dependencies": {
+				"argparse": "^2.0.1"
+			},
+			"bin": {
+				"js-yaml": "bin/js-yaml.js"
+			}
+		},
+		"node_modules/mocha/node_modules/locate-path": {
+			"version": "6.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/locate-path/-/locate-path-6.0.0.tgz",
+			"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"dependencies": {
+				"p-locate": "^5.0.0"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/mocha/node_modules/minimatch": {
+			"version": "5.0.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/minimatch/-/minimatch-5.0.1.tgz",
+			"integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+			"dev": true,
+			"license": "ISC",
+			"peer": true,
+			"dependencies": {
+				"brace-expansion": "^2.0.1"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": {
+			"version": "2.0.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/brace-expansion/-/brace-expansion-2.0.1.tgz",
+			"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"dependencies": {
+				"balanced-match": "^1.0.0"
+			}
+		},
+		"node_modules/mocha/node_modules/ms": {
+			"version": "2.1.3",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ms/-/ms-2.1.3.tgz",
+			"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true
+		},
+		"node_modules/mocha/node_modules/p-locate": {
+			"version": "5.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/p-locate/-/p-locate-5.0.0.tgz",
+			"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"dependencies": {
+				"p-limit": "^3.0.2"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/mocha/node_modules/serialize-javascript": {
+			"version": "6.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+			"integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+			"dev": true,
+			"license": "BSD-3-Clause",
+			"peer": true,
+			"dependencies": {
+				"randombytes": "^2.1.0"
+			}
+		},
+		"node_modules/mocha/node_modules/supports-color": {
+			"version": "8.1.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/supports-color/-/supports-color-8.1.1.tgz",
+			"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"dependencies": {
+				"has-flag": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/supports-color?sponsor=1"
+			}
+		},
+		"node_modules/mocha/node_modules/yargs": {
+			"version": "16.2.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs/-/yargs-16.2.0.tgz",
+			"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"dependencies": {
+				"cliui": "^7.0.2",
+				"escalade": "^3.1.1",
+				"get-caller-file": "^2.0.5",
+				"require-directory": "^2.1.1",
+				"string-width": "^4.2.0",
+				"y18n": "^5.0.5",
+				"yargs-parser": "^20.2.2"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/mocha/node_modules/yargs-parser": {
+			"version": "20.2.4",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs-parser/-/yargs-parser-20.2.4.tgz",
+			"integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+			"dev": true,
+			"license": "ISC",
+			"peer": true,
+			"engines": {
+				"node": ">=10"
+			}
+		},
 		"node_modules/mochawesome": {
 			"version": "7.1.3",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mochawesome/-/mochawesome-7.1.3.tgz",
@@ -22892,6 +22894,20 @@
 			"license": "MIT",
 			"optional": true
 		},
+		"node_modules/nanoid": {
+			"version": "3.3.3",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/nanoid/-/nanoid-3.3.3.tgz",
+			"integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"bin": {
+				"nanoid": "bin/nanoid.cjs"
+			},
+			"engines": {
+				"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+			}
+		},
 		"node_modules/nanomatch": {
 			"version": "1.2.13",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/nanomatch/-/nanomatch-1.2.13.tgz",
@@ -22992,9 +23008,9 @@
 			"license": "MIT"
 		},
 		"node_modules/ng-mocks": {
-			"version": "14.8.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ng-mocks/-/ng-mocks-14.8.0.tgz",
-			"integrity": "sha512-bL1qi96/XuwjZijr4lE4R6NHlgeMivLYiCzrzWFh3x93JHeZf2jDLfOsm7BUIQHwXTYODPHyGvnCadEb44k4Rg==",
+			"version": "14.11.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ng-mocks/-/ng-mocks-14.11.0.tgz",
+			"integrity": "sha512-6h0TafPogU7iEbWKGQt5npfEtI7IjThsqqnDboMIZ4AJyUY7VHUmhFa39Zkd2e4oOLDLb/6sVnfDIaWCp3oFgQ==",
 			"dev": true,
 			"license": "MIT",
 			"funding": {
@@ -23036,9 +23052,9 @@
 			"license": "MIT"
 		},
 		"node_modules/node-downloader-helper": {
-			"version": "2.1.6",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/node-downloader-helper/-/node-downloader-helper-2.1.6.tgz",
-			"integrity": "sha512-VkOvAXIopI3xMuM/MC5UL7NqqnizQ/9QXZt28jR8FPZ6fHLQm4xe4+YXJ9FqsWwLho5BLXrF51nfOQ0QcohRkQ==",
+			"version": "2.1.9",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/node-downloader-helper/-/node-downloader-helper-2.1.9.tgz",
+			"integrity": "sha512-FSvAol2Z8UP191sZtsUZwHIN0eGoGue3uEXGdWIH5228e9KH1YHXT7fN8Oa33UGf+FbqGTQg3sJfrRGzmVCaJA==",
 			"dev": true,
 			"license": "MIT",
 			"bin": {
@@ -24566,29 +24582,6 @@
 				"node": ">=0.10.0"
 			}
 		},
-		"node_modules/pinkie": {
-			"version": "2.0.4",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pinkie/-/pinkie-2.0.4.tgz",
-			"integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/pinkie-promise": {
-			"version": "2.0.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-			"integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"pinkie": "^2.0.0"
-			},
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
 		"node_modules/pirates": {
 			"version": "4.0.5",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pirates/-/pirates-4.0.5.tgz",
@@ -25354,7 +25347,7 @@
 			"version": "0.11.10",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/process/-/process-0.11.10.tgz",
 			"integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
-			"dev": true,
+			"devOptional": true,
 			"license": "MIT",
 			"engines": {
 				"node": ">= 0.6.0"
@@ -25576,7 +25569,7 @@
 			"version": "2.2.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/querystringify/-/querystringify-2.2.0.tgz",
 			"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
-			"dev": true,
+			"devOptional": true,
 			"license": "MIT"
 		},
 		"node_modules/queue-microtask": {
@@ -25762,64 +25755,6 @@
 				"url": "https://github.com/sponsors/isaacs"
 			}
 		},
-		"node_modules/read-pkg": {
-			"version": "2.0.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/read-pkg/-/read-pkg-2.0.0.tgz",
-			"integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"load-json-file": "^2.0.0",
-				"normalize-package-data": "^2.3.2",
-				"path-type": "^2.0.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/read-pkg/node_modules/hosted-git-info": {
-			"version": "2.8.9",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
-			"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-			"dev": true,
-			"license": "ISC"
-		},
-		"node_modules/read-pkg/node_modules/normalize-package-data": {
-			"version": "2.5.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-			"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-			"dev": true,
-			"license": "BSD-2-Clause",
-			"dependencies": {
-				"hosted-git-info": "^2.1.4",
-				"resolve": "^1.10.0",
-				"semver": "2 || 3 || 4 || 5",
-				"validate-npm-package-license": "^3.0.1"
-			}
-		},
-		"node_modules/read-pkg/node_modules/path-type": {
-			"version": "2.0.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/path-type/-/path-type-2.0.0.tgz",
-			"integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"pify": "^2.0.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/read-pkg/node_modules/semver": {
-			"version": "5.7.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/semver/-/semver-5.7.1.tgz",
-			"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-			"dev": true,
-			"license": "ISC",
-			"bin": {
-				"semver": "bin/semver"
-			}
-		},
 		"node_modules/readable-stream": {
 			"version": "3.6.2",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -26488,27 +26423,6 @@
 			"integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==",
 			"license": "MIT"
 		},
-		"node_modules/seek-bzip": {
-			"version": "1.0.6",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/seek-bzip/-/seek-bzip-1.0.6.tgz",
-			"integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"commander": "^2.8.1"
-			},
-			"bin": {
-				"seek-bunzip": "bin/seek-bunzip",
-				"seek-table": "bin/seek-bzip-table"
-			}
-		},
-		"node_modules/seek-bzip/node_modules/commander": {
-			"version": "2.20.3",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-2.20.3.tgz",
-			"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-			"dev": true,
-			"license": "MIT"
-		},
 		"node_modules/select-hose": {
 			"version": "2.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/select-hose/-/select-hose-2.0.0.tgz",
@@ -27192,29 +27106,68 @@
 			}
 		},
 		"node_modules/sonarqube-scanner": {
-			"version": "2.9.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/sonarqube-scanner/-/sonarqube-scanner-2.9.1.tgz",
-			"integrity": "sha512-UXTEJKAxKBqM7B4iy26svnzEN9dCxzs0aWJATsTTkgTI//WdTZXxoXfSNuQ/D4VXJuivZPJQMKxF1AFjTe8jSQ==",
+			"version": "3.1.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/sonarqube-scanner/-/sonarqube-scanner-3.1.0.tgz",
+			"integrity": "sha512-7CspErch2pVwFrC9aM7NminyI0+OQmFz0V5IHJtC7FLM0cbKA2MnlsvfGfqZekqxMmxbWcybZ/izou4nQh9nMQ==",
 			"dev": true,
 			"license": "LGPL-3.0",
 			"dependencies": {
-				"decompress": "^4.2.1",
-				"extend": "3.0.2",
+				"adm-zip": "^0.5.10",
 				"fancy-log": "^2.0.0",
-				"https-proxy-agent": "^5.0.1",
-				"lodash.get": "^4.4.2",
-				"lodash.uniq": "^4.5.0",
-				"mkdirp": "^1.0.4",
-				"node-downloader-helper": "^2.1.5",
+				"https-proxy-agent": "^7.0.1",
+				"mkdirp": "^3.0.1",
+				"node-downloader-helper": "^2.1.9",
 				"progress": "^2.0.3",
-				"read-pkg": "2.0.0",
-				"slugify": "^1.6.5"
+				"slugify": "^1.6.6"
 			},
 			"bin": {
 				"sonar-scanner": "src/bin/sonar-scanner"
 			},
 			"engines": {
-				"node": ">= 0.10"
+				"node": ">= 14"
+			}
+		},
+		"node_modules/sonarqube-scanner/node_modules/agent-base": {
+			"version": "7.1.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/agent-base/-/agent-base-7.1.0.tgz",
+			"integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+			"dev": true,
+			"license": "MIT",
+			"dependencies": {
+				"debug": "^4.3.4"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/sonarqube-scanner/node_modules/https-proxy-agent": {
+			"version": "7.0.2",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
+			"integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
+			"dev": true,
+			"license": "MIT",
+			"dependencies": {
+				"agent-base": "^7.0.2",
+				"debug": "4"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/sonarqube-scanner/node_modules/mkdirp": {
+			"version": "3.0.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mkdirp/-/mkdirp-3.0.1.tgz",
+			"integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+			"dev": true,
+			"license": "MIT",
+			"bin": {
+				"mkdirp": "dist/cjs/src/bin.js"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/isaacs"
 			}
 		},
 		"node_modules/source-list-map": {
@@ -27791,16 +27744,6 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/strip-dirs": {
-			"version": "2.1.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-dirs/-/strip-dirs-2.1.0.tgz",
-			"integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"is-natural-number": "^4.0.1"
-			}
-		},
 		"node_modules/strip-final-newline": {
 			"version": "2.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
@@ -28546,13 +28489,6 @@
 			"dev": true,
 			"license": "MIT"
 		},
-		"node_modules/to-buffer": {
-			"version": "1.1.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/to-buffer/-/to-buffer-1.1.1.tgz",
-			"integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
-			"dev": true,
-			"license": "MIT"
-		},
 		"node_modules/to-fast-properties": {
 			"version": "2.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -28626,17 +28562,29 @@
 			}
 		},
 		"node_modules/tough-cookie": {
-			"version": "2.5.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-2.5.0.tgz",
-			"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+			"version": "4.1.3",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-4.1.3.tgz",
+			"integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
 			"devOptional": true,
 			"license": "BSD-3-Clause",
 			"dependencies": {
-				"psl": "^1.1.28",
-				"punycode": "^2.1.1"
+				"psl": "^1.1.33",
+				"punycode": "^2.1.1",
+				"universalify": "^0.2.0",
+				"url-parse": "^1.5.3"
 			},
 			"engines": {
-				"node": ">=0.8"
+				"node": ">=6"
+			}
+		},
+		"node_modules/tough-cookie/node_modules/universalify": {
+			"version": "0.2.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/universalify/-/universalify-0.2.0.tgz",
+			"integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+			"devOptional": true,
+			"license": "MIT",
+			"engines": {
+				"node": ">= 4.0.0"
 			}
 		},
 		"node_modules/tr46": {
@@ -29232,17 +29180,6 @@
 				"node": ">=4.2.0"
 			}
 		},
-		"node_modules/unbzip2-stream": {
-			"version": "1.4.3",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
-			"integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"buffer": "^5.2.1",
-				"through": "^2.3.8"
-			}
-		},
 		"node_modules/unicode-canonical-property-names-ecmascript": {
 			"version": "2.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -29509,7 +29446,7 @@
 			"version": "1.5.10",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/url-parse/-/url-parse-1.5.10.tgz",
 			"integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
-			"dev": true,
+			"devOptional": true,
 			"license": "MIT",
 			"dependencies": {
 				"querystringify": "^2.1.1",
@@ -30554,6 +30491,14 @@
 				"errno": "~0.1.7"
 			}
 		},
+		"node_modules/workerpool": {
+			"version": "6.2.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/workerpool/-/workerpool-6.2.1.tgz",
+			"integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
+			"dev": true,
+			"license": "Apache-2.0",
+			"peer": true
+		},
 		"node_modules/wrap-ansi": {
 			"version": "7.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -30729,6 +30674,48 @@
 				"node": ">=12"
 			}
 		},
+		"node_modules/yargs-unparser": {
+			"version": "2.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+			"integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"dependencies": {
+				"camelcase": "^6.0.0",
+				"decamelize": "^4.0.0",
+				"flat": "^5.0.2",
+				"is-plain-obj": "^2.1.0"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/yargs-unparser/node_modules/camelcase": {
+			"version": "6.3.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/camelcase/-/camelcase-6.3.0.tgz",
+			"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/yargs-unparser/node_modules/is-plain-obj": {
+			"version": "2.1.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+			"integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+			"dev": true,
+			"license": "MIT",
+			"peer": true,
+			"engines": {
+				"node": ">=8"
+			}
+		},
 		"node_modules/yargs/node_modules/cliui": {
 			"version": "8.0.1",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cliui/-/cliui-8.0.1.tgz",
@@ -32917,9 +32904,9 @@
 			}
 		},
 		"@cypress/request": {
-			"version": "2.88.11",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/request/-/request-2.88.11.tgz",
-			"integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==",
+			"version": "2.88.12",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/request/-/request-2.88.12.tgz",
+			"integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==",
 			"devOptional": true,
 			"requires": {
 				"aws-sign2": "~0.7.0",
@@ -32937,7 +32924,7 @@
 				"performance-now": "^2.1.0",
 				"qs": "~6.10.3",
 				"safe-buffer": "^5.1.2",
-				"tough-cookie": "~2.5.0",
+				"tough-cookie": "^4.1.3",
 				"tunnel-agent": "^0.6.0",
 				"uuid": "^8.3.2"
 			}
@@ -33690,9 +33677,9 @@
 			}
 		},
 		"@cypress/webpack-preprocessor": {
-			"version": "5.17.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.17.0.tgz",
-			"integrity": "sha512-HyFqHkrOrIIYOt4G+r3VK0kVYTcev1tEcqBI/0DJ4AzEuEgW/TB+cX56txy4Cgn60XXdJoul2utclZwUqOsPZA==",
+			"version": "5.17.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.17.1.tgz",
+			"integrity": "sha512-FE/e8ikPc8z4EVopJCaior3RGy0jd2q9Xcp5NtiwNG4XnLfEnUFTZlAGwXe75sEh4fNMPrBJW1KIz77PX5vGAw==",
 			"dev": true,
 			"requires": {
 				"bluebird": "3.7.1",
@@ -36952,9 +36939,9 @@
 			}
 		},
 		"@types/file-saver": {
-			"version": "2.0.5",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/file-saver/-/file-saver-2.0.5.tgz",
-			"integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==",
+			"version": "2.0.6",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/file-saver/-/file-saver-2.0.6.tgz",
+			"integrity": "sha512-Mw671DVqoMHbjw0w4v2iiOro01dlT/WhWp5uwecBa0Wg8c+bcZOjgF1ndBnlaxhtvFCgTRBtsGivSVhrK/vnag==",
 			"dev": true
 		},
 		"@types/graceful-fs": {
@@ -37033,9 +37020,9 @@
 			"dev": true
 		},
 		"@types/lodash-es": {
-			"version": "4.17.6",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/lodash-es/-/lodash-es-4.17.6.tgz",
-			"integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==",
+			"version": "4.17.10",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/lodash-es/-/lodash-es-4.17.10.tgz",
+			"integrity": "sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==",
 			"dev": true,
 			"requires": {
 				"@types/lodash": "*"
@@ -37047,9 +37034,9 @@
 			"integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
 		},
 		"@types/node": {
-			"version": "16.18.23",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-16.18.23.tgz",
-			"integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g=="
+			"version": "16.18.54",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-16.18.54.tgz",
+			"integrity": "sha512-oTmGy68gxZZ21FhTJVVvZBYpQHEBZxHKTsGshobMqm9qWpbqdZsA5jvsuPZcHu0KwpmLrOHWPdEfg7XDpNT9UA=="
 		},
 		"@types/parse-json": {
 			"version": "4.0.0",
@@ -37813,6 +37800,12 @@
 				}
 			}
 		},
+		"adm-zip": {
+			"version": "0.5.10",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/adm-zip/-/adm-zip-0.5.10.tgz",
+			"integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==",
+			"dev": true
+		},
 		"agent-base": {
 			"version": "6.0.2",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/agent-base/-/agent-base-6.0.2.tgz",
@@ -38574,6 +38567,13 @@
 			"integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
 			"dev": true
 		},
+		"browser-stdout": {
+			"version": "1.3.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/browser-stdout/-/browser-stdout-1.3.1.tgz",
+			"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+			"dev": true,
+			"peer": true
+		},
 		"browserify-aes": {
 			"version": "1.2.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/browserify-aes/-/browserify-aes-1.2.0.tgz",
@@ -38693,34 +38693,12 @@
 				"ieee754": "^1.1.13"
 			}
 		},
-		"buffer-alloc": {
-			"version": "1.2.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
-			"integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
-			"dev": true,
-			"requires": {
-				"buffer-alloc-unsafe": "^1.1.0",
-				"buffer-fill": "^1.0.0"
-			}
-		},
-		"buffer-alloc-unsafe": {
-			"version": "1.1.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-			"integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
-			"dev": true
-		},
 		"buffer-crc32": {
 			"version": "0.2.13",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
 			"integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
 			"devOptional": true
 		},
-		"buffer-fill": {
-			"version": "1.0.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-fill/-/buffer-fill-1.0.0.tgz",
-			"integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==",
-			"dev": true
-		},
 		"buffer-from": {
 			"version": "1.1.2",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -38835,9 +38813,9 @@
 			}
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001474",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz",
-			"integrity": "sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q=="
+			"version": "1.0.30001539",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz",
+			"integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA=="
 		},
 		"caseless": {
 			"version": "0.12.0",
@@ -39163,9 +39141,9 @@
 			}
 		},
 		"commander": {
-			"version": "5.1.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-5.1.0.tgz",
-			"integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+			"version": "6.2.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-6.2.1.tgz",
+			"integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
 			"devOptional": true
 		},
 		"common-tags": {
@@ -39892,14 +39870,14 @@
 			"dev": true
 		},
 		"cypress": {
-			"version": "9.7.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress/-/cypress-9.7.0.tgz",
-			"integrity": "sha512-+1EE1nuuuwIt/N1KXRR2iWHU+OiIt7H28jJDyyI4tiUftId/DrXYEwoDa5+kH2pki1zxnA0r6HrUGHV5eLbF5Q==",
+			"version": "12.17.4",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress/-/cypress-12.17.4.tgz",
+			"integrity": "sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==",
 			"devOptional": true,
 			"requires": {
-				"@cypress/request": "^2.88.10",
+				"@cypress/request": "2.88.12",
 				"@cypress/xvfb": "^1.2.4",
-				"@types/node": "^14.14.31",
+				"@types/node": "^16.18.39",
 				"@types/sinonjs__fake-timers": "8.1.1",
 				"@types/sizzle": "^2.3.2",
 				"arch": "^2.2.0",
@@ -39911,12 +39889,12 @@
 				"check-more-types": "^2.24.0",
 				"cli-cursor": "^3.1.0",
 				"cli-table3": "~0.6.1",
-				"commander": "^5.1.0",
+				"commander": "^6.2.1",
 				"common-tags": "^1.8.0",
 				"dayjs": "^1.10.4",
-				"debug": "^4.3.2",
+				"debug": "^4.3.4",
 				"enquirer": "^2.3.6",
-				"eventemitter2": "^6.4.3",
+				"eventemitter2": "6.4.7",
 				"execa": "4.1.0",
 				"executable": "^4.1.1",
 				"extract-zip": "2.0.1",
@@ -39929,24 +39907,19 @@
 				"listr2": "^3.8.3",
 				"lodash": "^4.17.21",
 				"log-symbols": "^4.0.0",
-				"minimist": "^1.2.6",
+				"minimist": "^1.2.8",
 				"ospath": "^1.2.2",
 				"pretty-bytes": "^5.6.0",
+				"process": "^0.11.10",
 				"proxy-from-env": "1.0.0",
 				"request-progress": "^3.0.0",
-				"semver": "^7.3.2",
+				"semver": "^7.5.3",
 				"supports-color": "^8.1.1",
 				"tmp": "~0.2.1",
 				"untildify": "^4.0.0",
 				"yauzl": "^2.10.0"
 			},
 			"dependencies": {
-				"@types/node": {
-					"version": "14.18.42",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-14.18.42.tgz",
-					"integrity": "sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==",
-					"devOptional": true
-				},
 				"ansi-styles": {
 					"version": "4.3.0",
 					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -40016,6 +39989,24 @@
 					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
 					"devOptional": true
 				},
+				"lru-cache": {
+					"version": "6.0.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lru-cache/-/lru-cache-6.0.0.tgz",
+					"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+					"devOptional": true,
+					"requires": {
+						"yallist": "^4.0.0"
+					}
+				},
+				"semver": {
+					"version": "7.5.4",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/semver/-/semver-7.5.4.tgz",
+					"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+					"devOptional": true,
+					"requires": {
+						"lru-cache": "^6.0.0"
+					}
+				},
 				"supports-color": {
 					"version": "8.1.1",
 					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/supports-color/-/supports-color-8.1.1.tgz",
@@ -40024,6 +40015,12 @@
 					"requires": {
 						"has-flag": "^4.0.0"
 					}
+				},
+				"yallist": {
+					"version": "4.0.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yallist/-/yallist-4.0.0.tgz",
+					"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+					"devOptional": true
 				}
 			}
 		},
@@ -40035,17 +40032,24 @@
 			"requires": {}
 		},
 		"cypress-mochawesome-reporter": {
-			"version": "3.3.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-3.3.0.tgz",
-			"integrity": "sha512-X4HU1JpuB62MXLh46660KmIs/L6noWV2KpxaXPDorz1zwgj26NN+BPCLP80D9cCFUwX3hNH0pKFZDwVR7vM8wg==",
+			"version": "3.6.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-3.6.0.tgz",
+			"integrity": "sha512-NeYpeZVB5YCU10I3a1yA2qHt+YREo0jZw4Gj83JTJ7YX/ZLFfd8MYKl2O19d/yYC8np/fpMufp5gt3ympd9DWQ==",
 			"dev": true,
 			"requires": {
+				"commander": "^10.0.1",
 				"fs-extra": "^10.0.1",
 				"mochawesome": "^7.1.3",
 				"mochawesome-merge": "^4.2.1",
 				"mochawesome-report-generator": "^6.2.0"
 			},
 			"dependencies": {
+				"commander": {
+					"version": "10.0.1",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-10.0.1.tgz",
+					"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+					"dev": true
+				},
 				"fs-extra": {
 					"version": "10.1.0",
 					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/fs-extra/-/fs-extra-10.1.0.tgz",
@@ -40060,9 +40064,9 @@
 			}
 		},
 		"cypress-real-events": {
-			"version": "1.7.6",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-real-events/-/cypress-real-events-1.7.6.tgz",
-			"integrity": "sha512-yP6GnRrbm6HK5q4DH6Nnupz37nOfZu/xn1xFYqsE2o4G73giPWQOdu6375QYpwfU1cvHNCgyD2bQ2hPH9D7NMw==",
+			"version": "1.10.3",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-real-events/-/cypress-real-events-1.10.3.tgz",
+			"integrity": "sha512-YN3fn+CJIAM638sE6uMvv2/n3PsWowdd0rOiN6ZoyezNAMyENfuQHvccLKZpN+apGfQZYetCml6QXLYgDid2fg==",
 			"dev": true,
 			"requires": {}
 		},
@@ -40132,6 +40136,13 @@
 				"ms": "2.1.2"
 			}
 		},
+		"decamelize": {
+			"version": "4.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decamelize/-/decamelize-4.0.0.tgz",
+			"integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+			"dev": true,
+			"peer": true
+		},
 		"decimal.js": {
 			"version": "10.4.3",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decimal.js/-/decimal.js-10.4.3.tgz",
@@ -40143,197 +40154,6 @@
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
 			"integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="
 		},
-		"decompress": {
-			"version": "4.2.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress/-/decompress-4.2.1.tgz",
-			"integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==",
-			"dev": true,
-			"requires": {
-				"decompress-tar": "^4.0.0",
-				"decompress-tarbz2": "^4.0.0",
-				"decompress-targz": "^4.0.0",
-				"decompress-unzip": "^4.0.1",
-				"graceful-fs": "^4.1.10",
-				"make-dir": "^1.0.0",
-				"pify": "^2.3.0",
-				"strip-dirs": "^2.0.0"
-			},
-			"dependencies": {
-				"make-dir": {
-					"version": "1.3.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/make-dir/-/make-dir-1.3.0.tgz",
-					"integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
-					"dev": true,
-					"requires": {
-						"pify": "^3.0.0"
-					},
-					"dependencies": {
-						"pify": {
-							"version": "3.0.0",
-							"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pify/-/pify-3.0.0.tgz",
-							"integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
-							"dev": true
-						}
-					}
-				}
-			}
-		},
-		"decompress-tar": {
-			"version": "4.1.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-tar/-/decompress-tar-4.1.1.tgz",
-			"integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
-			"dev": true,
-			"requires": {
-				"file-type": "^5.2.0",
-				"is-stream": "^1.1.0",
-				"tar-stream": "^1.5.2"
-			},
-			"dependencies": {
-				"bl": {
-					"version": "1.2.3",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/bl/-/bl-1.2.3.tgz",
-					"integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
-					"dev": true,
-					"requires": {
-						"readable-stream": "^2.3.5",
-						"safe-buffer": "^5.1.1"
-					}
-				},
-				"is-stream": {
-					"version": "1.1.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz",
-					"integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
-					"dev": true
-				},
-				"isarray": {
-					"version": "1.0.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/isarray/-/isarray-1.0.0.tgz",
-					"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-					"dev": true
-				},
-				"readable-stream": {
-					"version": "2.3.8",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/readable-stream/-/readable-stream-2.3.8.tgz",
-					"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
-					"dev": true,
-					"requires": {
-						"core-util-is": "~1.0.0",
-						"inherits": "~2.0.3",
-						"isarray": "~1.0.0",
-						"process-nextick-args": "~2.0.0",
-						"safe-buffer": "~5.1.1",
-						"string_decoder": "~1.1.1",
-						"util-deprecate": "~1.0.1"
-					}
-				},
-				"safe-buffer": {
-					"version": "5.1.2",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/safe-buffer/-/safe-buffer-5.1.2.tgz",
-					"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-					"dev": true
-				},
-				"string_decoder": {
-					"version": "1.1.1",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/string_decoder/-/string_decoder-1.1.1.tgz",
-					"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-					"dev": true,
-					"requires": {
-						"safe-buffer": "~5.1.0"
-					}
-				},
-				"tar-stream": {
-					"version": "1.6.2",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tar-stream/-/tar-stream-1.6.2.tgz",
-					"integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
-					"dev": true,
-					"requires": {
-						"bl": "^1.0.0",
-						"buffer-alloc": "^1.2.0",
-						"end-of-stream": "^1.0.0",
-						"fs-constants": "^1.0.0",
-						"readable-stream": "^2.3.0",
-						"to-buffer": "^1.1.1",
-						"xtend": "^4.0.0"
-					}
-				}
-			}
-		},
-		"decompress-tarbz2": {
-			"version": "4.1.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
-			"integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
-			"dev": true,
-			"requires": {
-				"decompress-tar": "^4.1.0",
-				"file-type": "^6.1.0",
-				"is-stream": "^1.1.0",
-				"seek-bzip": "^1.0.5",
-				"unbzip2-stream": "^1.0.9"
-			},
-			"dependencies": {
-				"file-type": {
-					"version": "6.2.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-6.2.0.tgz",
-					"integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==",
-					"dev": true
-				},
-				"is-stream": {
-					"version": "1.1.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz",
-					"integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
-					"dev": true
-				}
-			}
-		},
-		"decompress-targz": {
-			"version": "4.1.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-targz/-/decompress-targz-4.1.1.tgz",
-			"integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
-			"dev": true,
-			"requires": {
-				"decompress-tar": "^4.1.1",
-				"file-type": "^5.2.0",
-				"is-stream": "^1.1.0"
-			},
-			"dependencies": {
-				"is-stream": {
-					"version": "1.1.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz",
-					"integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
-					"dev": true
-				}
-			}
-		},
-		"decompress-unzip": {
-			"version": "4.0.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
-			"integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==",
-			"dev": true,
-			"requires": {
-				"file-type": "^3.8.0",
-				"get-stream": "^2.2.0",
-				"pify": "^2.3.0",
-				"yauzl": "^2.4.2"
-			},
-			"dependencies": {
-				"file-type": {
-					"version": "3.9.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-3.9.0.tgz",
-					"integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==",
-					"dev": true
-				},
-				"get-stream": {
-					"version": "2.3.1",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/get-stream/-/get-stream-2.3.1.tgz",
-					"integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==",
-					"dev": true,
-					"requires": {
-						"object-assign": "^4.0.1",
-						"pinkie-promise": "^2.0.0"
-					}
-				}
-			}
-		},
 		"dedent": {
 			"version": "0.7.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/dedent/-/dedent-0.7.0.tgz",
@@ -41237,9 +41057,9 @@
 			"dev": true
 		},
 		"eventemitter2": {
-			"version": "6.4.9",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/eventemitter2/-/eventemitter2-6.4.9.tgz",
-			"integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==",
+			"version": "6.4.7",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/eventemitter2/-/eventemitter2-6.4.7.tgz",
+			"integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
 			"devOptional": true
 		},
 		"eventemitter3": {
@@ -41791,12 +41611,6 @@
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-saver/-/file-saver-2.0.5.tgz",
 			"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
 		},
-		"file-type": {
-			"version": "5.2.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-5.2.0.tgz",
-			"integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==",
-			"dev": true
-		},
 		"file-uri-to-path": {
 			"version": "1.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
@@ -43324,12 +43138,6 @@
 			"integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
 			"dev": true
 		},
-		"is-natural-number": {
-			"version": "4.0.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-natural-number/-/is-natural-number-4.0.1.tgz",
-			"integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==",
-			"dev": true
-		},
 		"is-number": {
 			"version": "7.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-number/-/is-number-7.0.0.tgz",
@@ -45299,24 +45107,6 @@
 					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/parse5/-/parse5-6.0.1.tgz",
 					"integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
 					"dev": true
-				},
-				"tough-cookie": {
-					"version": "4.1.2",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-4.1.2.tgz",
-					"integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
-					"dev": true,
-					"requires": {
-						"psl": "^1.1.33",
-						"punycode": "^2.1.1",
-						"universalify": "^0.2.0",
-						"url-parse": "^1.5.3"
-					}
-				},
-				"universalify": {
-					"version": "0.2.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/universalify/-/universalify-0.2.0.tgz",
-					"integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
-					"dev": true
 				}
 			}
 		},
@@ -45536,35 +45326,6 @@
 				"wrap-ansi": "^7.0.0"
 			}
 		},
-		"load-json-file": {
-			"version": "2.0.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/load-json-file/-/load-json-file-2.0.0.tgz",
-			"integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==",
-			"dev": true,
-			"requires": {
-				"graceful-fs": "^4.1.2",
-				"parse-json": "^2.2.0",
-				"pify": "^2.0.0",
-				"strip-bom": "^3.0.0"
-			},
-			"dependencies": {
-				"parse-json": {
-					"version": "2.2.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/parse-json/-/parse-json-2.2.0.tgz",
-					"integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
-					"dev": true,
-					"requires": {
-						"error-ex": "^1.2.0"
-					}
-				},
-				"strip-bom": {
-					"version": "3.0.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-bom/-/strip-bom-3.0.0.tgz",
-					"integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
-					"dev": true
-				}
-			}
-		},
 		"loader-runner": {
 			"version": "4.3.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -45599,12 +45360,6 @@
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
 			"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
 		},
-		"lodash.get": {
-			"version": "4.4.2",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.get/-/lodash.get-4.4.2.tgz",
-			"integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
-			"dev": true
-		},
 		"lodash.isempty": {
 			"version": "4.4.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
@@ -46371,6 +46126,206 @@
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mkdirp/-/mkdirp-1.0.4.tgz",
 			"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
 		},
+		"mocha": {
+			"version": "10.2.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mocha/-/mocha-10.2.0.tgz",
+			"integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
+			"dev": true,
+			"peer": true,
+			"requires": {
+				"ansi-colors": "4.1.1",
+				"browser-stdout": "1.3.1",
+				"chokidar": "3.5.3",
+				"debug": "4.3.4",
+				"diff": "5.0.0",
+				"escape-string-regexp": "4.0.0",
+				"find-up": "5.0.0",
+				"glob": "7.2.0",
+				"he": "1.2.0",
+				"js-yaml": "4.1.0",
+				"log-symbols": "4.1.0",
+				"minimatch": "5.0.1",
+				"ms": "2.1.3",
+				"nanoid": "3.3.3",
+				"serialize-javascript": "6.0.0",
+				"strip-json-comments": "3.1.1",
+				"supports-color": "8.1.1",
+				"workerpool": "6.2.1",
+				"yargs": "16.2.0",
+				"yargs-parser": "20.2.4",
+				"yargs-unparser": "2.0.0"
+			},
+			"dependencies": {
+				"ansi-colors": {
+					"version": "4.1.1",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ansi-colors/-/ansi-colors-4.1.1.tgz",
+					"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+					"dev": true,
+					"peer": true
+				},
+				"argparse": {
+					"version": "2.0.1",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/argparse/-/argparse-2.0.1.tgz",
+					"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+					"dev": true,
+					"peer": true
+				},
+				"escape-string-regexp": {
+					"version": "4.0.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+					"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+					"dev": true,
+					"peer": true
+				},
+				"find-up": {
+					"version": "5.0.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/find-up/-/find-up-5.0.0.tgz",
+					"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+					"dev": true,
+					"peer": true,
+					"requires": {
+						"locate-path": "^6.0.0",
+						"path-exists": "^4.0.0"
+					}
+				},
+				"glob": {
+					"version": "7.2.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/glob/-/glob-7.2.0.tgz",
+					"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+					"dev": true,
+					"peer": true,
+					"requires": {
+						"fs.realpath": "^1.0.0",
+						"inflight": "^1.0.4",
+						"inherits": "2",
+						"minimatch": "^3.0.4",
+						"once": "^1.3.0",
+						"path-is-absolute": "^1.0.0"
+					},
+					"dependencies": {
+						"minimatch": {
+							"version": "3.1.2",
+							"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/minimatch/-/minimatch-3.1.2.tgz",
+							"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+							"dev": true,
+							"peer": true,
+							"requires": {
+								"brace-expansion": "^1.1.7"
+							}
+						}
+					}
+				},
+				"has-flag": {
+					"version": "4.0.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/has-flag/-/has-flag-4.0.0.tgz",
+					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+					"dev": true,
+					"peer": true
+				},
+				"js-yaml": {
+					"version": "4.1.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/js-yaml/-/js-yaml-4.1.0.tgz",
+					"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+					"dev": true,
+					"peer": true,
+					"requires": {
+						"argparse": "^2.0.1"
+					}
+				},
+				"locate-path": {
+					"version": "6.0.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/locate-path/-/locate-path-6.0.0.tgz",
+					"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+					"dev": true,
+					"peer": true,
+					"requires": {
+						"p-locate": "^5.0.0"
+					}
+				},
+				"minimatch": {
+					"version": "5.0.1",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/minimatch/-/minimatch-5.0.1.tgz",
+					"integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+					"dev": true,
+					"peer": true,
+					"requires": {
+						"brace-expansion": "^2.0.1"
+					},
+					"dependencies": {
+						"brace-expansion": {
+							"version": "2.0.1",
+							"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/brace-expansion/-/brace-expansion-2.0.1.tgz",
+							"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+							"dev": true,
+							"peer": true,
+							"requires": {
+								"balanced-match": "^1.0.0"
+							}
+						}
+					}
+				},
+				"ms": {
+					"version": "2.1.3",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ms/-/ms-2.1.3.tgz",
+					"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+					"dev": true,
+					"peer": true
+				},
+				"p-locate": {
+					"version": "5.0.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/p-locate/-/p-locate-5.0.0.tgz",
+					"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+					"dev": true,
+					"peer": true,
+					"requires": {
+						"p-limit": "^3.0.2"
+					}
+				},
+				"serialize-javascript": {
+					"version": "6.0.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+					"integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+					"dev": true,
+					"peer": true,
+					"requires": {
+						"randombytes": "^2.1.0"
+					}
+				},
+				"supports-color": {
+					"version": "8.1.1",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/supports-color/-/supports-color-8.1.1.tgz",
+					"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+					"dev": true,
+					"peer": true,
+					"requires": {
+						"has-flag": "^4.0.0"
+					}
+				},
+				"yargs": {
+					"version": "16.2.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs/-/yargs-16.2.0.tgz",
+					"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+					"dev": true,
+					"peer": true,
+					"requires": {
+						"cliui": "^7.0.2",
+						"escalade": "^3.1.1",
+						"get-caller-file": "^2.0.5",
+						"require-directory": "^2.1.1",
+						"string-width": "^4.2.0",
+						"y18n": "^5.0.5",
+						"yargs-parser": "^20.2.2"
+					}
+				},
+				"yargs-parser": {
+					"version": "20.2.4",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs-parser/-/yargs-parser-20.2.4.tgz",
+					"integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+					"dev": true,
+					"peer": true
+				}
+			}
+		},
 		"mochawesome": {
 			"version": "7.1.3",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mochawesome/-/mochawesome-7.1.3.tgz",
@@ -46796,6 +46751,13 @@
 			"dev": true,
 			"optional": true
 		},
+		"nanoid": {
+			"version": "3.3.3",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/nanoid/-/nanoid-3.3.3.tgz",
+			"integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+			"dev": true,
+			"peer": true
+		},
 		"nanomatch": {
 			"version": "1.2.13",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/nanomatch/-/nanomatch-1.2.13.tgz",
@@ -46874,9 +46836,9 @@
 			"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
 		},
 		"ng-mocks": {
-			"version": "14.8.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ng-mocks/-/ng-mocks-14.8.0.tgz",
-			"integrity": "sha512-bL1qi96/XuwjZijr4lE4R6NHlgeMivLYiCzrzWFh3x93JHeZf2jDLfOsm7BUIQHwXTYODPHyGvnCadEb44k4Rg==",
+			"version": "14.11.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ng-mocks/-/ng-mocks-14.11.0.tgz",
+			"integrity": "sha512-6h0TafPogU7iEbWKGQt5npfEtI7IjThsqqnDboMIZ4AJyUY7VHUmhFa39Zkd2e4oOLDLb/6sVnfDIaWCp3oFgQ==",
 			"dev": true,
 			"requires": {}
 		},
@@ -46902,9 +46864,9 @@
 			"integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="
 		},
 		"node-downloader-helper": {
-			"version": "2.1.6",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/node-downloader-helper/-/node-downloader-helper-2.1.6.tgz",
-			"integrity": "sha512-VkOvAXIopI3xMuM/MC5UL7NqqnizQ/9QXZt28jR8FPZ6fHLQm4xe4+YXJ9FqsWwLho5BLXrF51nfOQ0QcohRkQ==",
+			"version": "2.1.9",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/node-downloader-helper/-/node-downloader-helper-2.1.9.tgz",
+			"integrity": "sha512-FSvAol2Z8UP191sZtsUZwHIN0eGoGue3uEXGdWIH5228e9KH1YHXT7fN8Oa33UGf+FbqGTQg3sJfrRGzmVCaJA==",
 			"dev": true
 		},
 		"node-forge": {
@@ -47999,21 +47961,6 @@
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pify/-/pify-2.3.0.tgz",
 			"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="
 		},
-		"pinkie": {
-			"version": "2.0.4",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pinkie/-/pinkie-2.0.4.tgz",
-			"integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
-			"dev": true
-		},
-		"pinkie-promise": {
-			"version": "2.0.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-			"integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
-			"dev": true,
-			"requires": {
-				"pinkie": "^2.0.0"
-			}
-		},
 		"pirates": {
 			"version": "4.0.5",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pirates/-/pirates-4.0.5.tgz",
@@ -48459,7 +48406,7 @@
 			"version": "0.11.10",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/process/-/process-0.11.10.tgz",
 			"integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
-			"dev": true
+			"devOptional": true
 		},
 		"process-nextick-args": {
 			"version": "2.0.1",
@@ -48635,7 +48582,7 @@
 			"version": "2.2.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/querystringify/-/querystringify-2.2.0.tgz",
 			"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
-			"dev": true
+			"devOptional": true
 		},
 		"queue-microtask": {
 			"version": "1.2.3",
@@ -48764,52 +48711,6 @@
 				}
 			}
 		},
-		"read-pkg": {
-			"version": "2.0.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/read-pkg/-/read-pkg-2.0.0.tgz",
-			"integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==",
-			"dev": true,
-			"requires": {
-				"load-json-file": "^2.0.0",
-				"normalize-package-data": "^2.3.2",
-				"path-type": "^2.0.0"
-			},
-			"dependencies": {
-				"hosted-git-info": {
-					"version": "2.8.9",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
-					"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-					"dev": true
-				},
-				"normalize-package-data": {
-					"version": "2.5.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-					"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-					"dev": true,
-					"requires": {
-						"hosted-git-info": "^2.1.4",
-						"resolve": "^1.10.0",
-						"semver": "2 || 3 || 4 || 5",
-						"validate-npm-package-license": "^3.0.1"
-					}
-				},
-				"path-type": {
-					"version": "2.0.0",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/path-type/-/path-type-2.0.0.tgz",
-					"integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==",
-					"dev": true,
-					"requires": {
-						"pify": "^2.0.0"
-					}
-				},
-				"semver": {
-					"version": "5.7.1",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/semver/-/semver-5.7.1.tgz",
-					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-					"dev": true
-				}
-			}
-		},
 		"readable-stream": {
 			"version": "3.6.2",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -49251,23 +49152,6 @@
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/secure-compare/-/secure-compare-3.0.1.tgz",
 			"integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw=="
 		},
-		"seek-bzip": {
-			"version": "1.0.6",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/seek-bzip/-/seek-bzip-1.0.6.tgz",
-			"integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==",
-			"dev": true,
-			"requires": {
-				"commander": "^2.8.1"
-			},
-			"dependencies": {
-				"commander": {
-					"version": "2.20.3",
-					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-2.20.3.tgz",
-					"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-					"dev": true
-				}
-			}
-		},
 		"select-hose": {
 			"version": "2.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/select-hose/-/select-hose-2.0.0.tgz",
@@ -49784,22 +49668,45 @@
 			}
 		},
 		"sonarqube-scanner": {
-			"version": "2.9.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/sonarqube-scanner/-/sonarqube-scanner-2.9.1.tgz",
-			"integrity": "sha512-UXTEJKAxKBqM7B4iy26svnzEN9dCxzs0aWJATsTTkgTI//WdTZXxoXfSNuQ/D4VXJuivZPJQMKxF1AFjTe8jSQ==",
+			"version": "3.1.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/sonarqube-scanner/-/sonarqube-scanner-3.1.0.tgz",
+			"integrity": "sha512-7CspErch2pVwFrC9aM7NminyI0+OQmFz0V5IHJtC7FLM0cbKA2MnlsvfGfqZekqxMmxbWcybZ/izou4nQh9nMQ==",
 			"dev": true,
 			"requires": {
-				"decompress": "^4.2.1",
-				"extend": "3.0.2",
+				"adm-zip": "^0.5.10",
 				"fancy-log": "^2.0.0",
-				"https-proxy-agent": "^5.0.1",
-				"lodash.get": "^4.4.2",
-				"lodash.uniq": "^4.5.0",
-				"mkdirp": "^1.0.4",
-				"node-downloader-helper": "^2.1.5",
+				"https-proxy-agent": "^7.0.1",
+				"mkdirp": "^3.0.1",
+				"node-downloader-helper": "^2.1.9",
 				"progress": "^2.0.3",
-				"read-pkg": "2.0.0",
-				"slugify": "^1.6.5"
+				"slugify": "^1.6.6"
+			},
+			"dependencies": {
+				"agent-base": {
+					"version": "7.1.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/agent-base/-/agent-base-7.1.0.tgz",
+					"integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+					"dev": true,
+					"requires": {
+						"debug": "^4.3.4"
+					}
+				},
+				"https-proxy-agent": {
+					"version": "7.0.2",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
+					"integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
+					"dev": true,
+					"requires": {
+						"agent-base": "^7.0.2",
+						"debug": "4"
+					}
+				},
+				"mkdirp": {
+					"version": "3.0.1",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mkdirp/-/mkdirp-3.0.1.tgz",
+					"integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+					"dev": true
+				}
 			}
 		},
 		"source-list-map": {
@@ -50250,15 +50157,6 @@
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-bom/-/strip-bom-4.0.0.tgz",
 			"integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
 		},
-		"strip-dirs": {
-			"version": "2.1.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-dirs/-/strip-dirs-2.1.0.tgz",
-			"integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
-			"dev": true,
-			"requires": {
-				"is-natural-number": "^4.0.1"
-			}
-		},
 		"strip-final-newline": {
 			"version": "2.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
@@ -50772,12 +50670,6 @@
 			"integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==",
 			"dev": true
 		},
-		"to-buffer": {
-			"version": "1.1.1",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/to-buffer/-/to-buffer-1.1.1.tgz",
-			"integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
-			"dev": true
-		},
 		"to-fast-properties": {
 			"version": "2.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -50829,13 +50721,23 @@
 			"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
 		},
 		"tough-cookie": {
-			"version": "2.5.0",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-2.5.0.tgz",
-			"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+			"version": "4.1.3",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-4.1.3.tgz",
+			"integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
 			"devOptional": true,
 			"requires": {
-				"psl": "^1.1.28",
-				"punycode": "^2.1.1"
+				"psl": "^1.1.33",
+				"punycode": "^2.1.1",
+				"universalify": "^0.2.0",
+				"url-parse": "^1.5.3"
+			},
+			"dependencies": {
+				"universalify": {
+					"version": "0.2.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/universalify/-/universalify-0.2.0.tgz",
+					"integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+					"devOptional": true
+				}
 			}
 		},
 		"tr46": {
@@ -51223,16 +51125,6 @@
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/typescript/-/typescript-4.8.4.tgz",
 			"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ=="
 		},
-		"unbzip2-stream": {
-			"version": "1.4.3",
-			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
-			"integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
-			"dev": true,
-			"requires": {
-				"buffer": "^5.2.1",
-				"through": "^2.3.8"
-			}
-		},
 		"unicode-canonical-property-names-ecmascript": {
 			"version": "2.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -51422,7 +51314,7 @@
 			"version": "1.5.10",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/url-parse/-/url-parse-1.5.10.tgz",
 			"integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
-			"dev": true,
+			"devOptional": true,
 			"requires": {
 				"querystringify": "^2.1.1",
 				"requires-port": "^1.0.0"
@@ -52181,6 +52073,13 @@
 				"errno": "~0.1.7"
 			}
 		},
+		"workerpool": {
+			"version": "6.2.1",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/workerpool/-/workerpool-6.2.1.tgz",
+			"integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
+			"dev": true,
+			"peer": true
+		},
 		"wrap-ansi": {
 			"version": "7.0.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -52304,6 +52203,35 @@
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs-parser/-/yargs-parser-21.1.1.tgz",
 			"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="
 		},
+		"yargs-unparser": {
+			"version": "2.0.0",
+			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+			"integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+			"dev": true,
+			"peer": true,
+			"requires": {
+				"camelcase": "^6.0.0",
+				"decamelize": "^4.0.0",
+				"flat": "^5.0.2",
+				"is-plain-obj": "^2.1.0"
+			},
+			"dependencies": {
+				"camelcase": {
+					"version": "6.3.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/camelcase/-/camelcase-6.3.0.tgz",
+					"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+					"dev": true,
+					"peer": true
+				},
+				"is-plain-obj": {
+					"version": "2.1.0",
+					"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+					"integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+					"dev": true,
+					"peer": true
+				}
+			}
+		},
 		"yauzl": {
 			"version": "2.10.0",
 			"resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yauzl/-/yauzl-2.10.0.tgz",
diff --git a/goofy-client/package.json b/goofy-client/package.json
index be70ff2f992f202170ab0f9d3b05369c3bdf0652..0eccd787840c4f816483f44c73406bbaa626d8fc 100644
--- a/goofy-client/package.json
+++ b/goofy-client/package.json
@@ -34,18 +34,11 @@
 		"help": "nx help",
 		"favicon": "real-favicon generate favicon/faviconDescription.json favicon/faviconData.json src/favicon",
 		"cypress:run": "npx cypress run --project apps/goofy-e2e",
-		"cypress:run-main": "npx cypress run --project apps/goofy-e2e --config video=false,integrationFolder=./src/integration/main-tests",
-		"cypress:run-ea": "npx cypress run --project apps/goofy-e2e --config video=false,integrationFolder=./src/integration/einheitlicher-ansprechpartner",
-		"cypress:run-minimal": "npx cypress run --project apps/goofy-e2e --config video=false",
+		"cypress:run-main": "npx cypress run --project apps/goofy-e2e --spec apps/goofy-e2e/src/e2e/main-tests",
+		"cypress:run-ea": "npx cypress run --project apps/goofy-e2e --spec apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner",
 		"cypress:version": "npx cypress version",
 		"cypress:install": "npx cypress install",
 		"cypress:open": "npx cypress open --project apps/goofy-e2e",
-		"cypress:ci-run": "npm run cypress:delete-old-reports --REPORT_FOLDER=${npm_config_report_folder} ; NO_COLOR=1 npm run cypress:run -- --config-file ./${npm_config_config_file} ; test=$(echo \"$?\") ; npm run cypress:pre-merge --REPORT_FOLDER=${npm_config_report_folder} ; npm run cypress:generate-report --REPORT_FOLDER=${npm_config_report_folder} ; exit $test",
-		"cypress:delete-old-reports": "REPORT_FOLDER=${npm_config_report_folder} node apps/goofy-e2e/src/support/delete-old-reports.ts",
-		"cypress:pre-merge": "REPORT_FOLDER=${npm_config_report_folder} node apps/goofy-e2e/src/support/pre-merge.ts",
-		"cypress:generate-report": "npm run cypress:merge-report --REPORT_FOLDER=${npm_config_report_folder} ; npm run cypress:generate-html --REPORT_FOLDER=${npm_config_report_folder}",
-		"cypress:merge-report": "mochawesome-merge apps/goofy-e2e/reports/${npm_config_report_folder}/mochawesome-report/**/*.json > apps/goofy-e2e/reports/${npm_config_report_folder}/report.json",
-		"cypress:generate-html": "marge apps/goofy-e2e/reports/${npm_config_report_folder}/report.json -f report -o apps/goofy-e2e/reports/${npm_config_report_folder}",
 		"workspace-generator": "nx workspace-generator",
 		"sonar-scanner": "npm test -- --testResultsProcessor='jest-sonar-reporter' && sonar-scanner -Dsonar.host.url=https://sonarqube.ozg-sh.de/ -Dsonar.login=364c6e09430714838730a83f55d3369a7ffda0e9"
 	},
@@ -74,9 +67,9 @@
 		"date-fns": "^2.29.3",
 		"file-saver": "2.0.5",
 		"include-media": "^1.4.10",
-		"js-base64": "^3.7.3",
+		"js-base64": "^3.7.5",
 		"lodash-es": "4.17.21",
-		"rxjs": "~7.8.0",
+		"rxjs": "~7.8.1",
 		"sanitize-filename-ts": "^1.0.2",
 		"tslib": "^2.3.0",
 		"typeface-roboto": "1.1.13",
@@ -91,8 +84,8 @@
 		"@angular/compiler-cli": "15.1.4",
 		"@angular/language-service": "15.1.4",
 		"@bahmutov/cypress-extends": "1.1.0",
-		"@cypress/webpack-batteries-included-preprocessor": "^2.3.0",
-		"@cypress/webpack-preprocessor": "^5.16.3",
+		"@cypress/webpack-batteries-included-preprocessor": "^2.4.1",
+		"@cypress/webpack-preprocessor": "^5.17.1",
 		"@faker-js/faker": "^6.3.1",
 		"@ngrx/schematics": "15.0.0",
 		"@ngrx/store-devtools": "15.0.0",
@@ -103,16 +96,16 @@
 		"@nrwl/linter": "15.6.3",
 		"@nrwl/workspace": "15.6.3",
 		"@testing-library/jest-dom": "5.16.4",
-		"@types/file-saver": "2.0.5",
+		"@types/file-saver": "2.0.6",
 		"@types/jest": "28.1.8",
-		"@types/lodash-es": "4.17.6",
+		"@types/lodash-es": "4.17.10",
 		"@types/node": "^16.18.1",
 		"@typescript-eslint/eslint-plugin": "5.44.0",
 		"@typescript-eslint/parser": "5.44.0",
-		"cypress": "^9.7.0",
+		"cypress": "^12.17.4",
 		"cypress-file-upload": "5.0.8",
-		"cypress-mochawesome-reporter": "3.3.0",
-		"cypress-real-events": "^1.7.6",
+		"cypress-mochawesome-reporter": "3.6.0",
+		"cypress-real-events": "^1.10.3",
 		"cypress-timestamps": "^1.2.3",
 		"eslint": "8.15.0",
 		"eslint-config-prettier": "8.3.0",
@@ -126,10 +119,10 @@
 		"jest-preset-angular": "12.2.3",
 		"jest-sonar-reporter": "^2.0.0",
 		"mongodb": "4.5.0",
-		"ng-mocks": "^14.1.0",
+		"ng-mocks": "^14.11.0",
 		"nx": "15.6.3",
 		"prettier": "2.7.1",
-		"sonarqube-scanner": "2.9.1",
+		"sonarqube-scanner": "3.1.0",
 		"ts-jest": "28.0.8",
 		"ts-node": "10.9.1",
 		"typescript": "4.8.4"
diff --git a/goofy-client/pom.xml b/goofy-client/pom.xml
index d63ae820e5a084c655eede5de0f913b90d464bbc..12c63b3f1c46c5229234d41234f3f98b4d6babd6 100644
--- a/goofy-client/pom.xml
+++ b/goofy-client/pom.xml
@@ -30,7 +30,7 @@
 	<parent>
 		<groupId>de.itvsh.ozg</groupId>
 		<artifactId>goofy</artifactId>
-		<version>1.15.0-SNAPSHOT</version>
+		<version>1.17.0-SNAPSHOT</version>
 	</parent>
 
     <modelVersion>4.0.0</modelVersion>
@@ -54,83 +54,81 @@
                 </configuration>
             </plugin>
 
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>exec-maven-plugin</artifactId>
-                <version>3.0.0</version>
-                <executions>
-
-                     <execution>
-                        <id>test-application</id>
-                        <phase>test</phase>
-                        <configuration>
-                            <workingDirectory>./</workingDirectory>
-                            <executable>npm</executable>
-                            <arguments>
-                                <argument>run</argument>
-                                <argument>test</argument>
-                            </arguments>
-                        </configuration>
-                        <goals>
-                            <goal>exec</goal>
-                        </goals>
-                    </execution>
-
-                    <execution>
-                        <id>build-application</id>
-                        <phase>compile</phase>
-                        <configuration>
-                            <workingDirectory>./</workingDirectory>
-                            <executable>npm</executable>
-                            <arguments>
-                                <argument>run</argument>
-                                <argument>ci-build</argument>
-                            </arguments>
-                        </configuration>
-                        <goals>
-                            <goal>exec</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>exec-maven-plugin</artifactId>
+				<version>3.0.0</version>
+				<executions>
+					<execution>
+						<id>test-application</id>
+						<phase>test</phase>
+						<configuration>
+							<workingDirectory>./</workingDirectory>
+							<executable>npm</executable>
+							<arguments>
+								<argument>run</argument>
+								<argument>test</argument>
+							</arguments>
+                            <skip>${skipTests}</skip>
+						</configuration>
+						<goals>
+							<goal>exec</goal>
+						</goals>
+					</execution>
+					<execution>
+						<id>build-application</id>
+						<phase>compile</phase>
+						<configuration>
+							<workingDirectory>./</workingDirectory>
+							<executable>npm</executable>
+							<arguments>
+								<argument>run</argument>
+								<argument>ci-build</argument>
+							</arguments>
+						</configuration>
+						<goals>
+							<goal>exec</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
 
-    <profiles>
-        <profile>
-            <activation>
-                <property>
-                    <name>!skipNpmInstall</name>
-                </property>
-            </activation>
-            <id>npmInstall</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>exec-maven-plugin</artifactId>
-                        <version>3.0.0</version>
-                        <executions>
-                            <execution>
-                                <id>install-dependencies</id>
-                                <phase>generate-sources</phase>
-                                <configuration>
-                                    <workingDirectory>./</workingDirectory>
-                                    <executable>npm</executable>
-                                    <arguments>
-                                        <argument>install</argument>
-                                        <argument>--legacy-peer-deps</argument>
-                                    </arguments>
-                                </configuration>
-                                <goals>
-                                    <goal>exec</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
+	<profiles>
+		<profile>
+			<activation>
+				<property>
+					<name>!skipNpmInstall</name>
+				</property>
+			</activation>
+			<id>npmInstall</id>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>exec-maven-plugin</artifactId>
+						<version>3.0.0</version>
+						<executions>
+							<execution>
+								<id>install-dependencies</id>
+								<phase>generate-sources</phase>
+								<configuration>
+									<workingDirectory>./</workingDirectory>
+									<executable>npm</executable>
+									<arguments>
+										<argument>install</argument>
+									</arguments>
+								</configuration>
+								<goals>
+									<goal>exec</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
 
 </project>
diff --git a/goofy-server/pom.xml b/goofy-server/pom.xml
index 3d10300f55b3f09e2044091cc76ea69c00caf813..d8828e90c1595e36866312085376c49d5d71dfad 100644
--- a/goofy-server/pom.xml
+++ b/goofy-server/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>de.itvsh.ozg</groupId>
     <artifactId>goofy</artifactId>
-    <version>1.15.0-SNAPSHOT</version>
+    <version>1.17.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>goofy-server</artifactId>
@@ -15,32 +15,27 @@
     <maven.compiler.source>${java.version}</maven.compiler.source>
     <maven.compiler.target>${java.version}</maven.compiler.target>
 
-    <spring-boot.build-image.imageName>docker.ozg-sh.de/goofy:build-latest</spring-boot.build-image.imageName>
-  </properties>
+		<spring-boot.build-image.imageName>docker.ozg-sh.de/goofy:build-latest</spring-boot.build-image.imageName>
+	</properties>
 
-  <dependencies>
+	<dependencies>
+		<dependency>
+			<groupId>de.itvsh.ozg</groupId>
+			<artifactId>alfa-service</artifactId>
+			<version>${project.version}</version>
+		</dependency>
 
-    <dependency>
-      <groupId>de.itvsh.ozg</groupId>
-      <artifactId>alfa-service</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>de.itvsh.ozg</groupId>
-      <artifactId>alfa-xdomea</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+		<dependency>
+			<groupId>de.itvsh.ozg</groupId>
+			<artifactId>alfa-xdomea</artifactId>
+			<version>${project.version}</version>
+		</dependency>
 
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-security</artifactId>
-    </dependency>
-
-  </dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter</artifactId>
+		</dependency>
+	</dependencies>
 
   <build>
     <finalName>${project.artifactId}</finalName>
diff --git a/goofy-server/src/main/java/de/ozgcloud/alfa/AlfaServerApplication.java b/goofy-server/src/main/java/de/ozgcloud/alfa/AlfaServerApplication.java
index 38814989905b94b6a5996c4d32a92290e55d0fe6..54525b45e9a5b1363132efdcbad4ae8269df23f7 100644
--- a/goofy-server/src/main/java/de/ozgcloud/alfa/AlfaServerApplication.java
+++ b/goofy-server/src/main/java/de/ozgcloud/alfa/AlfaServerApplication.java
@@ -49,14 +49,14 @@ public class AlfaServerApplication {
 	}
 
 	@Bean
-	public FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter() {
+	FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter() {
 		FilterRegistrationBean<ForwardedHeaderFilter> bean = new FilterRegistrationBean<>();
 		bean.setFilter(new ForwardedHeaderFilter());
 		return bean;
 	}
 
 	@Bean
-	public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
+	ThreadPoolTaskExecutor threadPoolTaskExecutor() {
 		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
 
 		executor.setThreadNamePrefix("async-");
@@ -65,12 +65,12 @@ public class AlfaServerApplication {
 	}
 
 	@Bean
-	public CallScope callScope() {
+	CallScope callScope() {
 		return new CallScope();
 	}
 
 	@Bean
-	public BeanFactoryPostProcessor beanFactoryPostProcessor(CallScope callScope) {
+	BeanFactoryPostProcessor beanFactoryPostProcessor(CallScope callScope) {
 		return new CallBeanFactoryPostProcessor(callScope);
 	}
 }
\ No newline at end of file
diff --git a/goofy-server/src/main/resources/application-dev.yml b/goofy-server/src/main/resources/application-dev.yml
index be7dc4d1adb0c218ef1d2c908b35b8fbd2142632..66b1bb57668a073ceaeab1e2d50c1f47ed7632fa 100644
--- a/goofy-server/src/main/resources/application-dev.yml
+++ b/goofy-server/src/main/resources/application-dev.yml
@@ -2,14 +2,14 @@ goofy:
   production: false
 
 keycloak:
-  auth-server-url: https://sso.dev.by.ozg-cloud.de
-  realm: by-kiel-dev
-  resource: alfa
+   auth-server-url: https://sso.dev.by.ozg-cloud.de		
+   realm: by-kiel-dev		
+   resource: alfa
 
 server:
   error:
     include-stacktrace: always
-    
+
 ozgcloud:
   feature:
      vorgang-export: true
diff --git a/goofy-server/src/main/resources/application-e2e.yml b/goofy-server/src/main/resources/application-e2e.yml
index 6b4c84428d26ff921ab8c233062ebd1b8837dce4..50cac7fbb8d11fe5c5ad23487bcdaed4b72a05d0 100644
--- a/goofy-server/src/main/resources/application-e2e.yml
+++ b/goofy-server/src/main/resources/application-e2e.yml
@@ -1,13 +1,11 @@
 keycloak:
   realm: by-e2e-local-dev
-  resource: alfa
-  
 kop:
   forwarding:
     lninfo:
       url: classpath:files/LandesnetzInfo.html
   user-manager:
-    url: http://localhost:9091
+    url: http://localhost:9092
     
 ozgcloud:
   feature:
@@ -15,4 +13,4 @@ ozgcloud:
      createBescheid: true
   user-assistance:
      documentation:
-        url: /assets/benutzerleitfaden/Benutzerleitfaden_2.5.pdf
\ No newline at end of file
+        url: /assets/benutzerleitfaden/benutzerleitfaden.pdf
\ No newline at end of file
diff --git a/goofy-server/src/main/resources/application-local.yml b/goofy-server/src/main/resources/application-local.yml
index 4f0e0f12aab2ad4c7fd4c89d4263a8a03ccaa8e2..48b03024d8f9f74e8c4aa72a27dadeb853eb6739 100644
--- a/goofy-server/src/main/resources/application-local.yml
+++ b/goofy-server/src/main/resources/application-local.yml
@@ -7,11 +7,6 @@ logging:
 goofy:
   production: false
 
-keycloak:
-  auth-server-url: http://localhost:8088
-  realm: sh-kiel-dev #TODO adjust
-  resource: sh-kiel-dev-goofy #TODO adjust
-
 server:
   error:
     include-stacktrace: always
@@ -30,4 +25,12 @@ grpc:
       
 ozgcloud:
   feature:
-    vorgang-export: true
\ No newline at end of file
+    vorgang-export: true
+  user-assistance:
+     documentation:
+        url: /assets/benutzerleitfaden/benutzerleitfaden.pdf
+    
+keycloak:
+  auth-server-url: http://localhost:8088
+  realm: sh-kiel-dev #TODO adjust
+  resource: sh-kiel-dev-goofy #TODO adjust
\ No newline at end of file
diff --git a/goofy-server/src/main/resources/application-remotekc.yml b/goofy-server/src/main/resources/application-remotekc.yml
index f27d8bf81a26dd58d2b10d44b8b01eb89add3c8f..60e21682a25f6e8445fcc8d21dea502e5de6f890 100644
--- a/goofy-server/src/main/resources/application-remotekc.yml
+++ b/goofy-server/src/main/resources/application-remotekc.yml
@@ -1,6 +1,4 @@
-keycloak: 
-  realm: by-kiel-dev
-  resource: alfa
-  public-client: true
-  use-resource-role-mappings: true
+keycloak:
   auth-server-url: https://sso.dev.by.ozg-cloud.de
+  realm: by-kiel-dev
+  resource: alfa
\ No newline at end of file
diff --git a/goofy-server/src/main/resources/application.yml b/goofy-server/src/main/resources/application.yml
index a84e4da06ffa475b8240b43d5301fe68a85cbbda..711b24897872a68bff0743da9e7f7092de0aaa5d 100644
--- a/goofy-server/src/main/resources/application.yml
+++ b/goofy-server/src/main/resources/application.yml
@@ -4,12 +4,11 @@ logging:
     '[de.itvsh]': INFO
     '[de.ozgcloud]': INFO,
     '[org.springframework.security]': WARN
-    '[org.keycloak.adapters]': WARN
 
 spring:
   mvc:
     pathmatch:
-      matching-strategy: ant-path-matcher
+      matching-strategy: ant_path_matcher
   application:
     name: Goofy
   jackson:
@@ -19,6 +18,12 @@ spring:
     multipart:
       max-file-size: 2GB
       max-request-size: 2GB
+  security:
+    oauth2:
+      resourceserver:
+        jwt:
+          issuer-uri: ${ozgcloud.oauth2.issuer-uri}
+          jwk-set-uri: ${spring.security.oauth2.resourceserver.jwt.issuer-uri}/protocol/openid-connect/certs
 
 server:
   http2:
@@ -51,13 +56,6 @@ management:
 
 goofy:
   production: true
-    
-keycloak:
-  auth-server-url: http://localhost:8088
-  realm: sh-kiel-dev
-  resource: sh-kiel-dev-goofy
-  public-client: true
-  use-resource-role-mappings: true
 
 grpc:
   client:
@@ -71,7 +69,7 @@ grpc:
 kop:
   auth:
     token:
-      secret: XPPWagXn3rDwKG6Ywoir
+      secret: XPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6Ywoir
       validity: 60000
   upload:
     maxFileSize:
@@ -79,4 +77,12 @@ kop:
       wiedervorlageAttachment: 40MB
   user-manager:
     profile-template: /api/userProfiles/%s
-    search-template: /api/userProfiles/?searchBy={searchBy}
\ No newline at end of file
+    search-template: /api/userProfiles/?searchBy={searchBy}
+
+ozgcloud:
+  oauth2:
+    auth-server-url: ${keycloak.auth-server-url}
+    realm: ${keycloak.realm}
+    resource: ${keycloak.resource}
+    principle-attribute: preferred_username
+    issuer-uri: ${ozgcloud.oauth2.auth-server-url}/realms/${ozgcloud.oauth2.realm}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 46ae5cc7d1bce45bc36dd5ec8bf33208aa7dedea..dede3f5826ca6b39158c118280e90cf83a47082a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,14 +30,14 @@
 
 	<groupId>de.itvsh.ozg</groupId>
 	<artifactId>goofy</artifactId>
-	<version>1.15.0-SNAPSHOT</version>
+	<version>1.17.0-SNAPSHOT</version>
 	<name>Goofy Parent</name>
 	<packaging>pom</packaging>
 
 	<parent>
 		<groupId>de.itvsh.kop.common</groupId>
 		<artifactId>kop-common-parent</artifactId>
-		<version>1.7.0</version>
+		<version>2.3.1</version>
 	</parent>
 
 	<modules>
@@ -45,20 +45,20 @@
 		<module>goofy-server</module>
 		<module>alfa-xdomea</module>
 		<module>alfa-service</module>
-  </modules>
+	</modules>
 
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-		
+
 		<pluto.version>1.13.0</pluto.version>
-		<kop-common-pdf.version>1.6.4</kop-common-pdf.version>
+		<kop-common-pdf.version>2.3.1</kop-common-pdf.version>
 		<user-manager.version>1.6.0</user-manager.version>
 	</properties>
-	
+
 	<build>
 		<pluginManagement>
-		    <plugins>
+			<plugins>
 				<plugin>
 					<groupId>com.mycila</groupId>
 					<artifactId>license-maven-plugin</artifactId>
diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml
index aff0dfc2523947fd1f62d054291478403089a1c2..a8f02ec54ef44fa7b65ff6472f5184df667f2bef 100644
--- a/src/main/helm/templates/deployment.yaml
+++ b/src/main/helm/templates/deployment.yaml
@@ -88,6 +88,15 @@ spec:
         {{- with (.Values.env).customList }}
 {{ toYaml . | indent 8 }}
         {{- end }}
+        {{- if ((.Values.ozgcloud).vorgang).bescheid}}
+        {{- range $index, $bescheid := ((.Values.ozgcloud).vorgang).bescheid }}
+        - name: ozgcloud_vorgang_bescheid_{{ $index }}_formId
+          value: {{ $bescheid.formId }}
+        - name: ozgcloud_vorgang_bescheid_{{ $index }}_formEngineName
+          value: {{ $bescheid.formEngineName }}
+        {{- end }}
+        {{- end}}
+
         image: "{{ .Values.image.repo }}/{{ .Values.image.name }}:{{ coalesce (.Values.image).tag "latest" }}"
         imagePullPolicy: Always
         name: goofy
@@ -139,6 +148,8 @@ spec:
            mountPath: "/bindings/ca-certificates/user-manager-tls-ca.pem"
            subPath: ca.crt
            readOnly: true
+         - name: temp-dir
+           mountPath: "/tmp"
       volumes:
          - name: bindings
            configMap:
@@ -146,6 +157,8 @@ spec:
          - name: user-manager-tls-certificate
            secret:
               secretName: user-manager-tls-cert
+         - name: temp-dir
+           emptyDir: {}
       dnsConfig: {}
       dnsPolicy: ClusterFirst
       imagePullSecrets:
diff --git a/src/main/helm/templates/ingress.yaml b/src/main/helm/templates/ingress.yaml
index 374c0ac57f2964ec534aaac29a92384f312f08c4..da1a9789fb1dc5410f6fb8cf5a65bc58d201eeda 100644
--- a/src/main/helm/templates/ingress.yaml
+++ b/src/main/helm/templates/ingress.yaml
@@ -35,8 +35,8 @@ metadata:
   name: {{ include "app.name" . }}
   namespace: {{ include "app.namespace" . }}
 spec:
-  {{- if ne (.Values).cluster_env "dataport"}}
-  ingressClassName: nginx
+  {{- if and (.Values.ingress).className (ne (.Values).cluster_env "dataport") }}
+  ingressClassName: {{ .Values.ingress.className }}
   {{- end }}
   rules:
     - http:
diff --git a/src/main/helm/templates/keycloak-client-crd.yaml b/src/main/helm/templates/keycloak-client-crd.yaml
index 57e550c3ad005a53cace6b3bb50fc753b8645562..1e5509d9114b14284a7e5f49361332832cff0107 100644
--- a/src/main/helm/templates/keycloak-client-crd.yaml
+++ b/src/main/helm/templates/keycloak-client-crd.yaml
@@ -1,10 +1,19 @@
 {{ range $client := .Values.sso.keycloak_clients }}
 ---
+{{- if $client.kopOperator }}
+apiVersion: api.kop-stack.de/v1
+kind: KopKeycloakClient
+{{- else }}
 apiVersion: operator.ozgcloud.de/v1
 kind: OzgKeycloakClient
+{{- end }}
 metadata:
   name: {{ include "app.generateKeycloakClientRessourceName" $client.client_name }}
   namespace: {{ include "app.namespace" $ }}
+{{- if $client.kopOperator }}
+  annotations:
+    "helm.sh/resource-policy": keep
+{{- end }}
 spec:
   keep_after_delete: {{ $.Values.sso.keep_after_delete | default false }}
   client_name: {{ $client.client_name }}
diff --git a/src/main/helm/templates/keycloak-crd.yaml b/src/main/helm/templates/keycloak-crd.yaml
index 38f7c679cd10b70cc232ae536317d11f76a8d655..3829005d084993961d01170e63029ee2119803ac 100644
--- a/src/main/helm/templates/keycloak-crd.yaml
+++ b/src/main/helm/templates/keycloak-crd.yaml
@@ -6,4 +6,4 @@ metadata:
   namespace: {{ include "app.namespace" . }}
 spec:
   keep_after_delete: {{ .Values.sso.keep_after_delete | default false }}
-  kop_displayname: {{ include "app.ssoRealmDisplayName" . }}
+  displayName: {{ include "app.ssoRealmDisplayName" . }}
diff --git a/src/test/helm/deployment_bindings_test.yaml b/src/test/helm/deployment_bindings_test.yaml
index a835a85e2d1a52bbe280128990f521bd1506af65..b10cfb4fffe37fe5749a6cb2e38a6f946d6f304a 100644
--- a/src/test/helm/deployment_bindings_test.yaml
+++ b/src/test/helm/deployment_bindings_test.yaml
@@ -47,6 +47,11 @@ tests:
             mountPath: "/bindings/ca-certificates/user-manager-tls-ca.pem"
             subPath: ca.crt
             readOnly: true
+      - contains:
+          path: spec.template.spec.containers[0].volumeMounts
+          content:
+            name: temp-dir
+            mountPath: "/tmp"
   - it: should have volume mounts
     set: 
        usermanagerName: user-manager
@@ -62,4 +67,9 @@ tests:
            content:
               name: user-manager-tls-certificate
               secret:
-                 secretName: user-manager-tls-cert
\ No newline at end of file
+                 secretName: user-manager-tls-cert
+      - contains:
+          path: spec.template.spec.volumes
+          content:
+            name: temp-dir
+            emptyDir: {}
\ No newline at end of file
diff --git a/src/test/helm/deployment_defaults_annotaion_test.yaml b/src/test/helm/deployment_defaults_annotaion_test.yaml
index b310cbf8c7526eff7f784f6ba7862e869dca8cbf..d6e0e9326efbcf9be4203d604b13971435e6b0a2 100644
--- a/src/test/helm/deployment_defaults_annotaion_test.yaml
+++ b/src/test/helm/deployment_defaults_annotaion_test.yaml
@@ -36,9 +36,8 @@ tests:
       - equal:
           path: metadata.annotations.[cert-manager.io/cluster-issuer]
           value: letsencrypt-prod
-      - equal:
+      - isNull:
           path: spec.ingressClassName
-          value: nginx
       - equal:
           path: spec.tls[0].secretName
           value: helm-goofy-tls
diff --git a/src/test/helm/deployment_defaults_env_test.yaml b/src/test/helm/deployment_defaults_env_test.yaml
index f131dc469ec94a9c1d305de7d4e073e1a2fa7c60..473341be65848b9ddef1c42b6992a27c3a357f6b 100644
--- a/src/test/helm/deployment_defaults_env_test.yaml
+++ b/src/test/helm/deployment_defaults_env_test.yaml
@@ -50,21 +50,7 @@ tests:
           content:
             name: spring_profiles_active
             value: oc, test
-      - contains:
-          path: spec.template.spec.containers[0].env
-          content:
-            name: keycloak_realm
-            value: sh-helm-test
-      - contains:
-          path: spec.template.spec.containers[0].env
-          content:
-            name: keycloak_resource
-            value: alfa
-      - contains:
-          path: spec.template.spec.containers[0].env
-          content:
-            name: keycloak_auth-server-url
-            value: https://sso.sh.ozg-cloud.de
+
   - it: should have service binding root
     set: 
        usermanagerName: user-manager
@@ -74,7 +60,8 @@ tests:
          content:
             name: SERVICE_BINDING_ROOT
             value: "/bindings"
-  - it: should have user assitance documentation url
+
+  - it: should have user assistance documentation url
     templates:
       - templates/deployment.yaml
     set:
@@ -84,4 +71,37 @@ tests:
           path: spec.template.spec.containers[0].env
           content:
             name: ozgcloud_user-assistance_documentation_url
-            value: http://
\ No newline at end of file
+            value: http://
+
+  - it: should have create Bescheid Konfiguration
+    templates:
+      - templates/deployment.yaml
+    set:
+      ozgcloud:
+        vorgang:
+          bescheid:
+            - formEngineName: AFM
+              formId: form_id_1
+            - formEngineName: FormSolutions
+              formId: form_id_2
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: ozgcloud_vorgang_bescheid_0_formId
+            value: form_id_1
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: ozgcloud_vorgang_bescheid_0_formEngineName
+            value: AFM
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: ozgcloud_vorgang_bescheid_1_formId
+            value: form_id_2
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: ozgcloud_vorgang_bescheid_1_formEngineName
+            value: FormSolutions
\ No newline at end of file
diff --git a/src/test/helm/ingress-nginx-tests.yaml b/src/test/helm/ingress-nginx-tests.yaml
index c7edb23088e27c5997a1689c5cfd9473992e1d18..2e897d49e43ecbe692ca4d40770e6ddc0603dfae 100644
--- a/src/test/helm/ingress-nginx-tests.yaml
+++ b/src/test/helm/ingress-nginx-tests.yaml
@@ -29,11 +29,8 @@ release:
 templates:
   - templates/ingress.yaml
 tests:
-  - it: should create ingress tls/ingressClass
+  - it: should create ingress tls
     asserts:
-      - equal:
-          path: spec.ingressClassName
-          value: nginx
       - equal:
           path: spec.tls[0].secretName
           value: helm-goofy-tls
@@ -72,4 +69,15 @@ tests:
     asserts:
       - equal:
           path: metadata.annotations.[nginx.ingress.kubernetes.io/proxy-body-size]
-          value: 42m
\ No newline at end of file
+          value: 42m
+  - it: should not set ingressClassName
+    asserts:
+      - isNull:
+          path: spec.ingressClassName
+  - it: should set ingressClassName
+    set:
+      ingress.className: nginx
+    asserts:
+      - equal:
+          path: spec.ingressClassName
+          value: nginx
\ No newline at end of file
diff --git a/src/test/helm/keycloak-client-crd-test.yaml b/src/test/helm/keycloak-client-crd-test.yaml
index 3140b69cf5f495c90a3d987287c207284c7cc954..37334dedbf0deeb11c289c0a84747793d4877096 100644
--- a/src/test/helm/keycloak-client-crd-test.yaml
+++ b/src/test/helm/keycloak-client-crd-test.yaml
@@ -51,6 +51,27 @@ tests:
       - equal:
           path: metadata.namespace
           value: by-helm-test
+  - it: should contain header data for kopOperator
+    set:
+      sso:
+         keycloak_clients:
+           - client_name: alfa
+             kopOperator: true
+    asserts:
+      - isAPIVersion:
+          of: api.kop-stack.de/v1
+      - isKind:
+          of: KopKeycloakClient
+  - it: should have annotations for kopOperator
+    set:
+      sso:
+        keycloak_clients:
+          - client_name: alfa
+            kopOperator: true
+    asserts:
+      - equal:
+          path: metadata.annotations.[helm.sh/resource-policy]
+          value: keep
   - it: should have default Values
     set:
       baseUrl: test.by.ozg-cloud.de
diff --git a/src/test/helm/keycloak-crd-test.yaml b/src/test/helm/keycloak-crd-test.yaml
index 21631aaa7e7b6265edc1395b7d8130ac09eaa77f..999005b02c3a2b89d1f6886de1d7010f10b63838 100644
--- a/src/test/helm/keycloak-crd-test.yaml
+++ b/src/test/helm/keycloak-crd-test.yaml
@@ -58,7 +58,7 @@ tests:
           path: spec.keep_after_delete
           value: true
       - equal:
-          path: spec.kop_displayname
+          path: spec.displayName
           value: Realm für Helm (test)