Repository: urlaubsverwaltung/urlaubsverwaltung
Pull request #4983 (2024-11-21 19:45:04)

Bump org.springframework.boot:spring-boot-starter-parent from 3.3.6 to 3.4.0
see https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.4-Release-Notes
and https://docs.jboss.org/hibernate/orm/6.6/migration-guide/migration-guide.html with Merge versioned entity when row is deleted

<br/>
<br/>

Bumps [org.springframework.boot:spring-boot-starter-parent](https://github.com/spring-projects/spring-boot) from 3.3.6 to 3.4.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/spring-projects/spring-boot/releases">org.springframework.boot:spring-boot-starter-parent's releases</a>.</em></p>
<blockquote>
<h2>v3.4.0</h2>
<h2>:star: New Features</h2>
<ul>
<li>Add withDefaultRequestConfigCustomizer method to HttpComponentsClientHttpRequestFactoryBuilder <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43139">#43139</a></li>
<li>Fail JsonWriter if duplicate names are detected <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43041">#43041</a></li>
<li>Add JsonObjectDeserializer.nullSafeValue method that accepts a mapper Function <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42972">#42972</a></li>
<li>Support timeout property for GraphQL over SSE <a href="https://redirect.github.com/spring-projects/spring-boot/pull/42966">#42966</a></li>
<li>Improve performance of ConfigurationPropertiesBinder by storing bind handlers on first access <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42950">#42950</a></li>
<li>Improve performance of ConcurrentReferenceCachingMetadataReaderFactory <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42949">#42949</a></li>
<li>Log warning in HikariCheckpointRestoreLifecycle if pool suspension isn't configured <a href="https://redirect.github.com/spring-projects/spring-boot/pull/42937">#42937</a></li>
<li>Remove spring-boot-starter-aop dependency from spring-boot-starter-data-jpa and spring-boot-starter-integration <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42934">#42934</a></li>
</ul>
<h2>:lady_beetle: Bug Fixes</h2>
<ul>
<li>Jersey body handling is inconsistent with Spring Webflux and Spring MVC <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43209">#43209</a></li>
<li>Classes are accidentally named &quot;structure logging&quot; instead of &quot;structured logging&quot; <a href="https://redirect.github.com/spring-projects/spring-boot/pull/43203">#43203</a></li>
<li>StructuredLoggingJsonProperties customizer should be a Class reference rather than a String <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43202">#43202</a></li>
<li>Cannot package OCI image when 'docker.io/paketobuildpacks/new-relic' is provided as a buildpack <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43171">#43171</a></li>
<li>Incorrect Type for 'management.endpoints.access.default' defined in additional-spring-configuration-metadata.json <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43154">#43154</a></li>
<li>WebServerPortFileWriter fails when using a portfile without extension <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43117">#43117</a></li>
<li>SslOptions.isSpecified() only returns true if ciphers and enabled protocols are set <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43084">#43084</a></li>
<li>SslHealthIndicator throws NullPointerException when using SslBundle with SslStoreBundle.NONE <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43078">#43078</a></li>
<li>JdkClientHttpRequestFactoryBuilder and JettyClientHttpRequestFactoryBuilder do not set Ciphers or Enabled Protocols <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43077">#43077</a></li>
<li>Root cause of errors is hidden when loading images from archive  <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43070">#43070</a></li>
<li>mvn spring-boot:run fails on Windows with &quot;Could Not Find or Load Main Class&quot; when path contains non-ASCII characters <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43062">#43062</a></li>
<li>A <code>@SpyBean</code> on the output of a FactoryBean is not reset <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43053">#43053</a></li>
<li>Logback logging system does not process URLs with paths not ending in .xml <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42990">#42990</a></li>
<li>Bean-based conditions do not consider factory beans correctly when determining if they are a candidate <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42970">#42970</a></li>
<li>NPE in bootBuildImage when setting DOCKER_CONTEXT=default <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42960">#42960</a></li>
<li>Warning due to duplicate MockResolver extensions <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42957">#42957</a></li>
<li>HttpHostConnectException is thrown when using buildpacks with Gradle or Maven on Windows <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42952">#42952</a></li>
<li>build-info doesn't support seconds since the epoch from project.build.outputTimestamp <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42936">#42936</a></li>
<li>NPE in OnClassCondition.resolveOutcomesThreaded following thread interruption because firstHalf is null <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42926">#42926</a></li>
<li>Default WebSocketMessageBrokerConfigurer is always overriding custom channel executor <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42924">#42924</a></li>
<li>X-Registry-Auth header sent to Docker Engine API contains field &quot;authHeader&quot; <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42915">#42915</a></li>
<li>ApplicationContextRunner has inconsistent behaviour with duplicate auto-configuration class names <a href="https://redirect.github.com/spring-projects/spring-boot/issues/17963">#17963</a></li>
</ul>
<h2>:notebook_with_decorative_cover: Documentation</h2>
<ul>
<li>Migrate class references to full javadoc links <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43239">#43239</a></li>
<li>Documentation for 'spring.datasource.type' is misleading <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43199">#43199</a></li>
<li>Update &quot;Upgrading From&quot; section to use &quot;2.x&quot; <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43160">#43160</a></li>
<li>Include spring-boot-loader in API documentation <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43153">#43153</a></li>
<li>Document how and where to add custom GraalVM configuration files <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43074">#43074</a></li>
<li>Rework DataSource configuration examples to separate defining an additional DataSource and defining a DataSource of a different type <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43059">#43059</a></li>
<li>Location of the layers schema is incorrect in the Maven Plugin's examples <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43033">#43033</a></li>
<li>Link to Eclipse setup instructions <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42954">#42954</a></li>
<li>Fix link to Checkpoint and Restore status page <a href="https://redirect.github.com/spring-projects/spring-boot/issues/42939">#42939</a></li>
</ul>
<h2>:hammer: Dependency Upgrades</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/spring-projects/spring-boot/commit/8964203688c111e11604bc4454743998bc387993"><code>8964203</code></a> Release v3.4.0</li>
<li><a href="https://github.com/spring-projects/spring-boot/commit/109e731c8388dafa06159abc4744285b80c6f555"><code>109e731</code></a> Revert &quot;Add <code>@ConditionalOnMissingBean</code> for <code>JobRepository</code>&quot;</li>
<li><a href="https://github.com/spring-projects/spring-boot/commit/d21952d6a935bc5e5652b7a0194fde69db24264a"><code>d21952d</code></a> Merge branch '3.3.x'</li>
<li><a href="https://github.com/spring-projects/spring-boot/commit/415193827bfe8fbfd02d075759460c8ca2abbfc9"><code>4151938</code></a> Next development version (v3.3.7-SNAPSHOT)</li>
<li><a href="https://github.com/spring-projects/spring-boot/commit/14989a5fb779c4366fb405a74c4aaa51207d8145"><code>14989a5</code></a> Upgrade to Testcontainers 1.20.4</li>
<li><a href="https://github.com/spring-projects/spring-boot/commit/c188822db3c3698c36954c3222e0f51821032fa1"><code>c188822</code></a> Upgrade to Spring Security 6.4.1</li>
<li><a href="https://github.com/spring-projects/spring-boot/commit/e286739cee51c4f713b22c7f9cede77c97e9151b"><code>e286739</code></a> Upgrade to Spring Batch 5.2.0</li>
<li><a href="https://github.com/spring-projects/spring-boot/commit/73fc351d71cc9120c794bf6206b389a4dbb4ba4c"><code>73fc351</code></a> Add <code>@ConditionalOnMissingBean</code> for <code>JobRepository</code></li>
<li><a href="https://github.com/spring-projects/spring-boot/commit/3cae5c27d1d9edf39fbaff7159a71811ae717ab0"><code>3cae5c2</code></a> Merge branch '3.3.x'</li>
<li><a href="https://github.com/spring-projects/spring-boot/commit/933b7d30bb8bbcc1efab9aeb2e4ed722d7230746"><code>933b7d3</code></a> Merge pull request <a href="https://redirect.github.com/spring-projects/spring-boot/issues/43235">#43235</a> from izeye</li>
<li>Additional commits viewable in <a href="https://github.com/spring-projects/spring-boot/compare/v3.3.6...v3.4.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.springframework.boot:spring-boot-starter-parent&package-manager=maven&previous-version=3.3.6&new-version=3.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/.chglog/5.9.0.md b/.chglog/5.9.0.md
deleted file mode 100644
index 584aecb25..000000000
--- a/.chglog/5.9.0.md
+++ /dev/null
@@ -1,41 +0,0 @@
-## ⭐ Enhancements
-
-- [workflows] run all ui tests with all browsers [#4969](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4969)
-- public holidays: use public holidays from jollyday and not the custom… [#4959](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4959)
-
-## 🔨 Dependency upgrades
-
-- Bump `@babel`/core from 7.25.9 to 7.26.0 [#4960](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4960)
-- Bump `@babel`/preset-env from 7.25.9 to 7.26.0 [#4961](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4961)
-- Bump `@eslint`/js from 9.13.0 to 9.15.0 [#4985](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4985)
-- Bump com.google.apis:google-api-services-calendar from v3-rev20240927-2.0.0 to v3-rev20241101-2.0.0 [#4966](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4966)
-- Bump com.google.http-client:google-http-client-jackson2 from 1.45.0 to 1.45.1 [#4972](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4972)
-- Bump com.icegreen:greenmail-junit5 from 2.1.0 to 2.1.1 [#4973](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4973)
-- Bump com.microsoft.playwright:playwright from 1.48.0 to 1.49.0 [#4988](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4988)
-- Bump concurrently from 9.0.1 to 9.1.0 [#4986](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4986)
-- Bump cross-spawn from 7.0.3 to 7.0.5 in the npm_and_yarn group [#4970](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4970)
-- Bump eslint from 9.13.0 to 9.15.0 [#4987](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4987)
-- Bump eslint-plugin-unicorn from 56.0.0 to 56.0.1 [#4982](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4982)
-- Bump fetch-mock from 9.11.0 to 12.2.0 [#4979](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4979)
-- Bump globals from 15.11.0 to 15.12.0 [#4978](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4978)
-- Bump jollyday.version from 0.32.0 to 0.33.0 [#4958](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4958)
-- Bump jollyday.version from 0.33.0 to 0.34.0 [#4964](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4964)
-- Bump jollyday.version from 0.34.0 to 0.35.0 [#4971](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4971)
-- bump node to 22.11.0 [#4968](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4968)
-- Bump org.sonarsource.scanner.maven:sonar-maven-plugin from 4.0.0.4121 to 5.0.0.4389 [#4967](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4967)
-- Bump org.springframework.boot:spring-boot-starter-parent from 3.3.5 to 3.3.6 [#4977](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4977)
-- Bump postcss from 8.4.47 to 8.4.49 [#4980](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4980)
-- Bump rollup from 4.24.0 to 4.24.3 [#4963](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4963)
-- Bump rollup from 4.24.3 to 4.27.3 [#4984](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4984)
-- Bump tailwindcss from 3.4.14 to 3.4.15 [#4981](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pull/4981)
-
-## ❤️ Contributors
-
-We'd like to thank all the contributors who worked on this release!
-
-- [@derTobsch](https://github.com/derTobsch)
-- [@bseber](https://github.com/bseber)
-## External Links
-
-- [Docker Images (GitHub)](https://github.com/urlaubsverwaltung/urlaubsverwaltung/pkgs/container/urlaubsverwaltung%2Furlaubsverwaltung)
-- [Docker Images (Docker Hub)](https://hub.docker.com/r/urlaubsverwaltung/urlaubsverwaltung)
diff --git a/charts/urlaubsverwaltung/Chart.yaml b/charts/urlaubsverwaltung/Chart.yaml
index 15e5232bd..c3dd58e8f 100644
--- a/charts/urlaubsverwaltung/Chart.yaml
+++ b/charts/urlaubsverwaltung/Chart.yaml
@@ -2,8 +2,8 @@ apiVersion: v2
 name: urlaubsverwaltung
 description: Helm Chart for the urlaubsverwaltung
 type: application
-version: "6.1.2"
-appVersion: 5.9.0
+version: "6.1.1"
+appVersion: 5.8.1
 keywords:
   - urlaub
 home: https://github.com/urlaubsverwaltung/urlaubsverwaltung
diff --git a/package-lock.json b/package-lock.json
index ed5f33b89..209e7c931 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,7 +24,7 @@
         "less-plugin-clean-css": "1.6.0",
         "lint-staged": "15.2.10",
         "rimraf": "6.0.1",
-        "rollup": "4.27.3",
+        "rollup": "4.24.3",
         "rollup-plugin-esbuild": "6.1.1",
         "rollup-plugin-postcss": "4.0.2",
         "timepicker": "1.14.1",
@@ -35,15 +35,15 @@
         "@babel/eslint-parser": "7.25.9",
         "@babel/plugin-syntax-dynamic-import": "7.8.3",
         "@babel/preset-env": "7.26.0",
-        "@eslint/js": "9.15.0",
+        "@eslint/js": "9.13.0",
         "@types/jest": "29.5.14",
         "autoprefixer": "10.4.20",
         "babel-jest": "29.7.0",
-        "concurrently": "9.1.0",
+        "concurrently": "9.0.1",
         "cross-env": "7.0.3",
         "cssnano": "7.0.6",
         "date-fns": "3.6.0",
-        "eslint": "9.15.0",
+        "eslint": "9.13.0",
         "eslint-config-prettier": "9.1.0",
         "eslint-plugin-prettier": "5.2.1",
         "eslint-plugin-unicorn": "56.0.1",
@@ -2222,18 +2222,18 @@
       }
     },
     "node_modules/@eslint-community/regexpp": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
-      "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+      "version": "4.11.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
+      "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
       "dev": true,
       "engines": {
         "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
       }
     },
     "node_modules/@eslint/config-array": {
-      "version": "0.19.0",
-      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz",
-      "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==",
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
+      "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
       "dev": true,
       "dependencies": {
         "@eslint/object-schema": "^2.1.4",
@@ -2257,18 +2257,18 @@
       }
     },
     "node_modules/@eslint/core": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz",
-      "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==",
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz",
+      "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==",
       "dev": true,
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
-      "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
+      "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
@@ -2331,9 +2331,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.15.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz",
-      "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==",
+      "version": "9.13.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz",
+      "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==",
       "dev": true,
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2349,9 +2349,9 @@
       }
     },
     "node_modules/@eslint/plugin-kit": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz",
-      "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==",
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz",
+      "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==",
       "dev": true,
       "dependencies": {
         "levn": "^0.4.1"
@@ -2403,40 +2403,27 @@
       }
     },
     "node_modules/@humanfs/core": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
-      "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+      "version": "0.19.0",
+      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz",
+      "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==",
       "dev": true,
       "engines": {
         "node": ">=18.18.0"
       }
     },
     "node_modules/@humanfs/node": {
-      "version": "0.16.6",
-      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
-      "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+      "version": "0.16.5",
+      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz",
+      "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==",
       "dev": true,
       "dependencies": {
-        "@humanfs/core": "^0.19.1",
+        "@humanfs/core": "^0.19.0",
         "@humanwhocodes/retry": "^0.3.0"
       },
       "engines": {
         "node": ">=18.18.0"
       }
     },
-    "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
-      "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
-      "dev": true,
-      "engines": {
-        "node": ">=18.18"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/nzakas"
-      }
-    },
     "node_modules/@humanwhocodes/module-importer": {
       "version": "1.0.1",
       "dev": true,
@@ -2450,9 +2437,9 @@
       }
     },
     "node_modules/@humanwhocodes/retry": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
-      "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+      "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
       "dev": true,
       "engines": {
         "node": ">=18.18"
@@ -3493,9 +3480,9 @@
       }
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.3.tgz",
-      "integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz",
+      "integrity": "sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==",
       "cpu": [
         "arm"
       ],
@@ -3505,9 +3492,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.3.tgz",
-      "integrity": "sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz",
+      "integrity": "sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==",
       "cpu": [
         "arm64"
       ],
@@ -3517,9 +3504,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz",
-      "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz",
+      "integrity": "sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w==",
       "cpu": [
         "arm64"
       ],
@@ -3529,9 +3516,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.3.tgz",
-      "integrity": "sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz",
+      "integrity": "sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==",
       "cpu": [
         "x64"
       ],
@@ -3541,9 +3528,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.3.tgz",
-      "integrity": "sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz",
+      "integrity": "sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==",
       "cpu": [
         "arm64"
       ],
@@ -3553,9 +3540,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.3.tgz",
-      "integrity": "sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz",
+      "integrity": "sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==",
       "cpu": [
         "x64"
       ],
@@ -3565,9 +3552,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.3.tgz",
-      "integrity": "sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz",
+      "integrity": "sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==",
       "cpu": [
         "arm"
       ],
@@ -3577,9 +3564,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.3.tgz",
-      "integrity": "sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz",
+      "integrity": "sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==",
       "cpu": [
         "arm"
       ],
@@ -3589,9 +3576,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.3.tgz",
-      "integrity": "sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz",
+      "integrity": "sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==",
       "cpu": [
         "arm64"
       ],
@@ -3601,9 +3588,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.3.tgz",
-      "integrity": "sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz",
+      "integrity": "sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==",
       "cpu": [
         "arm64"
       ],
@@ -3613,9 +3600,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.3.tgz",
-      "integrity": "sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz",
+      "integrity": "sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==",
       "cpu": [
         "ppc64"
       ],
@@ -3625,9 +3612,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.3.tgz",
-      "integrity": "sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz",
+      "integrity": "sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==",
       "cpu": [
         "riscv64"
       ],
@@ -3637,9 +3624,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.3.tgz",
-      "integrity": "sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz",
+      "integrity": "sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==",
       "cpu": [
         "s390x"
       ],
@@ -3649,9 +3636,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz",
-      "integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz",
+      "integrity": "sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==",
       "cpu": [
         "x64"
       ],
@@ -3661,9 +3648,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.3.tgz",
-      "integrity": "sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz",
+      "integrity": "sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==",
       "cpu": [
         "x64"
       ],
@@ -3673,9 +3660,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.3.tgz",
-      "integrity": "sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz",
+      "integrity": "sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==",
       "cpu": [
         "arm64"
       ],
@@ -3685,9 +3672,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.3.tgz",
-      "integrity": "sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz",
+      "integrity": "sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==",
       "cpu": [
         "ia32"
       ],
@@ -3697,9 +3684,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.3.tgz",
-      "integrity": "sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz",
+      "integrity": "sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==",
       "cpu": [
         "x64"
       ],
@@ -4677,9 +4664,9 @@
       }
     },
     "node_modules/concurrently": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.0.tgz",
-      "integrity": "sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg==",
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.1.tgz",
+      "integrity": "sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.1.2",
@@ -5535,31 +5522,31 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.15.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz",
-      "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==",
+      "version": "9.13.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz",
+      "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
-        "@eslint-community/regexpp": "^4.12.1",
-        "@eslint/config-array": "^0.19.0",
-        "@eslint/core": "^0.9.0",
-        "@eslint/eslintrc": "^3.2.0",
-        "@eslint/js": "9.15.0",
-        "@eslint/plugin-kit": "^0.2.3",
-        "@humanfs/node": "^0.16.6",
+        "@eslint-community/regexpp": "^4.11.0",
+        "@eslint/config-array": "^0.18.0",
+        "@eslint/core": "^0.7.0",
+        "@eslint/eslintrc": "^3.1.0",
+        "@eslint/js": "9.13.0",
+        "@eslint/plugin-kit": "^0.2.0",
+        "@humanfs/node": "^0.16.5",
         "@humanwhocodes/module-importer": "^1.0.1",
-        "@humanwhocodes/retry": "^0.4.1",
+        "@humanwhocodes/retry": "^0.3.1",
         "@types/estree": "^1.0.6",
         "@types/json-schema": "^7.0.15",
         "ajv": "^6.12.4",
         "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.5",
+        "cross-spawn": "^7.0.2",
         "debug": "^4.3.2",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^8.2.0",
-        "eslint-visitor-keys": "^4.2.0",
-        "espree": "^10.3.0",
+        "eslint-scope": "^8.1.0",
+        "eslint-visitor-keys": "^4.1.0",
+        "espree": "^10.2.0",
         "esquery": "^1.5.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -5573,7 +5560,8 @@
         "lodash.merge": "^4.6.2",
         "minimatch": "^3.1.2",
         "natural-compare": "^1.4.0",
-        "optionator": "^0.9.3"
+        "optionator": "^0.9.3",
+        "text-table": "^0.2.0"
       },
       "bin": {
         "eslint": "bin/eslint.js"
@@ -5793,9 +5781,9 @@
       }
     },
     "node_modules/eslint/node_modules/eslint-scope": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
-      "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz",
+      "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==",
       "dev": true,
       "dependencies": {
         "esrecurse": "^4.3.0",
@@ -5809,9 +5797,9 @@
       }
     },
     "node_modules/eslint/node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz",
+      "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==",
       "dev": true,
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5975,14 +5963,14 @@
       }
     },
     "node_modules/espree": {
-      "version": "10.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
-      "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz",
+      "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==",
       "dev": true,
       "dependencies": {
-        "acorn": "^8.14.0",
+        "acorn": "^8.12.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^4.2.0"
+        "eslint-visitor-keys": "^4.1.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5992,9 +5980,9 @@
       }
     },
     "node_modules/espree/node_modules/acorn": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
-      "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+      "version": "8.12.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz",
+      "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==",
       "dev": true,
       "bin": {
         "acorn": "bin/acorn"
@@ -6004,9 +5992,9 @@
       }
     },
     "node_modules/espree/node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz",
+      "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==",
       "dev": true,
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11429,9 +11417,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.3.tgz",
-      "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.3.tgz",
+      "integrity": "sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==",
       "dependencies": {
         "@types/estree": "1.0.6"
       },
@@ -11443,24 +11431,24 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.27.3",
-        "@rollup/rollup-android-arm64": "4.27.3",
-        "@rollup/rollup-darwin-arm64": "4.27.3",
-        "@rollup/rollup-darwin-x64": "4.27.3",
-        "@rollup/rollup-freebsd-arm64": "4.27.3",
-        "@rollup/rollup-freebsd-x64": "4.27.3",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.27.3",
-        "@rollup/rollup-linux-arm-musleabihf": "4.27.3",
-        "@rollup/rollup-linux-arm64-gnu": "4.27.3",
-        "@rollup/rollup-linux-arm64-musl": "4.27.3",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.27.3",
-        "@rollup/rollup-linux-riscv64-gnu": "4.27.3",
-        "@rollup/rollup-linux-s390x-gnu": "4.27.3",
-        "@rollup/rollup-linux-x64-gnu": "4.27.3",
-        "@rollup/rollup-linux-x64-musl": "4.27.3",
-        "@rollup/rollup-win32-arm64-msvc": "4.27.3",
-        "@rollup/rollup-win32-ia32-msvc": "4.27.3",
-        "@rollup/rollup-win32-x64-msvc": "4.27.3",
+        "@rollup/rollup-android-arm-eabi": "4.24.3",
+        "@rollup/rollup-android-arm64": "4.24.3",
+        "@rollup/rollup-darwin-arm64": "4.24.3",
+        "@rollup/rollup-darwin-x64": "4.24.3",
+        "@rollup/rollup-freebsd-arm64": "4.24.3",
+        "@rollup/rollup-freebsd-x64": "4.24.3",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.24.3",
+        "@rollup/rollup-linux-arm-musleabihf": "4.24.3",
+        "@rollup/rollup-linux-arm64-gnu": "4.24.3",
+        "@rollup/rollup-linux-arm64-musl": "4.24.3",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.24.3",
+        "@rollup/rollup-linux-riscv64-gnu": "4.24.3",
+        "@rollup/rollup-linux-s390x-gnu": "4.24.3",
+        "@rollup/rollup-linux-x64-gnu": "4.24.3",
+        "@rollup/rollup-linux-x64-musl": "4.24.3",
+        "@rollup/rollup-win32-arm64-msvc": "4.24.3",
+        "@rollup/rollup-win32-ia32-msvc": "4.24.3",
+        "@rollup/rollup-win32-x64-msvc": "4.24.3",
         "fsevents": "~2.3.2"
       }
     },
@@ -12808,6 +12796,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/text-table": {
+      "version": "0.2.0",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/thenify": {
       "version": "3.3.1",
       "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -14713,15 +14706,15 @@
       }
     },
     "@eslint-community/regexpp": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
-      "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+      "version": "4.11.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
+      "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
       "dev": true
     },
     "@eslint/config-array": {
-      "version": "0.19.0",
-      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz",
-      "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==",
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
+      "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
       "dev": true,
       "requires": {
         "@eslint/object-schema": "^2.1.4",
@@ -14741,15 +14734,15 @@
       }
     },
     "@eslint/core": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz",
-      "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==",
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz",
+      "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==",
       "dev": true
     },
     "@eslint/eslintrc": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
-      "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
+      "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
       "dev": true,
       "requires": {
         "ajv": "^6.12.4",
@@ -14796,9 +14789,9 @@
       }
     },
     "@eslint/js": {
-      "version": "9.15.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz",
-      "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==",
+      "version": "9.13.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz",
+      "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==",
       "dev": true
     },
     "@eslint/object-schema": {
@@ -14808,9 +14801,9 @@
       "dev": true
     },
     "@eslint/plugin-kit": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz",
-      "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==",
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz",
+      "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==",
       "dev": true,
       "requires": {
         "levn": "^0.4.1"
@@ -14849,27 +14842,19 @@
       "integrity": "sha512-l3BiQRkD7qrnQv6ms6sqPLczvwbQpXt5iAVwjDvX0iumrz6yEonQkNAzNjeDX25/OJMFDTxpHjkJZHGpM9ikWw=="
     },
     "@humanfs/core": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
-      "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+      "version": "0.19.0",
+      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz",
+      "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==",
       "dev": true
     },
     "@humanfs/node": {
-      "version": "0.16.6",
-      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
-      "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+      "version": "0.16.5",
+      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz",
+      "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==",
       "dev": true,
       "requires": {
-        "@humanfs/core": "^0.19.1",
+        "@humanfs/core": "^0.19.0",
         "@humanwhocodes/retry": "^0.3.0"
-      },
-      "dependencies": {
-        "@humanwhocodes/retry": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
-          "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
-          "dev": true
-        }
       }
     },
     "@humanwhocodes/module-importer": {
@@ -14877,9 +14862,9 @@
       "dev": true
     },
     "@humanwhocodes/retry": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
-      "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+      "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
       "dev": true
     },
     "@isaacs/cliui": {
@@ -15589,111 +15574,111 @@
       }
     },
     "@rollup/rollup-android-arm-eabi": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.3.tgz",
-      "integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz",
+      "integrity": "sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==",
       "optional": true
     },
     "@rollup/rollup-android-arm64": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.3.tgz",
-      "integrity": "sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz",
+      "integrity": "sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==",
       "optional": true
     },
     "@rollup/rollup-darwin-arm64": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz",
-      "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz",
+      "integrity": "sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w==",
       "optional": true
     },
     "@rollup/rollup-darwin-x64": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.3.tgz",
-      "integrity": "sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz",
+      "integrity": "sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==",
       "optional": true
     },
     "@rollup/rollup-freebsd-arm64": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.3.tgz",
-      "integrity": "sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz",
+      "integrity": "sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==",
       "optional": true
     },
     "@rollup/rollup-freebsd-x64": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.3.tgz",
-      "integrity": "sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz",
+      "integrity": "sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==",
       "optional": true
     },
     "@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.3.tgz",
-      "integrity": "sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz",
+      "integrity": "sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==",
       "optional": true
     },
     "@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.3.tgz",
-      "integrity": "sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz",
+      "integrity": "sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==",
       "optional": true
     },
     "@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.3.tgz",
-      "integrity": "sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz",
+      "integrity": "sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==",
       "optional": true
     },
     "@rollup/rollup-linux-arm64-musl": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.3.tgz",
-      "integrity": "sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz",
+      "integrity": "sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==",
       "optional": true
     },
     "@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.3.tgz",
-      "integrity": "sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz",
+      "integrity": "sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==",
       "optional": true
     },
     "@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.3.tgz",
-      "integrity": "sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz",
+      "integrity": "sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==",
       "optional": true
     },
     "@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.3.tgz",
-      "integrity": "sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz",
+      "integrity": "sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==",
       "optional": true
     },
     "@rollup/rollup-linux-x64-gnu": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz",
-      "integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz",
+      "integrity": "sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==",
       "optional": true
     },
     "@rollup/rollup-linux-x64-musl": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.3.tgz",
-      "integrity": "sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz",
+      "integrity": "sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==",
       "optional": true
     },
     "@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.3.tgz",
-      "integrity": "sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz",
+      "integrity": "sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==",
       "optional": true
     },
     "@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.3.tgz",
-      "integrity": "sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz",
+      "integrity": "sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==",
       "optional": true
     },
     "@rollup/rollup-win32-x64-msvc": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.3.tgz",
-      "integrity": "sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz",
+      "integrity": "sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==",
       "optional": true
     },
     "@sinclair/typebox": {
@@ -16350,9 +16335,9 @@
       }
     },
     "concurrently": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.0.tgz",
-      "integrity": "sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg==",
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.1.tgz",
+      "integrity": "sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==",
       "dev": true,
       "requires": {
         "chalk": "^4.1.2",
@@ -16923,31 +16908,31 @@
       }
     },
     "eslint": {
-      "version": "9.15.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz",
-      "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==",
+      "version": "9.13.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz",
+      "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==",
       "dev": true,
       "requires": {
         "@eslint-community/eslint-utils": "^4.2.0",
-        "@eslint-community/regexpp": "^4.12.1",
-        "@eslint/config-array": "^0.19.0",
-        "@eslint/core": "^0.9.0",
-        "@eslint/eslintrc": "^3.2.0",
-        "@eslint/js": "9.15.0",
-        "@eslint/plugin-kit": "^0.2.3",
-        "@humanfs/node": "^0.16.6",
+        "@eslint-community/regexpp": "^4.11.0",
+        "@eslint/config-array": "^0.18.0",
+        "@eslint/core": "^0.7.0",
+        "@eslint/eslintrc": "^3.1.0",
+        "@eslint/js": "9.13.0",
+        "@eslint/plugin-kit": "^0.2.0",
+        "@humanfs/node": "^0.16.5",
         "@humanwhocodes/module-importer": "^1.0.1",
-        "@humanwhocodes/retry": "^0.4.1",
+        "@humanwhocodes/retry": "^0.3.1",
         "@types/estree": "^1.0.6",
         "@types/json-schema": "^7.0.15",
         "ajv": "^6.12.4",
         "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.5",
+        "cross-spawn": "^7.0.2",
         "debug": "^4.3.2",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^8.2.0",
-        "eslint-visitor-keys": "^4.2.0",
-        "espree": "^10.3.0",
+        "eslint-scope": "^8.1.0",
+        "eslint-visitor-keys": "^4.1.0",
+        "espree": "^10.2.0",
         "esquery": "^1.5.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -16961,7 +16946,8 @@
         "lodash.merge": "^4.6.2",
         "minimatch": "^3.1.2",
         "natural-compare": "^1.4.0",
-        "optionator": "^0.9.3"
+        "optionator": "^0.9.3",
+        "text-table": "^0.2.0"
       },
       "dependencies": {
         "ansi-styles": {
@@ -16995,9 +16981,9 @@
           "dev": true
         },
         "eslint-scope": {
-          "version": "8.2.0",
-          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
-          "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz",
+          "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==",
           "dev": true,
           "requires": {
             "esrecurse": "^4.3.0",
@@ -17005,9 +16991,9 @@
           }
         },
         "eslint-visitor-keys": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-          "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz",
+          "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==",
           "dev": true
         },
         "estraverse": {
@@ -17184,26 +17170,26 @@
       "dev": true
     },
     "espree": {
-      "version": "10.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
-      "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz",
+      "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==",
       "dev": true,
       "requires": {
-        "acorn": "^8.14.0",
+        "acorn": "^8.12.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^4.2.0"
+        "eslint-visitor-keys": "^4.1.0"
       },
       "dependencies": {
         "acorn": {
-          "version": "8.14.0",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
-          "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+          "version": "8.12.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz",
+          "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==",
           "dev": true
         },
         "eslint-visitor-keys": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-          "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz",
+          "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==",
           "dev": true
         }
       }
@@ -20795,28 +20781,28 @@
       }
     },
     "rollup": {
-      "version": "4.27.3",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.3.tgz",
-      "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==",
-      "requires": {
-        "@rollup/rollup-android-arm-eabi": "4.27.3",
-        "@rollup/rollup-android-arm64": "4.27.3",
-        "@rollup/rollup-darwin-arm64": "4.27.3",
-        "@rollup/rollup-darwin-x64": "4.27.3",
-        "@rollup/rollup-freebsd-arm64": "4.27.3",
-        "@rollup/rollup-freebsd-x64": "4.27.3",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.27.3",
-        "@rollup/rollup-linux-arm-musleabihf": "4.27.3",
-        "@rollup/rollup-linux-arm64-gnu": "4.27.3",
-        "@rollup/rollup-linux-arm64-musl": "4.27.3",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.27.3",
-        "@rollup/rollup-linux-riscv64-gnu": "4.27.3",
-        "@rollup/rollup-linux-s390x-gnu": "4.27.3",
-        "@rollup/rollup-linux-x64-gnu": "4.27.3",
-        "@rollup/rollup-linux-x64-musl": "4.27.3",
-        "@rollup/rollup-win32-arm64-msvc": "4.27.3",
-        "@rollup/rollup-win32-ia32-msvc": "4.27.3",
-        "@rollup/rollup-win32-x64-msvc": "4.27.3",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.3.tgz",
+      "integrity": "sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==",
+      "requires": {
+        "@rollup/rollup-android-arm-eabi": "4.24.3",
+        "@rollup/rollup-android-arm64": "4.24.3",
+        "@rollup/rollup-darwin-arm64": "4.24.3",
+        "@rollup/rollup-darwin-x64": "4.24.3",
+        "@rollup/rollup-freebsd-arm64": "4.24.3",
+        "@rollup/rollup-freebsd-x64": "4.24.3",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.24.3",
+        "@rollup/rollup-linux-arm-musleabihf": "4.24.3",
+        "@rollup/rollup-linux-arm64-gnu": "4.24.3",
+        "@rollup/rollup-linux-arm64-musl": "4.24.3",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.24.3",
+        "@rollup/rollup-linux-riscv64-gnu": "4.24.3",
+        "@rollup/rollup-linux-s390x-gnu": "4.24.3",
+        "@rollup/rollup-linux-x64-gnu": "4.24.3",
+        "@rollup/rollup-linux-x64-musl": "4.24.3",
+        "@rollup/rollup-win32-arm64-msvc": "4.24.3",
+        "@rollup/rollup-win32-ia32-msvc": "4.24.3",
+        "@rollup/rollup-win32-x64-msvc": "4.24.3",
         "@types/estree": "1.0.6",
         "fsevents": "~2.3.2"
       }
@@ -21707,6 +21693,10 @@
         "minimatch": "^3.0.4"
       }
     },
+    "text-table": {
+      "version": "0.2.0",
+      "dev": true
+    },
     "thenify": {
       "version": "3.3.1",
       "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
diff --git a/package.json b/package.json
index 7c3f0e728..afe220bbb 100644
--- a/package.json
+++ b/package.json
@@ -52,7 +52,7 @@
     "less-plugin-clean-css": "1.6.0",
     "lint-staged": "15.2.10",
     "rimraf": "6.0.1",
-    "rollup": "4.27.3",
+    "rollup": "4.24.3",
     "rollup-plugin-esbuild": "6.1.1",
     "rollup-plugin-postcss": "4.0.2",
     "timepicker": "1.14.1",
@@ -63,15 +63,15 @@
     "@babel/eslint-parser": "7.25.9",
     "@babel/plugin-syntax-dynamic-import": "7.8.3",
     "@babel/preset-env": "7.26.0",
-    "@eslint/js": "9.15.0",
+    "@eslint/js": "9.13.0",
     "@types/jest": "29.5.14",
     "autoprefixer": "10.4.20",
     "babel-jest": "29.7.0",
-    "concurrently": "9.1.0",
+    "concurrently": "9.0.1",
     "cross-env": "7.0.3",
     "cssnano": "7.0.6",
     "date-fns": "3.6.0",
-    "eslint": "9.15.0",
+    "eslint": "9.13.0",
     "eslint-config-prettier": "9.1.0",
     "eslint-plugin-prettier": "5.2.1",
     "eslint-plugin-unicorn": "56.0.1",
diff --git a/pom.xml b/pom.xml
index 625625563..66d1da355 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,14 +5,14 @@
 
   <groupId>org.synyx</groupId>
   <artifactId>urlaubsverwaltung</artifactId>
-  <version>5.10.0-SNAPSHOT</version>
+  <version>5.9.0-SNAPSHOT</version>
 
   <name>Urlaubsverwaltung</name>
 
   <parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
-    <version>3.3.6</version>
+    <version>3.4.0</version>
   </parent>
 
   <properties>
@@ -137,7 +137,7 @@
     <dependency>
       <groupId>net.javacrumbs.shedlock</groupId>
       <artifactId>shedlock-provider-jdbc-template</artifactId>
-      <version>6.0.1</version>
+      <version>5.16.0</version>
     </dependency>
 
     <!-- MAIL -->
@@ -292,7 +292,7 @@
     <dependency>
       <groupId>com.microsoft.playwright</groupId>
       <artifactId>playwright</artifactId>
-      <version>1.49.0</version>
+      <version>1.48.0</version>
       <scope>test</scope>
     </dependency>
   </dependencies>
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/application/specialleave/SpecialLeaveSettingsService.java b/src/main/java/org/synyx/urlaubsverwaltung/application/specialleave/SpecialLeaveSettingsService.java
index cb4a551e6..d60574c4a 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/application/specialleave/SpecialLeaveSettingsService.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/application/specialleave/SpecialLeaveSettingsService.java
@@ -63,12 +63,12 @@ public class SpecialLeaveSettingsService {
         final long count = specialLeaveSettingsRepository.count();
         if (count == 0) {
 
-            final SpecialLeaveSettingsEntity ownWedding = createSpecialLeaveEntity(1L, 1, true, "application.data.specialleave.own_wedding");
-            final SpecialLeaveSettingsEntity birthOfChild = createSpecialLeaveEntity(2L, 1, true, "application.data.specialleave.birth_of_child");
-            final SpecialLeaveSettingsEntity deathOfChild = createSpecialLeaveEntity(3L, 2, true, "application.data.specialleave.death_of_child");
-            final SpecialLeaveSettingsEntity deathOfParent = createSpecialLeaveEntity(4L, 1, true, "application.data.specialleave.death_of_parent");
-            final SpecialLeaveSettingsEntity seriousIllnessFamilyMember = createSpecialLeaveEntity(5L, 1, true, "application.data.specialleave.serious_illness_familiy_member");
-            final SpecialLeaveSettingsEntity relocationForBusinessReason = createSpecialLeaveEntity(6L, 1, true, "application.data.specialleave.relocation_for_business_reason");
+            final SpecialLeaveSettingsEntity ownWedding = createSpecialLeaveEntity(1, true, "application.data.specialleave.own_wedding");
+            final SpecialLeaveSettingsEntity birthOfChild = createSpecialLeaveEntity(1, true, "application.data.specialleave.birth_of_child");
+            final SpecialLeaveSettingsEntity deathOfChild = createSpecialLeaveEntity(2, true, "application.data.specialleave.death_of_child");
+            final SpecialLeaveSettingsEntity deathOfParent = createSpecialLeaveEntity(1, true, "application.data.specialleave.death_of_parent");
+            final SpecialLeaveSettingsEntity seriousIllnessFamilyMember = createSpecialLeaveEntity(1, true, "application.data.specialleave.serious_illness_familiy_member");
+            final SpecialLeaveSettingsEntity relocationForBusinessReason = createSpecialLeaveEntity(1, true, "application.data.specialleave.relocation_for_business_reason");
 
             final List<SpecialLeaveSettingsEntity> vacationTypes = List.of(ownWedding, birthOfChild, deathOfChild, deathOfParent, seriousIllnessFamilyMember, relocationForBusinessReason);
             final List<SpecialLeaveSettingsEntity> savesVacationTypes = specialLeaveSettingsRepository.saveAll(vacationTypes);
@@ -76,9 +76,8 @@ public class SpecialLeaveSettingsService {
         }
     }
 
-    private static SpecialLeaveSettingsEntity createSpecialLeaveEntity(Long id, int days, boolean active, String messageKey) {
+    private static SpecialLeaveSettingsEntity createSpecialLeaveEntity(int days, boolean active, String messageKey) {
         final SpecialLeaveSettingsEntity specialLeaveSettingsEntity = new SpecialLeaveSettingsEntity();
-        specialLeaveSettingsEntity.setId(id);
         specialLeaveSettingsEntity.setDays(days);
         specialLeaveSettingsEntity.setActive(active);
         specialLeaveSettingsEntity.setMessageKey(messageKey);
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/calendar/CompanyCalendar.java b/src/main/java/org/synyx/urlaubsverwaltung/calendar/CompanyCalendar.java
index 8f17d4b81..43bf6c666 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/calendar/CompanyCalendar.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/calendar/CompanyCalendar.java
@@ -63,7 +63,7 @@ class CompanyCalendar {
     }
 
     public void generateSecret() {
-        secret = RandomStringUtils.randomAlphanumeric(SECRET_LENGTH);
+        secret = RandomStringUtils.secure().nextAlphanumeric(SECRET_LENGTH);
     }
 
     public String getSecret() {
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/calendar/DepartmentCalendar.java b/src/main/java/org/synyx/urlaubsverwaltung/calendar/DepartmentCalendar.java
index 204826265..44b7eafed 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/calendar/DepartmentCalendar.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/calendar/DepartmentCalendar.java
@@ -81,7 +81,7 @@ class DepartmentCalendar {
     }
 
     public void generateSecret() {
-        secret = RandomStringUtils.randomAlphanumeric(SECRET_LENGTH);
+        secret = RandomStringUtils.secure().nextAlphanumeric(SECRET_LENGTH);
     }
 
     public String getSecret() {
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/calendar/PersonCalendar.java b/src/main/java/org/synyx/urlaubsverwaltung/calendar/PersonCalendar.java
index 383668d92..5463b1aa5 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/calendar/PersonCalendar.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/calendar/PersonCalendar.java
@@ -65,7 +65,7 @@ class PersonCalendar {
     }
 
     public void generateSecret() {
-        secret = RandomStringUtils.randomAlphanumeric(SECRET_LENGTH);
+        secret = RandomStringUtils.secure().nextAlphanumeric(SECRET_LENGTH);
     }
 
     public String getSecret() {
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/config/SchedulerConfiguration.java b/src/main/java/org/synyx/urlaubsverwaltung/config/SchedulerConfiguration.java
index 900cdd935..2445eb267 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/config/SchedulerConfiguration.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/config/SchedulerConfiguration.java
@@ -3,7 +3,7 @@ package org.synyx.urlaubsverwaltung.config;
 import net.javacrumbs.shedlock.core.DefaultLockingTaskExecutor;
 import net.javacrumbs.shedlock.core.LockProvider;
 import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
-import org.springframework.boot.task.TaskSchedulerBuilder;
+import org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableScheduling;
@@ -26,7 +26,7 @@ class SchedulerConfiguration {
     }
 
     @Bean
-    ThreadPoolTaskScheduler taskScheduler(TaskSchedulerBuilder builder) {
+    ThreadPoolTaskScheduler taskScheduler(ThreadPoolTaskSchedulerBuilder builder) {
         return builder.build();
     }
 }
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/infobanner/InfoBannerConfigProperties.java b/src/main/java/org/synyx/urlaubsverwaltung/infobanner/InfoBannerConfigProperties.java
index 2239b4c4c..00ff9a1a4 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/infobanner/InfoBannerConfigProperties.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/infobanner/InfoBannerConfigProperties.java
@@ -1,13 +1,14 @@
 package org.synyx.urlaubsverwaltung.infobanner;
 
+import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.validation.annotation.Validated;
 
 @Validated
-@ConfigurationProperties(prefix = "uv.info-banner")
-public record InfoBannerConfigProperties(boolean enabled, @NotNull Text text) {
+@ConfigurationProperties("uv.info-banner")
+public record InfoBannerConfigProperties(boolean enabled, @NotNull @Valid Text text) {
 
     public record Text(@NotEmpty String de) {
     }
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/mail/MailProperties.java b/src/main/java/org/synyx/urlaubsverwaltung/mail/MailProperties.java
index 56db6c7d7..f79c70458 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/mail/MailProperties.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/mail/MailProperties.java
@@ -7,7 +7,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.validation.annotation.Validated;
 
 @Validated
-@ConfigurationProperties(prefix = "uv.mail")
+@ConfigurationProperties("uv.mail")
 public class MailProperties {
 
     @Email
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidayConfiguration.java b/src/main/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidayConfiguration.java
index 50f741c60..b7679c40b 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidayConfiguration.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidayConfiguration.java
@@ -5,11 +5,10 @@ import de.focus_shift.jollyday.core.ManagerParameters;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import java.net.URL;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.function.Function;
-
-import static java.util.stream.Collectors.toMap;
 
 @Configuration
 class PublicHolidayConfiguration {
@@ -18,8 +17,12 @@ class PublicHolidayConfiguration {
 
     @Bean
     Map<String, HolidayManager> holidayManagerMap() {
-        return COUNTRIES.stream()
-            .map(country -> HolidayManager.getInstance(ManagerParameters.create(country)))
-            .collect(toMap(holidayManager -> holidayManager.getManagerParameter().getDisplayName(), Function.identity()));
+        final Map<String, HolidayManager> countryMap = new HashMap<>();
+        COUNTRIES.forEach(country -> {
+            final ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            final URL url = cl.getResource("Holidays_" + country + ".xml");
+            countryMap.put(country, HolidayManager.getInstance(ManagerParameters.create(url)));
+        });
+        return countryMap;
     }
 }
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidaysServiceImpl.java b/src/main/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidaysServiceImpl.java
index 1f12380ee..9016447bc 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidaysServiceImpl.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidaysServiceImpl.java
@@ -5,21 +5,18 @@ import de.focus_shift.jollyday.core.HolidayManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.i18n.LocaleContextHolder;
 import org.springframework.stereotype.Service;
-import org.synyx.urlaubsverwaltung.absence.DateRange;
 import org.synyx.urlaubsverwaltung.period.DayLength;
 import org.synyx.urlaubsverwaltung.settings.SettingsService;
 import org.synyx.urlaubsverwaltung.workingtime.FederalState;
 import org.synyx.urlaubsverwaltung.workingtime.WorkingTimeSettings;
 
 import java.time.LocalDate;
-import java.time.Month;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 
-import static de.focus_shift.jollyday.core.HolidayType.PUBLIC_HOLIDAY;
 import static org.synyx.urlaubsverwaltung.period.DayLength.FULL;
 import static org.synyx.urlaubsverwaltung.period.DayLength.ZERO;
 import static org.synyx.urlaubsverwaltung.util.DateUtil.isChristmasEve;
@@ -39,10 +36,6 @@ public class PublicHolidaysServiceImpl implements PublicHolidaysService {
 
     @Override
     public boolean isPublicHoliday(LocalDate date, FederalState federalState) {
-        if (isChristmasEve(date) || isNewYearsEve(date)) {
-            return true;
-        }
-
         return getHolidayManager(federalState)
             .map(holidayManager -> holidayManager.isHoliday(date, federalState.getCodes()))
             .orElse(false);
@@ -87,27 +80,9 @@ public class PublicHolidaysServiceImpl implements PublicHolidaysService {
     }
 
     private Set<Holiday> getHolidays(final LocalDate from, final LocalDate to, FederalState federalState) {
-
-        final Set<Holiday> holidays = getHolidayManager(federalState)
-            .map(holidayManager -> holidayManager.getHolidays(from, to, PUBLIC_HOLIDAY, federalState.getCodes()))
+        return getHolidayManager(federalState)
+            .map(holidayManager -> holidayManager.getHolidays(from, to, federalState.getCodes()))
             .orElseGet(Set::of);
-
-        final DateRange requestRange = new DateRange(from, to);
-
-        int year = from.getYear();
-        while (year <= to.getYear()) {
-            final LocalDate christmas = LocalDate.of(year, Month.DECEMBER, 24);
-            if (requestRange.isOverlapping(new DateRange(christmas, christmas))) {
-                holidays.add(new Holiday(christmas, "CHRISTMAS_EVE", PUBLIC_HOLIDAY));
-            }
-            final LocalDate newYear = LocalDate.of(year, Month.DECEMBER, 31);
-            if (requestRange.isOverlapping(new DateRange(newYear, newYear))) {
-                holidays.add(new Holiday(newYear, "NEW_YEARS_EVE", PUBLIC_HOLIDAY));
-            }
-            year++;
-        }
-
-        return holidays;
     }
 
     private Optional<HolidayManager> getHolidayManager(FederalState federalState) {
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/security/oidc/RolesFromClaimMappersProperties.java b/src/main/java/org/synyx/urlaubsverwaltung/security/oidc/RolesFromClaimMappersProperties.java
index 071db7330..fa7598430 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/security/oidc/RolesFromClaimMappersProperties.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/security/oidc/RolesFromClaimMappersProperties.java
@@ -1,5 +1,6 @@
 package org.synyx.urlaubsverwaltung.security.oidc;
 
+import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -24,9 +25,11 @@ public class RolesFromClaimMappersProperties {
     @NotEmpty
     private String rolePrefix = "urlaubsverwaltung_";
 
+    @Valid
     @NotNull
     private ResourceAccessClaimMapperProperties resourceAccessClaim = new ResourceAccessClaimMapperProperties();
 
+    @Valid
     @NotNull
     private GroupClaimMapperProperties groupClaim = new GroupClaimMapperProperties();
 
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/settings/SettingsRepository.java b/src/main/java/org/synyx/urlaubsverwaltung/settings/SettingsRepository.java
index 258f973ad..0dbfccb55 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/settings/SettingsRepository.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/settings/SettingsRepository.java
@@ -2,9 +2,11 @@ package org.synyx.urlaubsverwaltung.settings;
 
 import org.springframework.data.repository.CrudRepository;
 
+import java.util.List;
 
 /**
  * Repository for {@link Settings} entities.
  */
 public interface SettingsRepository extends CrudRepository<Settings, Long> {
+    List<Settings> findAll();
 }
diff --git a/src/main/java/org/synyx/urlaubsverwaltung/settings/SettingsServiceImpl.java b/src/main/java/org/synyx/urlaubsverwaltung/settings/SettingsServiceImpl.java
index 2b5c8bb18..d78874251 100644
--- a/src/main/java/org/synyx/urlaubsverwaltung/settings/SettingsServiceImpl.java
+++ b/src/main/java/org/synyx/urlaubsverwaltung/settings/SettingsServiceImpl.java
@@ -31,11 +31,9 @@ public class SettingsServiceImpl implements SettingsService {
 
     @Override
     public Settings getSettings() {
-        return settingsRepository.findById(1L)
+        return settingsRepository.findAll().stream().findFirst()
             .orElseGet(() -> {
-                final Settings settings = new Settings();
-                settings.setId(1L);
-                final Settings savedSettings = settingsRepository.save(settings);
+                final Settings savedSettings = settingsRepository.save(new Settings());
                 LOG.info("Saved initial settings {}", savedSettings);
                 return savedSettings;
             });
diff --git a/src/main/resources/Holidays_at.xml b/src/main/resources/Holidays_at.xml
new file mode 100644
index 000000000..e2ec741d7
--- /dev/null
+++ b/src/main/resources/Holidays_at.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration hierarchy="at" description="Austria"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
+    <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+    <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+    <Fixed month="OCTOBER" day="26" descriptionPropertiesKey="NATIONAL_DAY"/>
+    <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+    <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS"/>
+    <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+    <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER"/>
+    <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    <ChristianHoliday type="ASCENSION_DAY" descriptionPropertiesKey="christian.ASCENSION_DAY"/>
+    <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+  </Holidays>
+
+  <SubConfigurations hierarchy="1" description="Burgenland">
+    <Holidays>
+      <Fixed month="NOVEMBER" day="11" descriptionPropertiesKey="MARTINS_DAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="2" description="Kärnten">
+    <Holidays>
+      <Fixed month="MARCH" day="19" descriptionPropertiesKey="JOSEFS_DAY"/>
+      <Fixed month="OCTOBER" day="10" descriptionPropertiesKey="PLEBISCITE"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="3" description="Niederösterreich">
+    <Holidays>
+      <Fixed month="NOVEMBER" day="15" descriptionPropertiesKey="LEOPOLD"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="4" description="Oberösterreich">
+    <Holidays>
+      <Fixed month="MAY" day="4" descriptionPropertiesKey="FLORIAN"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="5" description="Salzburg">
+    <Holidays>
+      <Fixed month="SEPTEMBER" day="24" descriptionPropertiesKey="RUPERT"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="6" description="Steiermark">
+    <Holidays>
+      <Fixed month="MARCH" day="19" descriptionPropertiesKey="JOSEFS_DAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="7" description="Tirol">
+    <Holidays>
+      <Fixed month="MARCH" day="19" descriptionPropertiesKey="JOSEFS_DAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="8" description="Vorarlberg">
+    <Holidays>
+      <Fixed month="MARCH" day="19" descriptionPropertiesKey="JOSEFS_DAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="9" description="Wien">
+    <Holidays>
+      <Fixed month="NOVEMBER" day="15" descriptionPropertiesKey="LEOPOLD"/>
+    </Holidays>
+  </SubConfigurations>
+</Configuration>
diff --git a/src/main/resources/Holidays_be.xml b/src/main/resources/Holidays_be.xml
new file mode 100644
index 000000000..be4f39623
--- /dev/null
+++ b/src/main/resources/Holidays_be.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<Configuration hierarchy="be" description="Belgium"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+    <Fixed month="JULY" day="21" descriptionPropertiesKey="NATIONAL_DAY"/>
+    <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+    <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+    <Fixed month="NOVEMBER" day="11" descriptionPropertiesKey="ARMISTICE"/>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS"/>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+    <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER"/>
+    <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    <ChristianHoliday type="ASCENSION_DAY" descriptionPropertiesKey="christian.ASCENSION_DAY"/>
+    <ChristianHoliday type="PENTECOST" descriptionPropertiesKey="christian.PENTECOST"/>
+    <ChristianHoliday type="PENTECOST_MONDAY" descriptionPropertiesKey="christian.PENTECOST_MONDAY"/>
+  </Holidays>
+</Configuration>
diff --git a/src/main/resources/Holidays_ch.xml b/src/main/resources/Holidays_ch.xml
new file mode 100644
index 000000000..fd7df70a7
--- /dev/null
+++ b/src/main/resources/Holidays_ch.xml
@@ -0,0 +1,315 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration hierarchy="ch" description="Switzerland"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="AUGUST" day="1" descriptionPropertiesKey="NATIONAL_DAY"/>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS"/>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+    <ChristianHoliday type="ASCENSION_DAY" descriptionPropertiesKey="christian.ASCENSION_DAY"/>
+    <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER"/>
+  </Holidays>
+
+  <SubConfigurations hierarchy="ag" description="Aargau">
+    <Holidays>
+      <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ai" description="Appenzell Innerrhoden">
+    <Holidays>
+      <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ar" description="Appenzell Ausserrhoden">
+    <Holidays>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="be" description="Bern">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="bl" description="Basel-Landschaft">
+    <Holidays>
+      <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="bs" description="Basel-Stadt">
+    <Holidays>
+      <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="fr" description="Freiburg">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ge" description="Genf">
+    <Holidays>
+      <RelativeToWeekdayInMonth weekday="THURSDAY" when="AFTER" descriptionPropertiesKey="GENEVAN_FAST">
+        <FixedWeekday which="FIRST" weekday="SUNDAY" month="SEPTEMBER"/>
+      </RelativeToWeekdayInMonth>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="gl" description="Glarus">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="gr" description="Graubünden">
+    <Holidays>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ju" description="Jura">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="lu" description="Luzern">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ne" description="Neuenburg">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="nw" description="Nidwalden">
+    <Holidays>
+      <Fixed month="MARCH" day="19" descriptionPropertiesKey="ST_JOSEPH"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ow" description="Obwalden">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="sg" description="St.Gallen">
+    <Holidays>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="sh" description="Schaffhausen">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="so" description="Solothurn">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="sz" description="Schwyz">
+    <Holidays>
+      <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
+      <Fixed month="MARCH" day="19" descriptionPropertiesKey="ST_JOSEPH"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="tg" description="Thurgau">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ti" description="Tessin">
+    <Holidays>
+      <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
+      <Fixed month="MARCH" day="19" descriptionPropertiesKey="ST_JOSEPH"/>
+      <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ur" description="Uri">
+    <Holidays>
+      <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
+      <Fixed month="MARCH" day="19" descriptionPropertiesKey="ST_JOSEPH"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="vd" description="Waadt">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <RelativeToWeekdayInMonth weekday="MONDAY" when="AFTER"
+                                descriptionPropertiesKey="FEDERAL_DAY_THANKSGIVING_MON">
+        <FixedWeekday which="THIRD" weekday="SUNDAY" month="SEPTEMBER"/>
+      </RelativeToWeekdayInMonth>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="vs" description="Wallis">
+    <Holidays>
+      <Fixed month="MARCH" day="19" descriptionPropertiesKey="ST_JOSEPH"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="zg" description="Zug">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="zh" description="Zürich">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
+      <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+</Configuration>
diff --git a/src/main/resources/Holidays_de.xml b/src/main/resources/Holidays_de.xml
new file mode 100644
index 000000000..45c63c6b1
--- /dev/null
+++ b/src/main/resources/Holidays_de.xml
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration hierarchy="de" description="Germany"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+    <Fixed month="JUNE" day="17" validFrom="1954" validTo="1990" descriptionPropertiesKey="UNIFICATION"/>
+    <Fixed month="OCTOBER" day="3" validFrom="1990" descriptionPropertiesKey="UNIFICATION_GERMANY"/>
+    <Fixed month="OCTOBER" day="31" validFrom="2017" validTo="2017" descriptionPropertiesKey="REFORMATION_DAY"/>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="FIRST_CHRISTMAS_DAY"/>
+    <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="SECOND_CHRISTMAS_DAY"/>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+
+    <RelativeToFixed validFrom="1934" validTo="1938" descriptionPropertiesKey="REPENTANCE_PRAYER">
+      <Weekday>WEDNESDAY</Weekday>
+      <When>BEFORE</When>
+      <Date month="NOVEMBER" day="23"/>
+    </RelativeToFixed>
+    <RelativeToFixed validFrom="1990" validTo="1994" descriptionPropertiesKey="REPENTANCE_PRAYER">
+      <Weekday>WEDNESDAY</Weekday>
+      <When>BEFORE</When>
+      <Date month="NOVEMBER" day="23"/>
+    </RelativeToFixed>
+
+    <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+    <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    <ChristianHoliday type="ASCENSION_DAY" descriptionPropertiesKey="christian.ASCENSION_DAY"/>
+    <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+  </Holidays>
+
+  <SubConfigurations hierarchy="be" description="Berlin">
+    <Holidays>
+      <Fixed month="MARCH" day="8" descriptionPropertiesKey="INTERNATIONAL_WOMAN" validFrom="2019"/>
+      <Fixed month="MAY" day="8" descriptionPropertiesKey="LIBERATION" validFrom="2020" validTo="2020"/>
+
+      <RelativeToFixed validFrom="1945" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="bb" description="Brandenburg">
+    <Holidays>
+      <Fixed month="OCTOBER" day="31" descriptionPropertiesKey="REFORMATION_DAY"/>
+      <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER"/>
+      <ChristianHoliday type="PENTECOST" descriptionPropertiesKey="christian.PENTECOST"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="bw" description="Baden-Württemberg">
+    <Holidays>
+      <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+
+      <RelativeToFixed validFrom="1945" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="by" description="Bavaria">
+    <Holidays>
+      <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+
+      <RelativeToFixed validFrom="1981" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+    <SubConfigurations hierarchy="mu" description="Munich">
+      <Holidays>
+        <Fixed day="15" month="AUGUST" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      </Holidays>
+    </SubConfigurations>
+    <SubConfigurations hierarchy="ag" description="Augsburg">
+      <Holidays>
+        <Fixed day="8" month="AUGUST" descriptionPropertiesKey="PEACE"/>
+        <Fixed day="15" month="AUGUST" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      </Holidays>
+    </SubConfigurations>
+    <SubConfigurations hierarchy="wu" description="Würzburg">
+      <Holidays>
+        <Fixed day="15" month="AUGUST" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      </Holidays>
+    </SubConfigurations>
+    <SubConfigurations hierarchy="re" description="Regensburg">
+      <Holidays>
+        <Fixed day="15" month="AUGUST" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      </Holidays>
+    </SubConfigurations>
+    <SubConfigurations hierarchy="in" description="Ingolstadt">
+      <Holidays>
+        <Fixed day="15" month="AUGUST" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+      </Holidays>
+    </SubConfigurations>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="he" description="Hessen">
+    <Holidays>
+      <RelativeToFixed validFrom="1945" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+
+      <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER"/>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+      <ChristianHoliday type="PENTECOST" descriptionPropertiesKey="christian.PENTECOST"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="mv" description="Mecklenburg-Vorpommern">
+    <Holidays>
+      <Fixed month="MARCH" day="8" descriptionPropertiesKey="INTERNATIONAL_WOMAN" validFrom="2023"/>
+      <Fixed month="OCTOBER" day="31" descriptionPropertiesKey="REFORMATION_DAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="nw" description="North Rhine-Westphalia">
+    <Holidays>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+
+      <RelativeToFixed validFrom="1945" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="rp" description="Rhineland-Palatinate">
+    <Holidays>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+
+      <RelativeToFixed validFrom="1945" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="sl" description="Saarland">
+    <Holidays>
+      <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+      <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+
+      <RelativeToFixed validFrom="1945" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="sn" description="Saxony">
+    <Holidays>
+      <Fixed month="OCTOBER" day="31" descriptionPropertiesKey="REFORMATION_DAY"/>
+
+      <RelativeToFixed validFrom="1995" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="st" description="Saxony-Anhalt">
+    <Holidays>
+      <Fixed month="OCTOBER" day="31" descriptionPropertiesKey="REFORMATION_DAY"/>
+      <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="th" description="Thuringia">
+    <Holidays>
+      <Fixed month="SEPTEMBER" day="20" descriptionPropertiesKey="CHILDRENS_DAY" validFrom="2019"/>
+      <Fixed month="OCTOBER" day="31" descriptionPropertiesKey="REFORMATION_DAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="sh" description="Schleswig-Holstein">
+    <Holidays>
+      <Fixed month="OCTOBER" day="31" descriptionPropertiesKey="REFORMATION_DAY" validFrom="2018"/>
+
+      <RelativeToFixed validFrom="1945" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="hh" description="Hamburg">
+    <Holidays>
+      <Fixed month="OCTOBER" day="31" descriptionPropertiesKey="REFORMATION_DAY" validFrom="2018"/>
+
+      <RelativeToFixed validFrom="1945" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="hb" description="Bremen">
+    <Holidays>
+      <Fixed month="OCTOBER" day="31" descriptionPropertiesKey="REFORMATION_DAY" validFrom="2018"/>
+
+      <RelativeToFixed validFrom="1945" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ni" description="Lower-Saxony">
+    <Holidays>
+      <Fixed month="OCTOBER" day="31" descriptionPropertiesKey="REFORMATION_DAY" validFrom="2018"/>
+
+      <RelativeToFixed validFrom="1945" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
+        <Weekday>WEDNESDAY</Weekday>
+        <When>BEFORE</When>
+        <Date month="NOVEMBER" day="23"/>
+      </RelativeToFixed>
+    </Holidays>
+  </SubConfigurations>
+</Configuration>
diff --git a/src/main/resources/Holidays_es.xml b/src/main/resources/Holidays_es.xml
new file mode 100644
index 000000000..34b111a37
--- /dev/null
+++ b/src/main/resources/Holidays_es.xml
@@ -0,0 +1,300 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<Configuration hierarchy="es" description="Spain"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+
+  <Holidays>
+    <Fixed month="JANUARY" day="1" validFrom="1967" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
+    <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+    <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY">
+      <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+    </Fixed>
+    <Fixed month="OCTOBER" day="12" descriptionPropertiesKey="NATIONAL_DAY"/>
+    <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+    <Fixed month="DECEMBER" day="6" validFrom="1978" descriptionPropertiesKey="CONSTITUTION_DAY"/>
+    <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="25" validTo="2021" descriptionPropertiesKey="CHRISTMAS"/>
+    <Fixed month="DECEMBER" day="25" validFrom="2023" descriptionPropertiesKey="CHRISTMAS"/>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+    <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+  </Holidays>
+
+  <Sources>
+    <Source>https://en.wikipedia.org/wiki/Public_holidays_in_Spain</Source>
+  </Sources>
+
+  <SubConfigurations hierarchy="an" description="Andalusia">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" validFrom="2023" validTo="2023" descriptionPropertiesKey="NEW_YEAR"/>
+      <Fixed month="FEBRUARY" day="28" descriptionPropertiesKey="REGIONAL"/> <!--Day of Andalucía-->
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ar" description="Aragon">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" validFrom="2023" validTo="2023" descriptionPropertiesKey="NEW_YEAR"/>
+      <Fixed month="MARCH" day="19" validFrom="2000" validTo="2014" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="APRIL" day="23" descriptionPropertiesKey="REGIONAL"> <!--Day of Aragón-->
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="as" description="Principality of Asturias">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" validFrom="2023" validTo="2023" descriptionPropertiesKey="NEW_YEAR"/>
+      <Fixed month="SEPTEMBER" day="8" descriptionPropertiesKey="REGIONAL"/> <!--Day of Asturias-->
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="cn" description="Canary Islands">
+    <Holidays>
+      <Fixed month="MAY" day="30" descriptionPropertiesKey="REGIONAL"/> <!--Day of the Canary Islands-->
+      <Fixed month="JULY" day="25" validFrom="2017" validTo="2017" descriptionPropertiesKey="SANTIAGO_APOSTOL"/>
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="cb" description="Cantabria">
+    <Holidays>
+      <Fixed month="JULY" day="28" descriptionPropertiesKey="REGIONAL"/> <!--Day of the Cantabrian Institutions-->
+      <Fixed month="SEPTEMBER" day="15" descriptionPropertiesKey="APARECIDA"/>
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="cl" description="Castile and León">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" validFrom="2023" validTo="2023" descriptionPropertiesKey="NEW_YEAR"/>
+      <Fixed month="MARCH" day="19" validFrom="2000" validTo="2014" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="APRIL" day="23" validTo="2022" descriptionPropertiesKey="REGIONAL"/> <!--Castile and León Day-->
+      <Fixed month="APRIL" day="23" validFrom="2024" descriptionPropertiesKey="REGIONAL"/> <!--Castile and León Day-->
+      <Fixed month="JULY" day="25" validFrom="2017" validTo="2017" descriptionPropertiesKey="SANTIAGO_APOSTOL"/>
+      <Fixed month="JULY" day="25" validFrom="2023" validTo="2023" descriptionPropertiesKey="SANTIAGO_APOSTOL"/>
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="cm" description="Castile-La Mancha">
+    <Holidays>
+      <Fixed month="MARCH" day="19" validFrom="2000" validTo="2015" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MARCH" day="19" validFrom="2020" validTo="2020" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MAY" day="31" descriptionPropertiesKey="REGIONAL"/> <!--Day of Castilla-La Mancha-->
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ct" description="Catalonia">
+    <Holidays>
+      <Fixed month="JUNE" day="24" descriptionPropertiesKey="ST_JOHN"/>
+      <Fixed month="SEPTEMBER" day="11" descriptionPropertiesKey="REGIONAL"/> <!--National Day of Catalonia-->
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="BOXING_DAY"/>
+      <ChristianHoliday type="WHIT_MONDAY" validFrom="2022" validTo="2022"
+                        descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    </Holidays>
+
+    <SubConfigurations hierarchy="bcn" description="Barcelona">
+      <Holidays>
+        <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+      </Holidays>
+    </SubConfigurations>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ce" description="Ceuta">
+    <Holidays>
+      <Fixed month="SEPTEMBER" day="2" descriptionPropertiesKey="REGIONAL"/>
+      <IslamicHoliday type="ID_UL_ADHA" validFrom="2010" descriptionPropertiesKey="islamic.ID_UL_ADHA"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ex" description="Extremadura">
+    <Holidays>
+      <Fixed month="FEBRUARY" day="2" validFrom="2023" validTo="2023"
+             descriptionPropertiesKey="CARNIVAL"/> <!--Carnival Tuesday-->
+      <Fixed month="MARCH" day="19" validFrom="2000" validTo="2014" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MARCH" day="19" validFrom="2017" validTo="2017" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MARCH" day="19" validFrom="2021" validTo="2021" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="SEPTEMBER" day="8" descriptionPropertiesKey="REGIONAL"/> <!--Day of Extremadura-->
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ga" description="Galicia">
+    <Holidays>
+      <Fixed month="MARCH" day="19" validFrom="2000" validTo="2014" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MARCH" day="19" validFrom="2018" validTo="2021" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MAY" day="17" descriptionPropertiesKey="GALICIAN_LITERATURE"/>
+      <Fixed month="JULY" day="25" validFrom="2017" validTo="2020" descriptionPropertiesKey="SANTIAGO_APOSTOL"/>
+      <Fixed month="JULY" day="25" validFrom="2022" validTo="2027" descriptionPropertiesKey="SANTIAGO_APOSTOL"/>
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ib" description="Balearic Island">
+    <Holidays>
+      <Fixed month="MARCH" day="1" descriptionPropertiesKey="REGIONAL"/> <!--Day of the Balearic Islands-->
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ri" description="La Rioja">
+    <Holidays>
+      <Fixed month="JUNE" day="9" descriptionPropertiesKey="REGIONAL"/> <!--Day of La Rioja-->
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="md" description="Community of Madrid">
+    <Holidays>
+      <Fixed month="MARCH" day="19" validFrom="2000" validTo="2015" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MARCH" day="19" validFrom="2017" validTo="2017" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MARCH" day="19" validFrom="2021" validTo="2021" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MARCH" day="19" validFrom="2023" validTo="2023" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MAY" day="2" descriptionPropertiesKey="REGIONAL"><!--Rename to day of madrid-->
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="JULY" day="25" validFrom="2017" validTo="2017" descriptionPropertiesKey="SANTIAGO_APOSTOL"/>
+      <Fixed month="JULY" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="SANTIAGO_APOSTOL"/>
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+
+    <SubConfigurations hierarchy="mad" description="Madrid city">
+      <Holidays>
+        <Fixed month="MAY" day="15" descriptionPropertiesKey="SAINT_ISIDORE"/>
+        <Fixed month="NOVEMBER" day="9" descriptionPropertiesKey="ALMUDENA_DAY"/>
+      </Holidays>
+    </SubConfigurations>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ml" description="Melilla">
+    <Holidays>
+      <IslamicHoliday type="ID_UL_ADHA" validFrom="2010" descriptionPropertiesKey="islamic.ID_UL_ADHA"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="mc" description="Region of Murcia">
+    <Holidays>
+      <Fixed month="JANUARY" day="2" validFrom="2023" validTo="2023" descriptionPropertiesKey="NEW_YEAR"/>
+      <Fixed month="JUNE" day="9" descriptionPropertiesKey="REGIONAL"/> <!--Day of Murcia-->
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="nc" description="Chartered Community of Navarre">
+    <Holidays>
+      <Fixed month="DECEMBER" day="25" validFrom="2022" validTo="2022" descriptionPropertiesKey="CHRISTMAS">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="JULY" day="25" validFrom="2023" validTo="2023" descriptionPropertiesKey="SANTIAGO_APOSTOL"/>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="pv" description="Basque Country">
+    <Holidays>
+      <Fixed month="MARCH" day="19" validFrom="2000" validTo="2016" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MARCH" day="19" validFrom="2018" validTo="2021" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="JULY" day="25" validFrom="2017" validTo="2017" descriptionPropertiesKey="SANTIAGO_APOSTOL"/>
+      <Fixed month="JULY" day="25" validFrom="2019" validTo="2020" descriptionPropertiesKey="SANTIAGO_APOSTOL"/>
+      <Fixed month="JULY" day="25" validFrom="2022" validTo="2027" descriptionPropertiesKey="SANTIAGO_APOSTOL"/>
+      <Fixed month="OCTOBER" day="25" validFrom="2011" descriptionPropertiesKey="NATIONAL_DAY"/>
+      <ChristianHoliday type="MAUNDY_THURSDAY" descriptionPropertiesKey="christian.MAUNDY_THURSDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="vc" description="Valencia Community">
+    <Holidays>
+      <Fixed month="MARCH" day="19" validFrom="2000" validTo="2016" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="MARCH" day="19" validFrom="2018" validTo="2022" descriptionPropertiesKey="ST_JOSEPH">
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="OCTOBER" day="9" descriptionPropertiesKey="REGIONAL"/> <!--Day of the Valencian Community-->
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+</Configuration>
diff --git a/src/main/resources/Holidays_gb.xml b/src/main/resources/Holidays_gb.xml
new file mode 100644
index 000000000..0fefb6277
--- /dev/null
+++ b/src/main/resources/Holidays_gb.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration hierarchy="gb" description="United Kingdom"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="BOXING_DAY">
+      <MovingCondition substitute="SATURDAY" with="NEXT" weekday="MONDAY"/>
+      <MovingCondition substitute="SUNDAY" with="NEXT" weekday="TUESDAY"/>
+    </Fixed>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS">
+      <MovingCondition substitute="SATURDAY" with="NEXT" weekday="MONDAY"/>
+      <MovingCondition substitute="SUNDAY" with="NEXT" weekday="TUESDAY"/>
+    </Fixed>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+
+    <!-- The 2020 bank holiday was moved from the 4th to the 8th of May -->
+    <Fixed month="MAY" day="8" validFrom="2020" validTo="2020" descriptionPropertiesKey="EARLY_MAY_BANK_HOLIDAY"/>
+    <!-- The 2022 spring bank holiday was moved from the 4th of May to the second of June -->
+    <Fixed month="JUNE" day="2" validFrom="2022" validTo="2022" descriptionPropertiesKey="SPRING_BANK_HOLIDAY"/>
+    <Fixed month="JUNE" day="3" validFrom="2022" validTo="2022" descriptionPropertiesKey="QUEENS_PLATINUM_JUBILEE"/>
+    <Fixed month="SEPTEMBER" day="19" validFrom="2022" validTo="2022" descriptionPropertiesKey="QUEENS_STATE_FUNERAL"/>
+    <Fixed month="MAY" day="8" validFrom="2023" validTo="2023" descriptionPropertiesKey="KINGS_CORONATION"/>
+
+    <FixedWeekday which="FIRST" weekday="MONDAY" month="MAY" validFrom="1900" validTo="2019"
+                  descriptionPropertiesKey="EARLY_MAY_BANK_HOLIDAY"/>
+    <FixedWeekday which="SECOND" weekday="FRIDAY" month="MAY" validFrom="2020" validTo="2020"
+                  descriptionPropertiesKey="EARLY_MAY_BANK_HOLIDAY"/>
+    <FixedWeekday which="FIRST" weekday="MONDAY" month="MAY" validFrom="2021"
+                  descriptionPropertiesKey="EARLY_MAY_BANK_HOLIDAY"/>
+
+    <FixedWeekday which="LAST" weekday="MONDAY" month="MAY" validTo="2021"
+                  descriptionPropertiesKey="SPRING_BANK_HOLIDAY"/>
+    <FixedWeekday which="LAST" weekday="MONDAY" month="MAY" validFrom="2023"
+                  descriptionPropertiesKey="SPRING_BANK_HOLIDAY"/>
+
+    <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+  </Holidays>
+
+  <SubConfigurations hierarchy="al" description="Alderney">
+    <Holidays>
+      <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="en" description="England">
+    <Holidays>
+      <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR">
+        <MovingCondition substitute="SATURDAY" with="NEXT" weekday="MONDAY"/>
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <FixedWeekday which="LAST" weekday="MONDAY" month="AUGUST" descriptionPropertiesKey="SUMMER_BANK_HOLIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="gu" description="Guernsey">
+    <Holidays>
+      <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+      <Fixed month="MAY" day="9" descriptionPropertiesKey="LIBERATION"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="im" description="Isle of Man">
+    <Holidays>
+      <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+      <Fixed month="JULY" day="5" descriptionPropertiesKey="TYNWALD"/>
+      <FixedWeekday which="SECOND" weekday="FRIDAY" month="JUNE" descriptionPropertiesKey="TOURIST_TROPHY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="je" description="Jersey">
+    <Holidays>
+      <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+      <Fixed month="MAY" day="9" descriptionPropertiesKey="LIBERATION"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="ni" description="Northern Ireland">
+    <Holidays>
+      <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+      <Fixed month="MARCH" day="17" descriptionPropertiesKey="ST_PATRICK">
+        <MovingCondition substitute="SATURDAY" with="NEXT" weekday="MONDAY"/>
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="JULY" day="12" descriptionPropertiesKey="BATTLE_BOYNE">
+        <MovingCondition substitute="SATURDAY" with="NEXT" weekday="MONDAY"/>
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <FixedWeekday which="LAST" weekday="MONDAY" month="AUGUST" descriptionPropertiesKey="SUMMER_BANK_HOLIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="sc" description="Scotland">
+    <Holidays>
+      <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR">
+        <MovingCondition substitute="SATURDAY" with="NEXT" weekday="TUESDAY"/>
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="TUESDAY"/>
+      </Fixed>
+      <Fixed month="JANUARY" day="2" descriptionPropertiesKey="NEW_YEAR">
+        <MovingCondition substitute="SATURDAY" with="NEXT" weekday="MONDAY"/>
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <Fixed month="NOVEMBER" day="30" descriptionPropertiesKey="ST_ANDREW"/>
+      <FixedWeekday which="FIRST" weekday="MONDAY" month="AUGUST" descriptionPropertiesKey="SUMMER_BANK_HOLIDAY"/>
+    </Holidays>
+  </SubConfigurations>
+
+  <SubConfigurations hierarchy="wa" description="Wales">
+    <Holidays>
+      <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR">
+        <MovingCondition substitute="SATURDAY" with="NEXT" weekday="MONDAY"/>
+        <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+      </Fixed>
+      <FixedWeekday which="LAST" weekday="MONDAY" month="AUGUST" descriptionPropertiesKey="SUMMER_BANK_HOLIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+</Configuration>
diff --git a/src/main/resources/Holidays_gr.xml b/src/main/resources/Holidays_gr.xml
new file mode 100644
index 000000000..a97775572
--- /dev/null
+++ b/src/main/resources/Holidays_gr.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration hierarchy="gr" description="Greece"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="JANUARY" day="6" descriptionPropertiesKey="THEOPHANY"/>
+    <Fixed month="JANUARY" day="30" descriptionPropertiesKey="THREE_HIERARCHS"/>
+    <Fixed month="MARCH" day="25" descriptionPropertiesKey="ANNUNCIATION"/>
+    <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+    <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+    <Fixed month="OCTOBER" day="28" descriptionPropertiesKey="OCHI"/>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS"/>
+    <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+    <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER" chronology="JULIAN"/>
+    <ChristianHoliday type="CLEAN_MONDAY" descriptionPropertiesKey="christian.CLEAN_MONDAY" chronology="JULIAN"/>
+    <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY" chronology="JULIAN"/>
+    <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY" chronology="JULIAN"/>
+    <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY" chronology="JULIAN"/>
+  </Holidays>
+</Configuration>
diff --git a/src/main/resources/Holidays_hr.xml b/src/main/resources/Holidays_hr.xml
new file mode 100644
index 000000000..4be1622d4
--- /dev/null
+++ b/src/main/resources/Holidays_hr.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration hierarchy="hr" description="Croatia"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
+    <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+    <Fixed month="MAY" day="30" descriptionPropertiesKey="NATIONAL_DAY" validFrom="2020"/>
+    <Fixed month="JUNE" day="22" descriptionPropertiesKey="ANTI_FASCIST"/>
+    <Fixed month="JUNE" day="25" descriptionPropertiesKey="STATEHOOD" validFrom="2002" validTo="2019"/>
+    <Fixed month="AUGUST" day="5" descriptionPropertiesKey="VICTORY"/>
+    <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_MARY"/>
+    <Fixed month="OCTOBER" day="8" descriptionPropertiesKey="INDEPENDENCE_DAY" validFrom="2002" validTo="2019"/>
+    <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+    <Fixed month="NOVEMBER" day="18" descriptionPropertiesKey="REMEMBRANCE" validFrom="2020"/>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS"/>
+    <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+    <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER"/>
+    <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+  </Holidays>
+</Configuration>
diff --git a/src/main/resources/Holidays_it.xml b/src/main/resources/Holidays_it.xml
new file mode 100644
index 000000000..a4bc161f6
--- /dev/null
+++ b/src/main/resources/Holidays_it.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration hierarchy="it" description="Italy"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" validFrom="1967" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
+    <Fixed month="APRIL" day="25" descriptionPropertiesKey="LIBERATION"/>
+    <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+    <Fixed month="JUNE" day="2" descriptionPropertiesKey="REPUBLIC_DAY"/>
+    <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+    <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+    <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS"/>
+    <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+    <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER"/>
+    <ChristianHoliday type="EASTER_MONDAY" validFrom="1642" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+  </Holidays>
+
+  <SubConfigurations hierarchy="32" description="Südtirol">
+    <Holidays>
+      <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+    </Holidays>
+  </SubConfigurations>
+</Configuration>
diff --git a/src/main/resources/Holidays_lt.xml b/src/main/resources/Holidays_lt.xml
new file mode 100644
index 000000000..e1e1fa76d
--- /dev/null
+++ b/src/main/resources/Holidays_lt.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<Configuration hierarchy="lt" description="Lithuania"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="FEBRUARY" day="16" descriptionPropertiesKey="UNIFICATION"/>
+    <Fixed month="MARCH" day="11" descriptionPropertiesKey="INDEPENDENCE_DAY"/>
+    <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+    <Fixed month="JUNE" day="24" descriptionPropertiesKey="JOHANNIS_DAY"/>
+    <Fixed month="JULY" day="6" descriptionPropertiesKey="STATEHOOD"/>
+    <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+    <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+    <Fixed month="NOVEMBER" day="2" descriptionPropertiesKey="ALL_SOULS" validFrom="2020"/>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS_EVE"/>
+    <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="CHRISTMAS"/>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+    <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER"/>
+    <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+  </Holidays>
+</Configuration>
diff --git a/src/main/resources/Holidays_mt.xml b/src/main/resources/Holidays_mt.xml
new file mode 100644
index 000000000..7f211312c
--- /dev/null
+++ b/src/main/resources/Holidays_mt.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration hierarchy="mt" description="Malta"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="FEBRUARY" day="10" descriptionPropertiesKey="SAINT_PAUL_SHIPWRECK"/>
+    <Fixed month="MARCH" day="19" descriptionPropertiesKey="ST_JOSEPH"/>
+    <Fixed month="MARCH" day="31" descriptionPropertiesKey="FREEDOM_DEMOCRACY"/>
+    <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+    <Fixed month="JUNE" day="7" descriptionPropertiesKey="SETTE_GIUGNO"/>
+    <Fixed month="JUNE" day="29" descriptionPropertiesKey="ST_PETER_PAUL"/>
+    <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_MARY"/>
+    <Fixed month="SEPTEMBER" day="8" descriptionPropertiesKey="VICTORY"/>
+    <Fixed month="SEPTEMBER" day="21" descriptionPropertiesKey="INDEPENDENCE_DAY"/>
+    <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
+    <Fixed month="DECEMBER" day="13" descriptionPropertiesKey="REPUBLIC_DAY"/>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS"/>
+    <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+  </Holidays>
+</Configuration>
diff --git a/src/main/resources/Holidays_nl.xml b/src/main/resources/Holidays_nl.xml
new file mode 100644
index 000000000..fb5227f50
--- /dev/null
+++ b/src/main/resources/Holidays_nl.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<Configuration hierarchy="nl" description="Netherlands"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" validFrom="1967" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="APRIL" day="27" validFrom="2014" descriptionPropertiesKey="KINGS_DAY">
+      <MovingCondition substitute="SUNDAY" with="PREVIOUS" weekday="SATURDAY"/>
+    </Fixed>
+    <Fixed month="AUGUST" day="31" validFrom="1885" validTo="1947" descriptionPropertiesKey="QUEENS_BIRTHDAY"/>
+    <Fixed month="APRIL" day="30" validFrom="1948" validTo="1979" descriptionPropertiesKey="QUEENS_BIRTHDAY">
+      <MovingCondition substitute="SUNDAY" with="NEXT" weekday="MONDAY"/>
+    </Fixed>
+    <Fixed month="APRIL" day="30" validFrom="1980" validTo="2013" descriptionPropertiesKey="QUEENS_BIRTHDAY">
+      <MovingCondition substitute="SUNDAY" with="PREVIOUS" weekday="SATURDAY"/>
+    </Fixed>
+    <Fixed month="MAY" day="5" validFrom="1945" validTo="1989" descriptionPropertiesKey="LIBERATION" every="FIVE_YEARS"/>
+    <Fixed month="MAY" day="5" validFrom="1990" descriptionPropertiesKey="LIBERATION"/>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS"/>
+    <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+    <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+    <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER"/>
+    <ChristianHoliday type="EASTER_MONDAY" validFrom="1642" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    <ChristianHoliday type="ASCENSION_DAY" descriptionPropertiesKey="christian.ASCENSION_DAY"/>
+    <ChristianHoliday type="PENTECOST" descriptionPropertiesKey="christian.PENTECOST"/>
+    <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
+  </Holidays>
+</Configuration>
diff --git a/src/main/resources/Holidays_pl.xml b/src/main/resources/Holidays_pl.xml
new file mode 100644
index 000000000..59ec08429
--- /dev/null
+++ b/src/main/resources/Holidays_pl.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<Configuration hierarchy="pl" description="Poland"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
+    <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
+    <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
+    <Fixed month="MAY" day="3" descriptionPropertiesKey="CONSTITUTION_DAY"/>
+    <Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
+    <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
+    <Fixed month="NOVEMBER" day="11" descriptionPropertiesKey="INDEPENDENCE_DAY"/>
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE" localizedType="OBSERVANCE"/>
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS"/>
+    <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE" localizedType="OBSERVANCE"/>
+    <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER"/>
+    <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+    <ChristianHoliday type="PENTECOST" descriptionPropertiesKey="christian.PENTECOST"/>
+    <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+  </Holidays>
+</Configuration>
diff --git a/src/main/resources/application-demodata.yaml b/src/main/resources/application-demodata.yaml
index be37b36ff..81e79327d 100644
--- a/src/main/resources/application-demodata.yaml
+++ b/src/main/resources/application-demodata.yaml
@@ -60,7 +60,7 @@ management:
     port: 8081
   endpoint:
     prometheus:
-      enabled: true
+      access: read_only
   endpoints:
     web:
       exposure:
diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml
index 6e269d85a..4eda9bb17 100644
--- a/src/main/resources/application.yaml
+++ b/src/main/resources/application.yaml
@@ -52,7 +52,7 @@ springdoc:
 management:
   endpoint:
     prometheus:
-      enabled: false
+      access: read_only
   endpoints:
     web:
       exposure:


Test patch:
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/absence/AbsenceApiControllerSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/absence/AbsenceApiControllerSecurityIT.java
index 454531dc3..3f3e4a4fb 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/absence/AbsenceApiControllerSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/absence/AbsenceApiControllerSecurityIT.java
@@ -5,8 +5,8 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
@@ -41,15 +41,15 @@ class AbsenceApiControllerSecurityIT extends TestContainersBase {
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
-    @MockBean
+    @MockitoBean
     private DepartmentService departmentService;
-    @MockBean
+    @MockitoBean
     private AbsenceService absenceService;
-    @MockBean
+    @MockitoBean
     private WorkingTimeService workingTimeService;
-    @MockBean
+    @MockitoBean
     private WorkingTimeWriteService workingTimeWriteService;
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/absence/AbsenceApiControllerTest.java b/src/test/java/org/synyx/urlaubsverwaltung/absence/AbsenceApiControllerTest.java
index e6d8ff163..e8ed0a825 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/absence/AbsenceApiControllerTest.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/absence/AbsenceApiControllerTest.java
@@ -21,6 +21,7 @@ import static java.time.Month.FEBRUARY;
 import static java.time.Month.JANUARY;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.Mockito.when;
+import static org.springframework.test.json.JsonCompareMode.STRICT;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -64,7 +65,7 @@ class AbsenceApiControllerTest {
             {
               "absences": []
             }
-            """, true));
+            """, STRICT));
     }
 
     // VACATION --------------------------------------------------------------------------------------------------------
@@ -107,7 +108,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     @Test
@@ -148,7 +149,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     @Test
@@ -189,7 +190,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     @Test
@@ -236,7 +237,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     // SICK ------------------------------------------------------------------------------------------------------------
@@ -279,7 +280,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     @Test
@@ -320,7 +321,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     @Test
@@ -361,7 +362,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     // VACATION / SICK - COMBINATION -----------------------------------------------------------------------------------
@@ -415,7 +416,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     @Test
@@ -468,7 +469,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     // VACATION / PUBLIC-HOLIDAY - COMBINATION -------------------------------------------------------------------------
@@ -522,7 +523,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
 
@@ -566,7 +567,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     @Test
@@ -608,7 +609,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     @Test
@@ -670,7 +671,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     @Test
@@ -722,7 +723,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     @Test
@@ -775,7 +776,7 @@ class AbsenceApiControllerTest {
                     }
                 ]
             }
-            """, true));
+            """, STRICT));
     }
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/account/TurnOfTheYearAccountUpdaterServiceIT.java b/src/test/java/org/synyx/urlaubsverwaltung/account/TurnOfTheYearAccountUpdaterServiceIT.java
index e64675caa..bea530c01 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/account/TurnOfTheYearAccountUpdaterServiceIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/account/TurnOfTheYearAccountUpdaterServiceIT.java
@@ -11,8 +11,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.TestConfiguration;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Bean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.transaction.annotation.Transactional;
 import org.synyx.urlaubsverwaltung.TestContainersBase;
 import org.synyx.urlaubsverwaltung.person.Person;
@@ -42,11 +42,11 @@ class TurnOfTheYearAccountUpdaterServiceIT extends TestContainersBase {
     @Autowired
     private TurnOfTheYearAccountUpdaterService sut;
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
-    @MockBean
+    @MockitoBean
     private AccountService accountService;
-    @MockBean
+    @MockitoBean
     private AccountInteractionService accountInteractionService;
 
     @TestConfiguration
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/account/VacationDaysReminderServiceIT.java b/src/test/java/org/synyx/urlaubsverwaltung/account/VacationDaysReminderServiceIT.java
index 6dbb73557..a3db926a0 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/account/VacationDaysReminderServiceIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/account/VacationDaysReminderServiceIT.java
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.transaction.annotation.Transactional;
 import org.synyx.urlaubsverwaltung.TestContainersBase;
 import org.synyx.urlaubsverwaltung.mail.MailService;
@@ -37,11 +37,11 @@ class VacationDaysReminderServiceIT extends TestContainersBase {
     @RegisterExtension
     static final GreenMailExtension greenMail = new GreenMailExtension(SMTP_IMAP);
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
-    @MockBean
+    @MockitoBean
     private AccountService accountService;
-    @MockBean
+    @MockitoBean
     private VacationDaysService vacationDaysService;
 
     @Autowired
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/application/application/ApplicationMailServiceIT.java b/src/test/java/org/synyx/urlaubsverwaltung/application/application/ApplicationMailServiceIT.java
index f7b24b9c6..43d7055be 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/application/application/ApplicationMailServiceIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/application/application/ApplicationMailServiceIT.java
@@ -14,9 +14,9 @@ import org.simplejavamail.converter.EmailConverter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.TestConfiguration;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.MessageSource;
 import org.springframework.context.annotation.Bean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.transaction.annotation.Transactional;
 import org.synyx.urlaubsverwaltung.TestContainersBase;
 import org.synyx.urlaubsverwaltung.application.comment.ApplicationComment;
@@ -97,9 +97,9 @@ class ApplicationMailServiceIT extends TestContainersBase {
     @Autowired
     private MessageSource messageSource;
 
-    @MockBean
+    @MockitoBean
     private MailRecipientService mailRecipientService;
-    @MockBean
+    @MockitoBean
     private DepartmentService departmentService;
 
     @TestConfiguration
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/application/application/CalculationServiceTest.java b/src/test/java/org/synyx/urlaubsverwaltung/application/application/CalculationServiceTest.java
index 639c92011..23cdf2076 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/application/application/CalculationServiceTest.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/application/application/CalculationServiceTest.java
@@ -1,7 +1,7 @@
 package org.synyx.urlaubsverwaltung.application.application;
 
-import de.focus_shift.jollyday.core.HolidayCalendar;
 import de.focus_shift.jollyday.core.HolidayManager;
+import de.focus_shift.jollyday.core.ManagerParameter;
 import de.focus_shift.jollyday.core.ManagerParameters;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -25,6 +25,7 @@ import org.synyx.urlaubsverwaltung.workingtime.WorkingTime;
 import org.synyx.urlaubsverwaltung.workingtime.WorkingTimeService;
 
 import java.math.BigDecimal;
+import java.net.URL;
 import java.time.LocalDate;
 import java.time.Year;
 import java.util.List;
@@ -1167,6 +1168,9 @@ class CalculationServiceTest {
     }
 
     private HolidayManager getHolidayManager() {
-        return HolidayManager.getInstance(ManagerParameters.create(HolidayCalendar.GERMANY));
+        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        final URL url = cl.getResource("Holidays_de.xml");
+        final ManagerParameter managerParameter = ManagerParameters.create(url);
+        return HolidayManager.getInstance(managerParameter);
     }
 }
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/application/vacationtype/VacationTypeEntityRepositoryIT.java b/src/test/java/org/synyx/urlaubsverwaltung/application/vacationtype/VacationTypeEntityRepositoryIT.java
index 96e568be2..fa8d198a4 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/application/vacationtype/VacationTypeEntityRepositoryIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/application/vacationtype/VacationTypeEntityRepositoryIT.java
@@ -26,7 +26,6 @@ class VacationTypeEntityRepositoryIT extends TestContainersBase {
     void ensureSaveCustomVacationType() {
 
         final VacationTypeEntity typeEntity = new VacationTypeEntity();
-        typeEntity.setId(1L);
         typeEntity.setActive(true);
         typeEntity.setCustom(true);
         typeEntity.setCategory(HOLIDAY);
@@ -48,7 +47,6 @@ class VacationTypeEntityRepositoryIT extends TestContainersBase {
         sut.deleteAll();
 
         final VacationTypeEntity active = new VacationTypeEntity();
-        active.setId(1L);
         active.setActive(true);
         active.setCategory(HOLIDAY);
         active.setMessageKey("message.key.active");
@@ -56,7 +54,6 @@ class VacationTypeEntityRepositoryIT extends TestContainersBase {
         final VacationTypeEntity activeSaved = sut.save(active);
 
         final VacationTypeEntity inactive = new VacationTypeEntity();
-        inactive.setId(2L);
         inactive.setActive(false);
         inactive.setCategory(OVERTIME);
         inactive.setMessageKey("message.key.inactive");
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerCompanyCalendarSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerCompanyCalendarSecurityIT.java
index 3af88e7a4..dd565cb27 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerCompanyCalendarSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerCompanyCalendarSecurityIT.java
@@ -5,8 +5,8 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
 import org.springframework.web.context.WebApplicationContext;
@@ -32,15 +32,15 @@ class CalendarSharingViewControllerCompanyCalendarSecurityIT extends TestContain
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
-    @MockBean
+    @MockitoBean
     private PersonCalendarService personCalendarService;
-    @MockBean
+    @MockitoBean
     private CompanyCalendarService companyCalendarService;
-    @MockBean
+    @MockitoBean
     private DepartmentService departmentService;
-    @MockBean
+    @MockitoBean
     private CalendarAccessibleService calendarAccessibleService;
 
 
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerDepartmentCalendarSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerDepartmentCalendarSecurityIT.java
index 0712fedfa..60e1b9e1f 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerDepartmentCalendarSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerDepartmentCalendarSecurityIT.java
@@ -5,7 +5,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
@@ -37,17 +37,17 @@ class CalendarSharingViewControllerDepartmentCalendarSecurityIT extends TestCont
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
-    @MockBean
+    @MockitoBean
     private PersonCalendarService personCalendarService;
-    @MockBean
+    @MockitoBean
     private DepartmentCalendarService departmentCalendarService;
-    @MockBean
+    @MockitoBean
     private CompanyCalendarService companyCalendarService;
-    @MockBean
+    @MockitoBean
     private DepartmentService departmentService;
-    @MockBean
+    @MockitoBean
     private CalendarAccessibleService calendarAccessibleService;
 
     // =========================================================================================================
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerPersonCalendarSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerPersonCalendarSecurityIT.java
index 9d8b4b2a7..78d0634b2 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerPersonCalendarSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/calendar/CalendarSharingViewControllerPersonCalendarSecurityIT.java
@@ -5,7 +5,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
@@ -34,15 +34,15 @@ class CalendarSharingViewControllerPersonCalendarSecurityIT extends TestContaine
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
-    @MockBean
+    @MockitoBean
     private PersonCalendarService personCalendarService;
-    @MockBean
+    @MockitoBean
     private CompanyCalendarService companyCalendarService;
-    @MockBean
+    @MockitoBean
     private DepartmentService departmentService;
-    @MockBean
+    @MockitoBean
     private CalendarAccessibleService calendarAccessibleService;
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/calendar/ICalViewControllerSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/calendar/ICalViewControllerSecurityIT.java
index fd7f33b2c..5f144353a 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/calendar/ICalViewControllerSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/calendar/ICalViewControllerSecurityIT.java
@@ -3,7 +3,7 @@ package org.synyx.urlaubsverwaltung.calendar;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.core.io.ByteArrayResource;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
@@ -23,11 +23,11 @@ class ICalViewControllerSecurityIT extends TestContainersBase {
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonCalendarService personCalendarService;
-    @MockBean
+    @MockitoBean
     private DepartmentCalendarService departmentCalendarService;
-    @MockBean
+    @MockitoBean
     private CompanyCalendarService companyCalendarService;
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/calendar/PersonDisabledListenerIT.java b/src/test/java/org/synyx/urlaubsverwaltung/calendar/PersonDisabledListenerIT.java
index f287c84dd..5461b5bc7 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/calendar/PersonDisabledListenerIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/calendar/PersonDisabledListenerIT.java
@@ -3,7 +3,7 @@ package org.synyx.urlaubsverwaltung.calendar;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.test.context.ContextConfiguration;
 import org.synyx.urlaubsverwaltung.TestContainersBase;
@@ -15,11 +15,11 @@ import static org.mockito.Mockito.verify;
 @ContextConfiguration(classes = {PersonDisabledListener.class})
 class PersonDisabledListenerIT extends TestContainersBase {
 
-    @MockBean
+    @MockitoBean
     private PersonCalendarService personCalendarService;
-    @MockBean
+    @MockitoBean
     private DepartmentCalendarService departmentCalendarService;
-    @MockBean
+    @MockitoBean
     private CompanyCalendarService companyCalendarService;
     @Autowired
     private ApplicationEventPublisher applicationEventPublisher;
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/calendar/PersonLeftDepartmentListenerIT.java b/src/test/java/org/synyx/urlaubsverwaltung/calendar/PersonLeftDepartmentListenerIT.java
index 6ad99bace..b562438fb 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/calendar/PersonLeftDepartmentListenerIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/calendar/PersonLeftDepartmentListenerIT.java
@@ -3,7 +3,7 @@ package org.synyx.urlaubsverwaltung.calendar;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.test.context.ContextConfiguration;
 import org.synyx.urlaubsverwaltung.TestContainersBase;
@@ -15,7 +15,7 @@ import static org.mockito.Mockito.verify;
 @ContextConfiguration(classes = {PersonLeftDepartmentListener.class})
 class PersonLeftDepartmentListenerIT extends TestContainersBase {
 
-    @MockBean
+    @MockitoBean
     private DepartmentCalendarService departmentCalendarService;
     @Autowired
     private ApplicationEventPublisher applicationEventPublisher;
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/person/api/PersonApiControllerIT.java b/src/test/java/org/synyx/urlaubsverwaltung/person/api/PersonApiControllerIT.java
index 28cd600da..8faa75336 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/person/api/PersonApiControllerIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/person/api/PersonApiControllerIT.java
@@ -6,8 +6,8 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
@@ -25,6 +25,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oauth2Login;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oidcLogin;
 import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
+import static org.springframework.test.json.JsonCompareMode.STRICT;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
@@ -37,7 +38,7 @@ class PersonApiControllerIT extends TestContainersBase {
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
 
     @Test
@@ -84,7 +85,7 @@ class PersonApiControllerIT extends TestContainersBase {
                             }
                           }
                         }
-                        """, true));
+                        """, STRICT));
     }
 
     @Test
@@ -140,7 +141,7 @@ class PersonApiControllerIT extends TestContainersBase {
                             }
                           }
                         }
-                        """, true));
+                        """, STRICT));
     }
 
 
@@ -221,7 +222,7 @@ class PersonApiControllerIT extends TestContainersBase {
                              }
                            ]
                          }
-                        """, true));
+                        """, STRICT));
     }
 
     @Test
@@ -271,7 +272,7 @@ class PersonApiControllerIT extends TestContainersBase {
                             }
                           }
                         }
-                        """, true));
+                        """, STRICT));
     }
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/person/api/PersonApiControllerSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/person/api/PersonApiControllerSecurityIT.java
index 65355eb6d..00cb6d325 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/person/api/PersonApiControllerSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/person/api/PersonApiControllerSecurityIT.java
@@ -6,7 +6,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
@@ -36,9 +36,9 @@ class PersonApiControllerSecurityIT extends TestContainersBase {
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
-    @MockBean
+    @MockitoBean
     private DepartmentService departmentService;
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/person/basedata/PersonBasedataViewControllerSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/person/basedata/PersonBasedataViewControllerSecurityIT.java
index 4f33ee8cb..617cfc2cd 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/person/basedata/PersonBasedataViewControllerSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/person/basedata/PersonBasedataViewControllerSecurityIT.java
@@ -5,7 +5,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
@@ -33,9 +33,9 @@ class PersonBasedataViewControllerSecurityIT extends TestContainersBase {
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonBasedataService personBasedataService;
-    @MockBean
+    @MockitoBean
     private PersonService personService;
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/person/web/PersonNotificationsViewControllerSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/person/web/PersonNotificationsViewControllerSecurityIT.java
index 30aee1a0c..2677353e6 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/person/web/PersonNotificationsViewControllerSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/person/web/PersonNotificationsViewControllerSecurityIT.java
@@ -5,8 +5,8 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
 import org.springframework.web.context.WebApplicationContext;
@@ -40,10 +40,10 @@ class PersonNotificationsViewControllerSecurityIT extends TestContainersBase {
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
 
-    @MockBean
+    @MockitoBean
     private UserNotificationSettingsService userNotificationSettingsService;
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/person/web/PersonsViewControllerTest.java b/src/test/java/org/synyx/urlaubsverwaltung/person/web/PersonsViewControllerTest.java
index ba813267f..d71b09eee 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/person/web/PersonsViewControllerTest.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/person/web/PersonsViewControllerTest.java
@@ -469,7 +469,7 @@ class PersonsViewControllerTest {
 
         mockDefaultPageRequest(person);
 
-        perform(get("/web/person/")
+        perform(get("/web/person")
 
             .param("year", "1985")
         )
@@ -491,7 +491,7 @@ class PersonsViewControllerTest {
 
         mockDefaultPageRequest(person);
 
-        perform(get("/web/person/"))
+        perform(get("/web/person"))
             .andExpect(model().attribute("selectedYear", 2022))
             .andExpect(model().attribute("currentYear", 2022));
     }
@@ -508,7 +508,7 @@ class PersonsViewControllerTest {
         final PageImpl<Person> page = new PageImpl<>(List.of());
         when(personService.getActivePersons(defaultPersonSearchQuery())).thenReturn(page);
 
-        perform(get("/web/person/"))
+        perform(get("/web/person"))
             .andExpect(model().attribute("departments", hasSize(1)));
 
         verifyNoMoreInteractions(departmentService);
@@ -526,7 +526,7 @@ class PersonsViewControllerTest {
         final PageImpl<Person> page = new PageImpl<>(List.of());
         when(personService.getActivePersons(defaultPersonSearchQuery())).thenReturn(page);
 
-        perform(get("/web/person/"))
+        perform(get("/web/person"))
             .andExpect(model().attribute("departments", hasSize(1)));
 
         verifyNoMoreInteractions(departmentService);
@@ -543,7 +543,7 @@ class PersonsViewControllerTest {
         final Department department = new Department();
         when(departmentService.getManagedDepartmentsOfDepartmentHead(departmentHead)).thenReturn(List.of(department));
 
-        perform(get("/web/person/"))
+        perform(get("/web/person"))
             .andExpect(model().attribute("departments", hasSize(1)));
     }
 
@@ -560,7 +560,7 @@ class PersonsViewControllerTest {
         department.setName("awesome-department");
         when(departmentService.getManagedDepartmentsOfSecondStageAuthority(secondStageAuthority)).thenReturn(List.of(department));
 
-        perform(get("/web/person/"))
+        perform(get("/web/person"))
             .andExpect(
                 model().attribute("departments", allOf(
                     hasSize(1),
@@ -592,7 +592,7 @@ class PersonsViewControllerTest {
         when(departmentService.getManagedDepartmentsOfDepartmentHead(departmentHeadAndSecondStageAuthority)).thenReturn(List.of(department, department3));
         when(departmentService.getManagedDepartmentsOfSecondStageAuthority(departmentHeadAndSecondStageAuthority)).thenReturn(List.of(department, department2));
 
-        perform(get("/web/person/"))
+        perform(get("/web/person"))
             .andExpect(model().attribute("departments", hasSize(3)));
     }
 
@@ -607,7 +607,7 @@ class PersonsViewControllerTest {
         final Department department = new Department();
         when(departmentService.getAssignedDepartmentsOfMember(user)).thenReturn(List.of(department));
 
-        perform(get("/web/person/"))
+        perform(get("/web/person"))
             .andExpect(model().attribute("departments", hasSize(1)));
     }
 
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidayApiControllerSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidayApiControllerSecurityIT.java
index 0646fc617..efcfdaf1e 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidayApiControllerSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidayApiControllerSecurityIT.java
@@ -5,7 +5,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
@@ -38,15 +38,15 @@ class PublicHolidayApiControllerSecurityIT extends TestContainersBase {
 
     @Autowired
     private WebApplicationContext context;
-    @MockBean
+    @MockitoBean
     private PersonService personService;
-    @MockBean
+    @MockitoBean
     private WorkingTimeService workingTimeService;
-    @MockBean
+    @MockitoBean
     private DepartmentService departmentService;
 
     // WorkingTimeWriteService is required for personService
-    @MockBean
+    @MockitoBean
     private WorkingTimeWriteService workingTimeWriteService;
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidayConfigurationTest.java b/src/test/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidayConfigurationTest.java
deleted file mode 100644
index 0f903adb4..000000000
--- a/src/test/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidayConfigurationTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.synyx.urlaubsverwaltung.publicholiday;
-
-import de.focus_shift.jollyday.core.HolidayManager;
-import org.junit.jupiter.api.Test;
-
-import java.util.Map;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class PublicHolidayConfigurationTest {
-
-    @Test
-    void ensureThatHolidaysManagerMapContainsAllKeys() {
-        final Map<String, HolidayManager> holidayManagers = new PublicHolidayConfiguration().holidayManagerMap();
-        assertThat(holidayManagers)
-                .hasSize(13)
-                .containsKeys("de", "at", "ch", "gb", "gr", "mt", "it", "hr", "es", "nl", "lt", "be", "pl");
-    }
-}
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidaysServiceImplTest.java b/src/test/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidaysServiceImplTest.java
index e77281536..622ab4923 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidaysServiceImplTest.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/publicholiday/PublicHolidaysServiceImplTest.java
@@ -1,6 +1,5 @@
 package org.synyx.urlaubsverwaltung.publicholiday;
 
-import de.focus_shift.jollyday.core.HolidayCalendar;
 import de.focus_shift.jollyday.core.HolidayManager;
 import de.focus_shift.jollyday.core.ManagerParameters;
 import org.junit.jupiter.api.BeforeEach;
@@ -15,6 +14,7 @@ import org.synyx.urlaubsverwaltung.settings.Settings;
 import org.synyx.urlaubsverwaltung.settings.SettingsService;
 
 import java.math.BigDecimal;
+import java.net.URL;
 import java.time.LocalDate;
 import java.time.Month;
 import java.util.List;
@@ -26,7 +26,6 @@ import static java.math.BigDecimal.ZERO;
 import static java.time.LocalDate.of;
 import static java.time.Month.AUGUST;
 import static java.time.Month.DECEMBER;
-import static java.time.Month.JANUARY;
 import static java.time.Month.MAY;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.when;
@@ -183,33 +182,9 @@ class PublicHolidaysServiceImplTest {
             .containsExactly(DayLength.NOON);
     }
 
-    @Test
-    void ensureGetPublicHolidaysReturnsChristmasForMultipleYears() {
-
-        when(settingsService.getSettings()).thenReturn(new Settings());
-
-        final List<PublicHoliday> publicHolidays = sut.getPublicHolidays(of(2020, JANUARY, 1), of(2023, DECEMBER, 31), GERMANY_BADEN_WUERTTEMBERG);
-
-        assertThat(publicHolidays).contains(
-            new PublicHoliday(LocalDate.of(2020, DECEMBER, 24), null, null),
-            new PublicHoliday(LocalDate.of(2021, DECEMBER, 24), null, null),
-            new PublicHoliday(LocalDate.of(2023, DECEMBER, 24), null, null));
-    }
-
-    @Test
-    void ensureGetPublicHolidaysReturnsNewYearsEveForMultipleYears() {
-
-        when(settingsService.getSettings()).thenReturn(new Settings());
-
-        final List<PublicHoliday> publicHolidays = sut.getPublicHolidays(of(2020, JANUARY, 1), of(2023, DECEMBER, 31), GERMANY_BADEN_WUERTTEMBERG);
-
-        assertThat(publicHolidays).contains(
-            new PublicHoliday(LocalDate.of(2020, DECEMBER, 31), null, null),
-            new PublicHoliday(LocalDate.of(2021, DECEMBER, 31), null, null),
-            new PublicHoliday(LocalDate.of(2023, DECEMBER, 31), null, null));
-    }
-
     private HolidayManager getHolidayManager() {
-        return HolidayManager.getInstance(ManagerParameters.create(HolidayCalendar.GERMANY));
+        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        final URL url = cl.getResource("Holidays_de.xml");
+        return HolidayManager.getInstance(ManagerParameters.create(url));
     }
 }
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/settings/SettingsServiceImplTest.java b/src/test/java/org/synyx/urlaubsverwaltung/settings/SettingsServiceImplTest.java
index 130bed4e0..babf6ea0e 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/settings/SettingsServiceImplTest.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/settings/SettingsServiceImplTest.java
@@ -6,9 +6,11 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
-import java.util.Optional;
+import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.AdditionalAnswers.returnsFirstArg;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 
 @ExtendWith(MockitoExtension.class)
@@ -28,9 +30,18 @@ class SettingsServiceImplTest {
     void ensureGetSettingsReturnsFromDB() {
         final Settings settings = new Settings();
         settings.setId(1L);
-        when(settingsRepository.findById(1L)).thenReturn(Optional.of(settings));
+        when(settingsRepository.findAll()).thenReturn(List.of(settings));
 
         final Settings actualSettings = sut.getSettings();
         assertThat(actualSettings).isEqualTo(settings);
     }
+
+    @Test
+    void ensureGetNewEmptySettingIfNothingIsSaved() {
+        when(settingsRepository.findAll()).thenReturn(List.of());
+        when(settingsRepository.save(any(Settings.class))).thenAnswer(returnsFirstArg());
+
+        final Settings actualSettings = sut.getSettings();
+        assertThat(actualSettings).isInstanceOf(Settings.class);
+    }
 }
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sickdays/SickDaysOverviewViewControllerSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sickdays/SickDaysOverviewViewControllerSecurityIT.java
index 0d554743c..bf993aa7e 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sickdays/SickDaysOverviewViewControllerSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sickdays/SickDaysOverviewViewControllerSecurityIT.java
@@ -5,7 +5,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
@@ -31,7 +31,7 @@ class SickDaysOverviewViewControllerSecurityIT extends TestContainersBase {
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
 
     private final DateTimeFormatter dtf = DateTimeFormatter.ofPattern(DateAndTimeFormat.DD_MM_YYYY);
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteApiControllerSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteApiControllerSecurityIT.java
index 4f978011b..9185e4d7c 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteApiControllerSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteApiControllerSecurityIT.java
@@ -5,7 +5,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
@@ -38,11 +38,11 @@ class SickNoteApiControllerSecurityIT extends TestContainersBase {
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
-    @MockBean
+    @MockitoBean
     private SickNoteService sickNoteService;
-    @MockBean
+    @MockitoBean
     private DepartmentService departmentService;
 
     private final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteMailServiceIT.java b/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteMailServiceIT.java
index 21ee85a71..2322787d1 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteMailServiceIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteMailServiceIT.java
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.transaction.annotation.Transactional;
 import org.synyx.urlaubsverwaltung.TestContainersBase;
 import org.synyx.urlaubsverwaltung.mail.MailRecipientService;
@@ -53,11 +53,11 @@ class SickNoteMailServiceIT extends TestContainersBase {
     @Autowired
     private PersonService personService;
 
-    @MockBean
+    @MockitoBean
     private MailRecipientService mailRecipientService;
-    @MockBean
+    @MockitoBean
     private SickNoteService sickNoteService;
-    @MockBean
+    @MockitoBean
     private SickNoteCommentService sickNoteCommentService;
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteViewControllerTest.java b/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteViewControllerTest.java
index c84c14471..d9b01940b 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteViewControllerTest.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/sicknote/sicknote/SickNoteViewControllerTest.java
@@ -1162,7 +1162,7 @@ class SickNoteViewControllerTest {
         when(sickNoteInteractionService.create(any(SickNote.class), eq(signedInPerson), eq(null)))
             .thenReturn(SickNote.builder().id(42L).build());
 
-        perform(post("/web/sicknote/").param("person.id", "1"))
+        perform(post("/web/sicknote").param("person.id", "1"))
             .andExpect(status().is3xxRedirection())
             .andExpect(redirectedUrl("/web/sicknote/42"));
     }
@@ -1180,7 +1180,7 @@ class SickNoteViewControllerTest {
         when(sickNoteInteractionService.submit(any(SickNote.class), eq(signedInPerson), eq(null)))
                 .thenReturn(SickNote.builder().id(42L).build());
 
-        perform(post("/web/sicknote/").param("person.id", "1"))
+        perform(post("/web/sicknote").param("person.id", "1"))
                 .andExpect(status().is3xxRedirection())
                 .andExpect(redirectedUrl("/web/sicknote/42"));
     }
@@ -1200,7 +1200,7 @@ class SickNoteViewControllerTest {
         when(sickNoteInteractionService.create(any(SickNote.class), eq(signedInPerson), eq(null)))
                 .thenReturn(SickNote.builder().id(42L).build());
 
-        perform(post("/web/sicknote/").param("person.id", "1"))
+        perform(post("/web/sicknote").param("person.id", "1"))
                 .andExpect(status().is3xxRedirection())
                 .andExpect(redirectedUrl("/web/sicknote/42"));
     }
@@ -1248,7 +1248,7 @@ class SickNoteViewControllerTest {
             .thenReturn(SickNote.builder().id(42L).build());
 
         perform(
-            post("/web/sicknote/")
+            post("/web/sicknote")
                 .param("startDate", givenDate)
                 .param("endDate", givenDate)
                 .param("aubStartDate", givenDate)
@@ -1272,7 +1272,7 @@ class SickNoteViewControllerTest {
         doAnswer(invocation -> SickNote.builder(invocation.getArgument(0)).id(SOME_SICK_NOTE_ID).build())
             .when(sickNoteInteractionService).create(any(SickNote.class), any(Person.class), any());
 
-        perform(post("/web/sicknote/").param("person.id", "1"))
+        perform(post("/web/sicknote").param("person.id", "1"))
             .andExpect(status().isFound())
             .andExpect(redirectedUrl("/web/sicknote/" + SOME_SICK_NOTE_ID));
     }
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/user/pagination/PageableDefaultSizeChangedEventConsumerIT.java b/src/test/java/org/synyx/urlaubsverwaltung/user/pagination/PageableDefaultSizeChangedEventConsumerIT.java
index eeb8242a2..67fad0d03 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/user/pagination/PageableDefaultSizeChangedEventConsumerIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/user/pagination/PageableDefaultSizeChangedEventConsumerIT.java
@@ -3,8 +3,8 @@ package org.synyx.urlaubsverwaltung.user.pagination;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.synyx.urlaubsverwaltung.person.PersonId;
 import org.synyx.urlaubsverwaltung.web.pageable.PageableDefaultSizeChangedEvent;
 
@@ -22,7 +22,7 @@ class PageableDefaultSizeChangedEventConsumerIT {
     @Autowired
     private ApplicationEventPublisher eventPublisher;
 
-    @MockBean
+    @MockitoBean
     private UserPaginationSettingsService userPaginationSettingsService;
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/user/pagination/UserPaginationSettingsServiceIT.java b/src/test/java/org/synyx/urlaubsverwaltung/user/pagination/UserPaginationSettingsServiceIT.java
index 729053cd4..1a818a690 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/user/pagination/UserPaginationSettingsServiceIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/user/pagination/UserPaginationSettingsServiceIT.java
@@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.data.web.SpringDataWebProperties;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.synyx.urlaubsverwaltung.person.PersonId;
 
 import java.util.Optional;
@@ -18,7 +18,7 @@ class UserPaginationSettingsServiceIT {
     @Autowired
     private UserPaginationSettingsService sut;
 
-    @MockBean
+    @MockitoBean
     private UserPaginationSettingsRepository repository;
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/vacations/VacationApiControllerSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/vacations/VacationApiControllerSecurityIT.java
index 9ba2f2e1b..850a290b9 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/vacations/VacationApiControllerSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/vacations/VacationApiControllerSecurityIT.java
@@ -5,11 +5,10 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 import org.springframework.web.context.WebApplicationContext;
 import org.synyx.urlaubsverwaltung.TestContainersBase;
 import org.synyx.urlaubsverwaltung.application.application.ApplicationService;
@@ -27,6 +26,7 @@ import static org.springframework.security.test.web.servlet.request.SecurityMock
 import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
 import static org.synyx.urlaubsverwaltung.person.Role.DEPARTMENT_HEAD;
 import static org.synyx.urlaubsverwaltung.person.Role.SECOND_STAGE_AUTHORITY;
 import static org.synyx.urlaubsverwaltung.person.Role.USER;
@@ -37,11 +37,11 @@ class VacationApiControllerSecurityIT extends TestContainersBase {
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private PersonService personService;
-    @MockBean
+    @MockitoBean
     private ApplicationService applicationService;
-    @MockBean
+    @MockitoBean
     private DepartmentService departmentService;
 
     private final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -418,6 +418,6 @@ class VacationApiControllerSecurityIT extends TestContainersBase {
     }
 
     private ResultActions perform(MockHttpServletRequestBuilder builder) throws Exception {
-        return MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build().perform(builder);
+        return webAppContextSetup(context).apply(springSecurity()).build().perform(builder);
     }
 }
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/vacations/VacationApiControllerTest.java b/src/test/java/org/synyx/urlaubsverwaltung/vacations/VacationApiControllerTest.java
index 43f3bfb43..ee5bbe45c 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/vacations/VacationApiControllerTest.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/vacations/VacationApiControllerTest.java
@@ -24,6 +24,7 @@ import static java.time.LocalDate.of;
 import static org.hamcrest.Matchers.hasSize;
 import static org.hamcrest.Matchers.is;
 import static org.mockito.Mockito.when;
+import static org.springframework.test.json.JsonCompareMode.STRICT;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
@@ -249,7 +250,7 @@ class VacationApiControllerTest {
                   ],
                   "links": []
                 }
-                """,true));
+                """, STRICT));
     }
 
     @Test
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/workingtime/WorkDaysCountServiceTest.java b/src/test/java/org/synyx/urlaubsverwaltung/workingtime/WorkDaysCountServiceTest.java
index c3bfa6010..de99bb52b 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/workingtime/WorkDaysCountServiceTest.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/workingtime/WorkDaysCountServiceTest.java
@@ -1,6 +1,5 @@
 package org.synyx.urlaubsverwaltung.workingtime;
 
-import de.focus_shift.jollyday.core.HolidayCalendar;
 import de.focus_shift.jollyday.core.HolidayManager;
 import de.focus_shift.jollyday.core.ManagerParameters;
 import org.junit.jupiter.api.BeforeEach;
@@ -15,6 +14,7 @@ import org.synyx.urlaubsverwaltung.settings.Settings;
 import org.synyx.urlaubsverwaltung.settings.SettingsService;
 
 import java.math.BigDecimal;
+import java.net.URL;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.util.List;
@@ -417,7 +417,9 @@ class WorkDaysCountServiceTest {
 
 
     private HolidayManager getHolidayManager() {
-        return HolidayManager.getInstance(ManagerParameters.create(HolidayCalendar.GERMANY));
+        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        final URL url = cl.getResource("Holidays_de.xml");
+        return HolidayManager.getInstance(ManagerParameters.create(url));
     }
 
     public static WorkingTime createWorkingTime(Person person, LocalDate validFrom, DayOfWeek... daysOfWeek) {
diff --git a/src/test/java/org/synyx/urlaubsverwaltung/workingtime/WorkingTimeCalendarApiControllerSecurityIT.java b/src/test/java/org/synyx/urlaubsverwaltung/workingtime/WorkingTimeCalendarApiControllerSecurityIT.java
index 1d01f23b6..a08ee5517 100644
--- a/src/test/java/org/synyx/urlaubsverwaltung/workingtime/WorkingTimeCalendarApiControllerSecurityIT.java
+++ b/src/test/java/org/synyx/urlaubsverwaltung/workingtime/WorkingTimeCalendarApiControllerSecurityIT.java
@@ -5,7 +5,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
@@ -36,11 +36,11 @@ class WorkingTimeCalendarApiControllerSecurityIT extends TestContainersBase {
     @Autowired
     private WebApplicationContext context;
 
-    @MockBean
+    @MockitoBean
     private WorkDaysCountService workDaysCountService;
-    @MockBean
+    @MockitoBean
     private DepartmentService departmentService;
-    @MockBean
+    @MockitoBean
     private PersonService personService;
 
     @Test
diff --git a/src/test/resources/Holidays_custom.xml b/src/test/resources/Holidays_custom.xml
new file mode 100644
index 000000000..c6222d9a9
--- /dev/null
+++ b/src/test/resources/Holidays_custom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration hierarchy="custom" description="custom"
+               xmlns="https://focus_shift.de/jollyday/schema/holiday"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
+  <Holidays>
+    <Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/> <!-- Neujahr -->
+    <Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/> <!-- Hl. 3 Koenige -->
+    <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/> <!-- Tag der Arbeit -->
+    <Fixed month="OCTOBER" day="3" validFrom="1990"
+           descriptionPropertiesKey="UNIFICATION"/> <!-- Tag der dt. Einheit -->
+    <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/> <!-- Allerheiligen -->
+    <Fixed month="DECEMBER" day="25" descriptionPropertiesKey="CHRISTMAS"/> <!-- 1. Weihnachtstag -->
+    <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/> <!-- 2. Weihnachtstag -->
+    <Fixed month="DECEMBER" day="24" descriptionPropertiesKey="CHRISTMAS_EVE"/>  <!--Heiligabend-->
+    <Fixed month="DECEMBER" day="31" descriptionPropertiesKey="NEW_YEARS_EVE"/>  <!--Silvester-->
+    <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
+    <ChristianHoliday type="EASTER" descriptionPropertiesKey="christian.EASTER"/>
+    <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/> <!-- Karfreitag -->
+    <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/> <!-- Ostermontag -->
+    <ChristianHoliday type="ASCENSION_DAY"
+                      descriptionPropertiesKey="christian.ASCENSION_DAY"/> <!-- Christi Himmelfahrt -->
+    <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/> <!-- Pfingstmontag -->
+  </Holidays>
+
+</Configuration>