Merge `release/2.21.0` into `2.x`

# Conflicts:
#	.github/generate-email.sh
#	.github/workflows/build.yml
#	README.md
#	pom.xml
#	src/changelog/.2.x.x/1783_spring_arbiter_without_environment.xml
#	src/changelog/.2.x.x/UpdateSurefireRelease.xml
#	src/changelog/2.21.0/PreventResourceLeak.xml
#	src/site/_release-notes.adoc
#	src/site/_release-notes/_2.0-alpha1.adoc
#	src/site/_release-notes/_2.0-alpha2.adoc
#	src/site/_release-notes/_2.0-beta1.adoc
#	src/site/_release-notes/_2.0-beta2.adoc
#	src/site/_release-notes/_2.0-beta3.adoc
#	src/site/_release-notes/_2.0-beta4.adoc
#	src/site/_release-notes/_2.0-beta5.adoc
#	src/site/_release-notes/_2.0-beta6.adoc
#	src/site/_release-notes/_2.0-beta7.adoc
#	src/site/_release-notes/_2.0-beta8.adoc
#	src/site/_release-notes/_2.0-beta9.adoc
#	src/site/_release-notes/_2.0-rc1.adoc
#	src/site/_release-notes/_2.0-rc2.adoc
#	src/site/_release-notes/_2.0.1.adoc
#	src/site/_release-notes/_2.0.2.adoc
#	src/site/_release-notes/_2.0.adoc
#	src/site/_release-notes/_2.1.adoc
#	src/site/_release-notes/_2.10.0.adoc
#	src/site/_release-notes/_2.11.0.adoc
#	src/site/_release-notes/_2.11.1.adoc
#	src/site/_release-notes/_2.11.2.adoc
#	src/site/_release-notes/_2.12.0.adoc
#	src/site/_release-notes/_2.12.1.adoc
#	src/site/_release-notes/_2.13.0.adoc
#	src/site/_release-notes/_2.13.1.adoc
#	src/site/_release-notes/_2.13.2.adoc
#	src/site/_release-notes/_2.13.3.adoc
#	src/site/_release-notes/_2.14.0.adoc
#	src/site/_release-notes/_2.14.1.adoc
#	src/site/_release-notes/_2.15.0.adoc
#	src/site/_release-notes/_2.16.0.adoc
#	src/site/_release-notes/_2.17.0.adoc
#	src/site/_release-notes/_2.17.1.adoc
#	src/site/_release-notes/_2.17.2.adoc
#	src/site/_release-notes/_2.18.0.adoc
#	src/site/_release-notes/_2.19.0.adoc
#	src/site/_release-notes/_2.2.adoc
#	src/site/_release-notes/_2.20.0.adoc
#	src/site/_release-notes/_2.3.adoc
#	src/site/_release-notes/_2.4.1.adoc
#	src/site/_release-notes/_2.4.adoc
#	src/site/_release-notes/_2.5.adoc
#	src/site/_release-notes/_2.6.1.adoc
#	src/site/_release-notes/_2.6.2.adoc
#	src/site/_release-notes/_2.6.adoc
#	src/site/_release-notes/_2.7.adoc
#	src/site/_release-notes/_2.8.1.adoc
#	src/site/_release-notes/_2.8.2.adoc
#	src/site/_release-notes/_2.8.adoc
#	src/site/_release-notes/_2.9.0.adoc
#	src/site/_release-notes/_2.9.1.adoc
#	src/site/_release-notes/_2.x.x.adoc
diff --git a/.github/generate-email.sh b/.github/generate-email.sh
index 569583a..49a8624 100755
--- a/.github/generate-email.sh
+++ b/.github/generate-email.sh
@@ -48,7 +48,8 @@
 }
 
 dump_release_notes() {
-    awk "f{print} /^Release date::/{f=1}" "$RELEASE_NOTES_FILE"
+    awk "f{print} /^Release date::/{f=1}" "$RELEASE_NOTES_FILE" \
+        | sed -r 's!'$PROJECT_REPO'/(issues|pull)/[0-9]+\[([0-9]+)\]!#\2!g'
 }
 
 case $1 in
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index eb3f90c..d5612a5 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -54,7 +54,7 @@
 
       # Initializes the CodeQL tools for scanning.
       - name: Initialize CodeQL
-        uses: github/codeql-action/init@ddccb873888234080b77e9bc2d4764d5ccaaccf9    # 2.21.9
+        uses: github/codeql-action/init@2cb752a87e96af96708ab57187ab6372ee1973ab    # 2.22.0
         with:
           languages: ${{ matrix.language }}
           # If you wish to specify custom queries, you can do so here or in a config file.
@@ -64,7 +64,7 @@
 
       # JDK 11 is used for the build.
       - name: Setup JDK
-        uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2   # 3.12.0
+        uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0   # 3.13.0
         with:
           distribution: temurin
           java-version: 11
@@ -79,4 +79,4 @@
           -DskipTests -P!java8-tests
 
       - name: Perform CodeQL Analysis
-        uses: github/codeql-action/analyze@ddccb873888234080b77e9bc2d4764d5ccaaccf9    # 2.21.9
+        uses: github/codeql-action/analyze@2cb752a87e96af96708ab57187ab6372ee1973ab    # 2.22.0
diff --git a/.github/workflows/merge-dependabot.yaml b/.github/workflows/merge-dependabot.yaml
index 1450173..8e52899 100644
--- a/.github/workflows/merge-dependabot.yaml
+++ b/.github/workflows/merge-dependabot.yaml
@@ -29,7 +29,7 @@
 jobs:
 
   build:
-    if: github.repository == 'apache/logging-log4j-kotlin' && github.event_name == 'pull_request_target' && github.actor == 'dependabot[bot]'
+    if: github.repository == 'apache/logging-log4j2' && github.event_name == 'pull_request_target' && github.actor == 'dependabot[bot]'
     uses: apache/logging-parent/.github/workflows/build-reusable.yaml@main
 
   merge-dependabot:
diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml
index 106c3b8..e8c02ef 100644
--- a/.github/workflows/scorecards-analysis.yml
+++ b/.github/workflows/scorecards-analysis.yml
@@ -67,6 +67,6 @@
           retention-days: 5
 
       - name: "Upload to code-scanning"
-        uses: github/codeql-action/upload-sarif@ddccb873888234080b77e9bc2d4764d5ccaaccf9    # 2.1.22
+        uses: github/codeql-action/upload-sarif@2cb752a87e96af96708ab57187ab6372ee1973ab    # 2.1.22
         with:
           sarif_file: results.sarif
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/WriterAppender.java b/log4j-1.2-api/src/main/java/org/apache/log4j/WriterAppender.java
index 065ab20..3eeb3b0 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/WriterAppender.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/WriterAppender.java
@@ -20,6 +20,7 @@
 import java.io.InterruptedIOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
 import java.io.Writer;
 
 import org.apache.log4j.helpers.QuietWriter;
@@ -242,12 +243,8 @@
         if (enc != null) {
             try {
                 retval = new OutputStreamWriter(os, enc);
-            } catch (IOException e) {
-                if (e instanceof InterruptedIOException) {
-                    Thread.currentThread().interrupt();
-                }
-                LOGGER.warn("Error initializing output writer.");
-                LOGGER.warn("Unsupported encoding?");
+            } catch (final UnsupportedEncodingException e) {
+                LOGGER.warn("Error initializing output writer: encoding {} is not supported.", enc, e);
             }
         }
         if (retval == null) {
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/spi/LocationInfo.java b/log4j-1.2-api/src/main/java/org/apache/log4j/spi/LocationInfo.java
index 65345cf..1fc0b40 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/spi/LocationInfo.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/spi/LocationInfo.java
@@ -19,6 +19,8 @@
 import java.io.Serializable;
 import java.util.Objects;
 
+import org.apache.logging.log4j.core.util.Integers;
+
 /**
  * The internal representation of caller location information.
  *
@@ -101,35 +103,40 @@
                 prevClass = thisClass;
             }
         }
-        this.stackTraceElement = new StackTraceElement(declaringClass, methodName, file, Integer.parseInt(line));
-        this.fullInfo = stackTraceElement.toString();
+        if (declaringClass != null && methodName != null) {
+            this.stackTraceElement = new StackTraceElement(declaringClass, methodName, file, Integers.parseInt(line));
+            this.fullInfo = stackTraceElement.toString();
+        } else {
+            this.stackTraceElement = null;
+            this.fullInfo = null;
+        }
     }
 
     /**
      * Gets the fully qualified class name of the caller making the logging request.
      */
     public String getClassName() {
-        return stackTraceElement.getClassName();
+        return stackTraceElement != null ? stackTraceElement.getClassName() : NA;
     }
 
     /**
      * Gets the file name of the caller.
      */
     public String getFileName() {
-        return stackTraceElement.getFileName();
+        return stackTraceElement != null ? stackTraceElement.getFileName() : NA;
     }
 
     /**
      * Gets the line number of the caller.
      */
     public String getLineNumber() {
-        return Integer.toString(stackTraceElement.getLineNumber());
+        return stackTraceElement != null ? Integer.toString(stackTraceElement.getLineNumber()) : NA;
     }
 
     /**
      * Gets the method name of the caller.
      */
     public String getMethodName() {
-        return stackTraceElement.getMethodName();
+        return stackTraceElement != null ? stackTraceElement.getMethodName() : NA;
     }
 }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java
index c0b46c7..2dc5c4b 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java
@@ -16,23 +16,13 @@
  */
 package org.apache.logging.log4j.util;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InvalidObjectException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.StreamCorruptedException;
+import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.ConcurrentModificationException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.logging.log4j.status.StatusLogger;
 
 /**
@@ -545,6 +535,8 @@
         }
     }
 
+    @SuppressFBWarnings(value = "OBJECT_DESERIALIZATION", justification = "Object deserialization uses either Java 9 " +
+            "native filter or our custom filter to limit the kinds of classes deserialized.")
     private static Object unmarshall(final byte[] data, final ObjectInputStream inputStream)
             throws IOException, ClassNotFoundException {
         final ByteArrayInputStream bin = new ByteArrayInputStream(data);
diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/appender/db/jdbc/JdbcH2TestHelper.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/appender/db/jdbc/JdbcH2TestHelper.java
index df9bad6..6e78995 100644
--- a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/appender/db/jdbc/JdbcH2TestHelper.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/appender/db/jdbc/JdbcH2TestHelper.java
@@ -23,6 +23,7 @@
 import java.sql.DriverManager;
 import java.sql.SQLException;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.commons.io.file.PathUtils;
 import org.apache.commons.lang3.SystemUtils;
 import org.apache.logging.log4j.core.appender.db.jdbc.AbstractConnectionSource;
@@ -67,10 +68,12 @@
         }
     }
 
+    @SuppressFBWarnings(value = "DMI_EMPTY_DB_PASSWORD")
     public static Connection getConnectionInMemory() throws SQLException {
         return DriverManager.getConnection(CONNECTION_STRING_IN_MEMORY, USER_NAME, PASSWORD);
     }
 
+    @SuppressFBWarnings(value = "DMI_EMPTY_DB_PASSWORD")
     public static Connection getConnectionTempDir() throws SQLException {
         return DriverManager.getConnection(CONNECTION_STRING_TEMP_DIR, USER_NAME, PASSWORD);
     }
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTempCompressedFilePatternTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTempCompressedFilePatternTest.java
index c0024d1..8804cd3 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTempCompressedFilePatternTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTempCompressedFilePatternTest.java
@@ -16,70 +16,50 @@
  */
 package org.apache.logging.log4j.core.appender.rolling;
 
-import java.io.File;
 import java.nio.file.FileSystems;
 import java.nio.file.Path;
 import java.nio.file.StandardWatchEventKinds;
 import java.nio.file.WatchEvent;
 import java.nio.file.WatchKey;
 import java.nio.file.WatchService;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
 
-import org.apache.commons.lang3.SystemUtils;
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
-import org.junit.Assume;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.RuleChain;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.apache.logging.log4j.test.junit.TempLoggingDir;
+import org.apache.logging.log4j.test.junit.UsingStatusListener;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
 
-import static org.apache.logging.log4j.core.test.hamcrest.Descriptors.that;
-import static org.apache.logging.log4j.core.test.hamcrest.FileMatchers.hasName;
-import static org.hamcrest.Matchers.endsWith;
-import static org.hamcrest.Matchers.hasItemInArray;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
+import static org.assertj.core.api.Assertions.assertThat;
 /**
  * LOG4J2-1766.
  */
+@UsingStatusListener
+@DisabledOnOs(value = OS.MAC, disabledReason = "FileWatcher is not fast enough on macOS for this test")
 public class RollingAppenderDirectWriteTempCompressedFilePatternTest {
 
-    private static final String CONFIG = "log4j-rolling-direct-tmp-compress-folder.xml";
+    private final String PATTERN = "test-\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d+\\.log\\.gz";
+    private final Pattern FILE_PATTERN = Pattern.compile(PATTERN);
+    private final Pattern TMP_PATTERN = Pattern.compile(PATTERN + "\\.tmp");
 
-    private static final String DIR = "target/rolling-direct";
-
-    public static LoggerContextRule loggerContextRule = LoggerContextRule
-            .createShutdownTimeoutLoggerContextRule(CONFIG);
-
-    @Rule
-    public RuleChain chain = loggerContextRule.withCleanFoldersRule(DIR);
-
-    private Logger logger;
-
-    @Before
-    public void setUp() throws Exception {
-        // Disable this test on MacOS. FileWatcher isn't fast enough to work properly.
-        Assume.assumeTrue(!SystemUtils.IS_OS_MAC_OSX);
-        this.logger = loggerContextRule.getLogger(RollingAppenderDirectWriteTest.class.getName());
-    }
+    @TempLoggingDir
+    private Path loggingPath;
 
     @Test
-    public void testAppender() throws Exception {
-        final File dir = new File(DIR);
-        dir.mkdirs();
+    @LoggerContextSource
+    public void testAppender(final LoggerContext ctx) throws Exception {
+        final Logger logger = ctx.getLogger(getClass());
         try (final WatchService watcher = FileSystems.getDefault().newWatchService()) {
-            WatchKey key = dir.toPath().register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
+            WatchKey key = loggingPath.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
 
             for (int i = 0; i < 100; ++i) {
-                logger.debug("This is test message number " + i);
+                logger.debug("This is test message number {}.", i);
             }
-            Thread.sleep(50);
-            assertTrue("Directory not created", dir.exists() && dir.listFiles().length > 0);
-            final File[] files = dir.listFiles();
-            assertNotNull(files);
-            assertThat(files, hasItemInArray(that(hasName(that(endsWith(".gz"))))));
+            ctx.stop(500, TimeUnit.MILLISECONDS);
 
             int temporaryFilesCreated = 0;
             int compressedFiles = 0;
@@ -87,17 +67,18 @@
 
             for (final WatchEvent<?> event : key.pollEvents()) {
                 final WatchEvent<Path> ev = (WatchEvent<Path>) event;
-                final Path filename = ev.context();
-                if (filename.toString().endsWith(".tmp")) {
+                final String filename = ev.context().getFileName().toString();
+                if (TMP_PATTERN.matcher(filename).matches()) {
                     temporaryFilesCreated++;
                 }
-                if (filename.toString().endsWith(".gz")) {
+                if (FILE_PATTERN.matcher(filename).matches()) {
                     compressedFiles++;
                 }
             }
-            assertTrue("No temporary file created during compression", temporaryFilesCreated > 0);
-            assertTrue("Temporarys file created not equals to compressed files",
-                    compressedFiles == temporaryFilesCreated);
+            assertThat(temporaryFilesCreated)
+                    .as("Temporary files created.")
+                    .isGreaterThan(0)
+                    .isEqualTo(compressedFiles);
         }
     }
 }
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTest.java
index b67aa2e..aa0c02e 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTest.java
@@ -17,78 +17,61 @@
 package org.apache.logging.log4j.core.appender.rolling;
 
 import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
+import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
 import java.util.zip.GZIPInputStream;
 
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.RuleChain;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.apache.logging.log4j.test.junit.TempLoggingDir;
+import org.apache.logging.log4j.test.junit.UsingStatusListener;
+import org.junit.jupiter.api.Test;
 
-import static org.apache.logging.log4j.core.test.hamcrest.Descriptors.that;
-import static org.apache.logging.log4j.core.test.hamcrest.FileMatchers.hasName;
-import static org.hamcrest.Matchers.endsWith;
-import static org.hamcrest.Matchers.hasItemInArray;
-import static org.junit.Assert.*;
+import static java.nio.charset.StandardCharsets.UTF_8;
 
-/**
- *
- */
+import static org.assertj.core.api.Assertions.assertThat;
+
+@UsingStatusListener
 public class RollingAppenderDirectWriteTest {
 
-    private static final String CONFIG = "log4j-rolling-direct.xml";
+    private final Pattern FILE_PATTERN = Pattern.compile("test-\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d+\\.log(\\.gz)?");
+    private final Pattern LINE_PATTERN = Pattern.compile("This is test message number \\d+\\.");
 
-    private static final String DIR = "target/rolling-direct";
-
-    public static LoggerContextRule loggerContextRule = LoggerContextRule.createShutdownTimeoutLoggerContextRule(CONFIG);
-
-    @Rule
-    public RuleChain chain = loggerContextRule.withCleanFoldersRule(DIR);
-
-    private Logger logger;
-
-    @Before
-    public void setUp() throws Exception {
-        this.logger = loggerContextRule.getLogger(RollingAppenderDirectWriteTest.class.getName());
-    }
+    @TempLoggingDir
+    private Path loggingPath;
 
     @Test
-    public void testAppender() throws Exception {
+    @LoggerContextSource
+    public void testAppender(final LoggerContext ctx) throws Exception {
+        final Logger logger = ctx.getLogger(getClass());
         final int count = 100;
         for (int i=0; i < count; ++i) {
-            logger.debug("This is test message number " + i);
+            logger.debug("This is test message number {}.", i);
         }
-        Thread.sleep(50);
-        final File dir = new File(DIR);
-        assertTrue("Directory not created", dir.exists() && dir.listFiles().length > 0);
-        final File[] files = dir.listFiles();
-        assertNotNull(files);
-        assertThat(files, hasItemInArray(that(hasName(that(endsWith(".gz"))))));
+        ctx.stop(500, TimeUnit.MILLISECONDS);
         int found = 0;
-        for (final File file: files) {
-            final String actual = file.getName();
-            BufferedReader reader;
-            if (file.getName().endsWith(".gz")) {
-                reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(file))));
-            } else {
-                reader = new BufferedReader(new FileReader(file));
+        try (final DirectoryStream<Path> stream = Files.newDirectoryStream(loggingPath)) {
+            for (final Path file: stream) {
+                final String fileName = file.getFileName().toString();
+                assertThat(fileName).matches(FILE_PATTERN);
+                try (final InputStream is = Files.newInputStream(file);
+                     final InputStream uncompressed = fileName.endsWith(".gz") ? new GZIPInputStream(is) : is;
+                     final BufferedReader reader = new BufferedReader(new InputStreamReader(uncompressed, UTF_8))) {
+                    String line;
+                    while ((line = reader.readLine()) != null) {
+                        assertThat(line).matches(LINE_PATTERN);
+                        ++found;
+                    }
+                }
             }
-            String line;
-            while ((line = reader.readLine()) != null) {
-                assertNotNull("No log event in file " + actual, line);
-                final String[] parts = line.split((" "));
-                final String expected = "test1-" + parts[0];
-                assertTrue("Incorrect file name. Expected file prefix: " + expected + " Actual: " + actual,
-                    actual.startsWith(expected));
-                ++found;
-            }
-            reader.close();
         }
-        assertEquals("Incorrect number of events read. Expected " + count + ", Actual " + found, count, found);
+
+        assertThat(found).as("Number of events.").isEqualTo(count);
     }
 }
diff --git a/log4j-core-test/src/test/resources/log4j-rolling-direct-tmp-compress-folder.xml b/log4j-core-test/src/test/resources/log4j-rolling-direct-tmp-compress-folder.xml
deleted file mode 100644
index 7d0b6fa..0000000
--- a/log4j-core-test/src/test/resources/log4j-rolling-direct-tmp-compress-folder.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to you under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<Configuration status="WARN" name="XMLConfigTest">
-  <Properties>
-    <Property name="logDir">target/rolling-direct</Property>
-  </Properties>
-  <ThresholdFilter level="debug"/>
-
-  <Appenders>
-    <Console name="STDOUT">
-      <PatternLayout pattern="%m%n"/>
-    </Console>
-    <RollingFile name="RollingFile" filePattern="${logDir}/test1-%d{MM-dd-yy-HH-mm}-%i.log.gz">
-      <PatternLayout>
-        <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
-      </PatternLayout>
-      <Policies>
-        <TimeBasedTriggeringPolicy />
-        <SizeBasedTriggeringPolicy size="500" />
-      </Policies>
-      <DirectWriteRolloverStrategy
-      	 tempCompressedFilePattern="${logDir}/test1-%d{MM-dd-yy-HH-mm}-%i.log.gz.tmp"/>
-    </RollingFile>
-  </Appenders>
-
-  <Loggers>
-    <Logger name="org.apache.logging.log4j.core.appender.rolling" level="debug" additivity="false">
-      <AppenderRef ref="RollingFile"/>
-    </Logger>>
-
-    <Root level="error">
-      <AppenderRef ref="STDOUT"/>
-    </Root>
-  </Loggers>
-
-</Configuration>
diff --git a/log4j-core-test/src/test/resources/log4j-rolling-direct.xml b/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTempCompressedFilePatternTest.xml
similarity index 63%
rename from log4j-core-test/src/test/resources/log4j-rolling-direct.xml
rename to log4j-core-test/src/test/resources/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTempCompressedFilePatternTest.xml
index 077e6e1..4366d96 100644
--- a/log4j-core-test/src/test/resources/log4j-rolling-direct.xml
+++ b/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTempCompressedFilePatternTest.xml
@@ -15,35 +15,21 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<Configuration status="WARN" name="XMLConfigTest">
-  <Properties>
-    <Property name="logDir">target/rolling-direct</Property>
-  </Properties>
-  <ThresholdFilter level="debug"/>
-
+<Configuration status="OFF" name="RollingAppenderDirectWriteTempCompressedFilePatternTest">
   <Appenders>
-    <Console name="STDOUT">
-      <PatternLayout pattern="%m%n"/>
-    </Console>
-    <RollingFile name="RollingFile" filePattern="${logDir}/test1-%d{MM-dd-yy-HH-mm}-%i.log.gz">
-      <PatternLayout>
-        <Pattern>%d{MM-dd-yy-HH-mm} %p %C{1.} [%t] %m%n</Pattern>
-      </PatternLayout>
+    <RollingFile name="RollingFile" filePattern="${test:logging.path}/test-%d{yyyy-MM-dd'T'hh-mm}-%i.log.gz">
+      <PatternLayout/>
       <Policies>
         <TimeBasedTriggeringPolicy />
         <SizeBasedTriggeringPolicy size="500" />
       </Policies>
+      <DirectWriteRolloverStrategy tempCompressedFilePattern="${test:logging.path}/test-%d{yyyy-MM-dd'T'hh-mm}-%i.log.gz.tmp"/>
     </RollingFile>
   </Appenders>
 
   <Loggers>
-    <Logger name="org.apache.logging.log4j.core.appender.rolling" level="debug" additivity="false">
+    <Root level="DEBUG">
       <AppenderRef ref="RollingFile"/>
-    </Logger>>
-
-    <Root level="error">
-      <AppenderRef ref="STDOUT"/>
     </Root>
   </Loggers>
-
 </Configuration>
diff --git a/src/changelog/2.21.0/.release.xml b/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTest.xml
similarity index 63%
rename from src/changelog/2.21.0/.release.xml
rename to log4j-core-test/src/test/resources/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTest.xml
index ea3f6fe..f830c27 100644
--- a/src/changelog/2.21.0/.release.xml
+++ b/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteTest.xml
@@ -15,7 +15,20 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<release xmlns="http://logging.apache.org/log4j/changelog"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://logging.apache.org/log4j/changelog https://logging.apache.org/log4j/changelog-0.1.0.xsd"
-         date="2023-10-09" version="2.21.0"/>
+<Configuration status="OFF" name="RollingAppenderDirectWriteTest">
+  <Appenders>
+    <RollingFile name="RollingFile" filePattern="${test:logging.path}/test-%d{yyyy-MM-dd'T'hh-mm}-%i.log.gz">
+      <PatternLayout/>
+      <Policies>
+        <TimeBasedTriggeringPolicy />
+        <SizeBasedTriggeringPolicy size="500" />
+      </Policies>
+    </RollingFile>
+  </Appenders>
+
+  <Loggers>
+    <Root level="DEBUG">
+      <AppenderRef ref="RollingFile"/>
+    </Root>
+  </Loggers>
+</Configuration>
diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAvroManager.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAvroManager.java
index d3dff8e..f14a10c 100644
--- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAvroManager.java
+++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAvroManager.java
@@ -205,7 +205,7 @@
         } else {
             int eventCount;
             BatchEvent batch = null;
-            synchronized(batchEvent) {
+            synchronized(this) {
                 batchEvent.addEvent(event);
                 eventCount = batchEvent.size();
                 final long now = System.nanoTime();
diff --git a/log4j-osgi/pom.xml b/log4j-osgi/pom.xml
index c7d6dc1..516468d 100644
--- a/log4j-osgi/pom.xml
+++ b/log4j-osgi/pom.xml
@@ -31,7 +31,6 @@
     <docLabel>OSGi Documentation</docLabel>
     <projectDir>/osgi</projectDir>
     <module.name>org.apache.logging.log4j.osgi</module.name>
-    <skipTests>true</skipTests>
     <bnd.baseline.skip>true</bnd.baseline.skip>
     <maven.deploy.skip>true</maven.deploy.skip>
     <maven.install.skip>true</maven.install.skip>
diff --git a/log4j-parent/pom.xml b/log4j-parent/pom.xml
index 27c17fe..e138578 100644
--- a/log4j-parent/pom.xml
+++ b/log4j-parent/pom.xml
@@ -1027,6 +1027,12 @@
       <scope>provided</scope>
     </dependency>
 
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
   </dependencies>
 
   <build>
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AnnotationVsMarkerInterface.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AnnotationVsMarkerInterface.java
index 09e1aad..da10554 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AnnotationVsMarkerInterface.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AnnotationVsMarkerInterface.java
@@ -18,7 +18,6 @@
 
 import java.util.concurrent.TimeUnit;
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
 import org.apache.logging.log4j.util.StringMap;
@@ -58,7 +57,7 @@
     @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime, Mode.SingleShotTime})
     @OutputTimeUnit(TimeUnit.NANOSECONDS)
     public Object annotationMissing() {
-        return map.getClass().isAnnotationPresent(PerformanceSensitive.class);
+        return map.getClass().isAnnotationPresent(State.class);
     }
 
     @Benchmark
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java
index 1fefec6..21ac31b 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java
@@ -22,6 +22,7 @@
 import java.sql.Statement;
 import java.util.concurrent.TimeUnit;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
@@ -185,6 +186,7 @@
     /**
      * Referred from log4j2-jdbc-appender.xml.
      */
+    @SuppressFBWarnings("DMI_EMPTY_DB_PASSWORD")
     public static Connection getConnectionH2() throws Exception {
         Class.forName("org.h2.Driver");
         return DriverManager.getConnection("jdbc:h2:mem:Log4j", "sa", "");
@@ -193,6 +195,7 @@
     /**
      * Referred from log4j2-jdbc-appender.xml.
      */
+    @SuppressFBWarnings("DMI_EMPTY_DB_PASSWORD")
     public static Connection getConnectionHSQLDB() throws Exception {
         Class.forName("org.hsqldb.jdbcDriver");
         return DriverManager.getConnection("jdbc:hsqldb:mem:Log4j", "sa", "");
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java
index 156cf14..13fd981 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java
@@ -22,6 +22,7 @@
 import java.sql.Statement;
 import java.util.concurrent.TimeUnit;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
@@ -165,6 +166,7 @@
     /**
      * Referred from log4j2-jdbc-appender.xml.
      */
+    @SuppressFBWarnings("DMI_EMPTY_DB_PASSWORD")
     public static Connection getConnectionH2() throws Exception {
         Class.forName("org.h2.Driver");
         final Connection connection = DriverManager.getConnection("jdbc:h2:mem:Log4j;MODE=PostgreSQL", "sa", "");
@@ -182,6 +184,7 @@
     /**
      * Referred from log4j2-jdbc-appender.xml.
      */
+    @SuppressFBWarnings("DMI_EMPTY_DB_PASSWORD")
     public static Connection getConnectionHSQLDB() throws Exception {
         Class.forName("org.hsqldb.jdbcDriver");
         final Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:Log4j", "sa", "");
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadsafeDateFormatBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadsafeDateFormatBenchmark.java
index 0fedadf..24fdce0 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadsafeDateFormatBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadsafeDateFormatBenchmark.java
@@ -90,7 +90,7 @@
         }
     }
 
-    private class FormatterSimple {
+    private static class FormatterSimple {
         private final SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss.SSS");
         private long timestamp;
         private String formatted;
@@ -108,7 +108,7 @@
         }
     }
 
-    private class FormatterFixedReuseBuffer {
+    private static class FormatterFixedReuseBuffer {
         private final FixedDateFormat customFormat = FixedDateFormat.createIfSupported("HH:mm:ss.SSS");
         private long timestamp;
         private String formatted;
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcMessage.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcMessage.java
index 5fde05c..2e86999 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcMessage.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcMessage.java
@@ -24,7 +24,7 @@
  * Reusable Message..
  */
 public class NoGcMessage implements Message {
-    class InternalState {
+    static class InternalState {
         private final Object[] params = new Object[10];
         private int paramCount;
         private final StringBuilder buffer = new StringBuilder(2048);
diff --git a/pom.xml b/pom.xml
index ee6cd2b..3dd6558 100644
--- a/pom.xml
+++ b/pom.xml
@@ -304,7 +304,7 @@
   <properties>
 
     <!-- project version -->
-    <revision>2.21.0</revision>
+    <revision>2.21.0-SNAPSHOT</revision>
 
     <!-- =================
          Common properties
@@ -387,7 +387,7 @@
     <flume.version>1.11.0</flume.version>
     <groovy.version>3.0.19</groovy.version>
     <guava.version>32.1.2-jre</guava.version>
-    <h2.version>2.2.222</h2.version>
+    <h2.version>2.2.224</h2.version>
     <hadoop.version>1.2.1</hadoop.version>
     <hamcrest.version>2.2</hamcrest.version>
     <HdrHistogram.version>2.1.12</HdrHistogram.version>
@@ -411,7 +411,7 @@
     <jconsole.version>1.7.0</jconsole.version>
     <jctools.version>4.0.1</jctools.version>
     <je.version>18.3.12</je.version>
-    <jeromq.version>0.5.3</jeromq.version>
+    <jeromq.version>0.5.4</jeromq.version>
     <jetty.version>9.4.52.v20230823</jetty.version>
     <jmdns.version>3.5.8</jmdns.version>
     <jmh.version>1.37</jmh.version>
@@ -438,8 +438,8 @@
     <pax-exam.version>4.13.5</pax-exam.version>
     <plexus-utils.version>3.5.0</plexus-utils.version>
     <slf4j.version>1.7.36</slf4j.version>
-    <spring-boot.version>2.7.15</spring-boot.version>
-    <spring-framework.version>5.3.29</spring-framework.version>
+    <spring-boot.version>2.7.16</spring-boot.version>
+    <spring-framework.version>5.3.30</spring-framework.version>
     <system-stubs.version>2.0.2</system-stubs.version>
     <tomcat-juli.version>10.0.27</tomcat-juli.version>
     <velocity.version>1.7</velocity.version>
@@ -455,7 +455,7 @@
          the independence of transitive dependencies from the order
          of dependencies (requireUpperBoundDeps rule).
          ===================================================== -->
-    <asm.version>9.5</asm.version>
+    <asm.version>9.6</asm.version>
     <byte-buddy.version>1.14.8</byte-buddy.version>
     <commons-httpclient.version>3.1</commons-httpclient.version>
     <commons-pool2.version>2.11.1</commons-pool2.version>
diff --git a/src/changelog/.2.x.x/.release-notes.adoc.ftl b/src/changelog/.2.x.x/.release-notes.adoc.ftl
index 1fb73e8..4bef52a 100644
--- a/src/changelog/.2.x.x/.release-notes.adoc.ftl
+++ b/src/changelog/.2.x.x/.release-notes.adoc.ftl
@@ -15,30 +15,32 @@
     limitations under the License.
 ////
 
-////
-    ██     ██  █████  ██████  ███    ██ ██ ███    ██  ██████  ██
-    ██     ██ ██   ██ ██   ██ ████   ██ ██ ████   ██ ██       ██
-    ██  █  ██ ███████ ██████  ██ ██  ██ ██ ██ ██  ██ ██   ███ ██
-    ██ ███ ██ ██   ██ ██   ██ ██  ██ ██ ██ ██  ██ ██ ██    ██
-     ███ ███  ██   ██ ██   ██ ██   ████ ██ ██   ████  ██████  ██
-
-    IF THIS FILE DOESN'T HAVE A `.ftl` SUFFIX, IT IS AUTO-GENERATED, DO NOT EDIT IT!
-
-    Version-specific release notes (`7.8.0.adoc`, etc.) are generated from `src/changelog/*/.release-notes.adoc.ftl`.
-    Auto-generation happens during `generate-sources` phase of Maven.
-    Hence, you must always
-
-    1. Find and edit the associated `.release-notes.adoc.ftl`
-    2. Run `./mvnw generate-sources`
-    3. Commit both `.release-notes.adoc.ftl` and the generated `7.8.0.adoc`
-////
-
 [#release-notes-${release.version?replace("[^a-zA-Z0-9]", "-", "r")}]
 == ${release.version}
 
 <#if release.date?has_content>Release date:: ${release.date}</#if>
 
-This is a placeholder introduction to these release notes.
-This will be updated prior to the release.
+This release primarily focuses on enhancements to our OSGi and JPMS support and contains several bug fixes.
+It will be the first release built and signed by the CI using the https://keyserver.ubuntu.com/pks/lookup?search=077E8893A6DCC33DD4A4D5B256E73BA9A0B592D0&op=index[ASF Logging Services Release Manager GPG key], which is shared in https://www.apache.org/dist/logging/KEYS[KEYS].
+
+The Log4j 2.21.0 API, as well as the other artifacts, maintains binary compatibility with the previous release.
+
+Apache Log4j 2.21.0 requires Java 8 to run.
+The build requires JDK 11 and generates reproducible binaries.
+
+For complete information on Apache Log4j 2, including instructions on how to submit bug reports, patches, get support, or suggestions for improvement, see http://logging.apache.org/log4j/2.x/[the Apache Log4j 2 website].
+
+=== OSGi changes
+
+All the published artifacts are OSGi bundles or fragments.
+
+This release introduces a change in the bundle symbolic names to allow them to function as JPMS module name: all hyphens `-` present in the bundle names of previous releases were replaced by dots `.`.
+
+=== JPMS changes
+
+All the published artifacts have been migrated from automatic modules to named JPMS modules.
+All packages marked as private in the Javadoc are not exported.
+
+The module name of four bridges (`log4j-slf4j-impl`, `log4j-slf4j2-impl`, `log4j-to-jul` and `log4j-to-slf4j`) have been changed to adhere to the same convention as the OSGi bundle names.
 
 <#include "../.changelog.adoc.ftl">
diff --git a/src/changelog/2.21.0/1231_validation_path_condition.xml b/src/changelog/.2.x.x/1231_validation_path_condition.xml
similarity index 100%
rename from src/changelog/2.21.0/1231_validation_path_condition.xml
rename to src/changelog/.2.x.x/1231_validation_path_condition.xml
diff --git a/src/changelog/2.21.0/1232_log4j-to-sfl4j-2-OSGiMetadata.xml b/src/changelog/.2.x.x/1232_log4j-to-sfl4j-2-OSGiMetadata.xml
similarity index 100%
rename from src/changelog/2.21.0/1232_log4j-to-sfl4j-2-OSGiMetadata.xml
rename to src/changelog/.2.x.x/1232_log4j-to-sfl4j-2-OSGiMetadata.xml
diff --git a/src/changelog/2.21.0/1275_fix-javadoc.xml b/src/changelog/.2.x.x/1275_fix-javadoc.xml
similarity index 100%
rename from src/changelog/2.21.0/1275_fix-javadoc.xml
rename to src/changelog/.2.x.x/1275_fix-javadoc.xml
diff --git a/src/changelog/2.21.0/1281_remove_locale-dependent_toLowerCase.xml b/src/changelog/.2.x.x/1281_remove_locale-dependent_toLowerCase.xml
similarity index 100%
rename from src/changelog/2.21.0/1281_remove_locale-dependent_toLowerCase.xml
rename to src/changelog/.2.x.x/1281_remove_locale-dependent_toLowerCase.xml
diff --git a/src/changelog/2.21.0/1284_redirect_old_javadoc_urls.xml b/src/changelog/.2.x.x/1284_redirect_old_javadoc_urls.xml
similarity index 100%
rename from src/changelog/2.21.0/1284_redirect_old_javadoc_urls.xml
rename to src/changelog/.2.x.x/1284_redirect_old_javadoc_urls.xml
diff --git a/src/changelog/2.21.0/1312_add_environment_arbiter.xml b/src/changelog/.2.x.x/1312_add_environment_arbiter.xml
similarity index 100%
rename from src/changelog/2.21.0/1312_add_environment_arbiter.xml
rename to src/changelog/.2.x.x/1312_add_environment_arbiter.xml
diff --git a/src/changelog/2.21.0/1365_open-FileExtension.xml b/src/changelog/.2.x.x/1365_open-FileExtension.xml
similarity index 100%
rename from src/changelog/2.21.0/1365_open-FileExtension.xml
rename to src/changelog/.2.x.x/1365_open-FileExtension.xml
diff --git a/src/changelog/2.21.0/1366_fix_java_sql_date.xml b/src/changelog/.2.x.x/1366_fix_java_sql_date.xml
similarity index 100%
rename from src/changelog/2.21.0/1366_fix_java_sql_date.xml
rename to src/changelog/.2.x.x/1366_fix_java_sql_date.xml
diff --git a/src/changelog/2.21.0/1367_Missing-Bundle-Activation-OSGiMetadata.xml b/src/changelog/.2.x.x/1367_Missing-Bundle-Activation-OSGiMetadata.xml
similarity index 100%
rename from src/changelog/2.21.0/1367_Missing-Bundle-Activation-OSGiMetadata.xml
rename to src/changelog/.2.x.x/1367_Missing-Bundle-Activation-OSGiMetadata.xml
diff --git a/src/changelog/2.21.0/1369_bump_build_requirement_jdk_11.xml b/src/changelog/.2.x.x/1369_bump_build_requirement_jdk_11.xml
similarity index 100%
rename from src/changelog/2.21.0/1369_bump_build_requirement_jdk_11.xml
rename to src/changelog/.2.x.x/1369_bump_build_requirement_jdk_11.xml
diff --git a/src/changelog/2.21.0/1380_StackTraceStringResolver_uses_instance_after_recycling.xml b/src/changelog/.2.x.x/1380_StackTraceStringResolver_uses_instance_after_recycling.xml
similarity index 100%
rename from src/changelog/2.21.0/1380_StackTraceStringResolver_uses_instance_after_recycling.xml
rename to src/changelog/.2.x.x/1380_StackTraceStringResolver_uses_instance_after_recycling.xml
diff --git a/src/changelog/2.21.0/1381_support_parents_in_MarkerResolver.xml b/src/changelog/.2.x.x/1381_support_parents_in_MarkerResolver.xml
similarity index 100%
rename from src/changelog/2.21.0/1381_support_parents_in_MarkerResolver.xml
rename to src/changelog/.2.x.x/1381_support_parents_in_MarkerResolver.xml
diff --git a/src/changelog/2.21.0/1389_Added_missing_setter_for_connectionStringSource_in_MongoDb4Provider.xml b/src/changelog/.2.x.x/1389_Added_missing_setter_for_connectionStringSource_in_MongoDb4Provider.xml
similarity index 100%
rename from src/changelog/2.21.0/1389_Added_missing_setter_for_connectionStringSource_in_MongoDb4Provider.xml
rename to src/changelog/.2.x.x/1389_Added_missing_setter_for_connectionStringSource_in_MongoDb4Provider.xml
diff --git a/src/changelog/2.21.0/1391_fix_NPE_in_PluginElementVisitor.xml b/src/changelog/.2.x.x/1391_fix_NPE_in_PluginElementVisitor.xml
similarity index 100%
rename from src/changelog/2.21.0/1391_fix_NPE_in_PluginElementVisitor.xml
rename to src/changelog/.2.x.x/1391_fix_NPE_in_PluginElementVisitor.xml
diff --git a/src/changelog/2.21.0/1405_column_mapping_rename_type_attribute.xml b/src/changelog/.2.x.x/1405_column_mapping_rename_type_attribute.xml
similarity index 94%
rename from src/changelog/2.21.0/1405_column_mapping_rename_type_attribute.xml
rename to src/changelog/.2.x.x/1405_column_mapping_rename_type_attribute.xml
index e84af13..a686a36 100644
--- a/src/changelog/2.21.0/1405_column_mapping_rename_type_attribute.xml
+++ b/src/changelog/.2.x.x/1405_column_mapping_rename_type_attribute.xml
@@ -22,6 +22,6 @@
   <issue id="1405" link="https://github.com/apache/logging-log4j2/issues/1405"/>
   <author id="github:ppkarwasz"/>
   <description format="asciidoc">
-    Add `columnType` as alias for the column mapping `type` attribute.
+    Added `columnType` as alias for the column mapping `type` attribute
   </description>
 </entry>
diff --git a/src/changelog/2.21.0/1414_restore_SLF4J_Log4jMarker_visibility.xml b/src/changelog/.2.x.x/1414_restore_SLF4J_Log4jMarker_visibility.xml
similarity index 100%
rename from src/changelog/2.21.0/1414_restore_SLF4J_Log4jMarker_visibility.xml
rename to src/changelog/.2.x.x/1414_restore_SLF4J_Log4jMarker_visibility.xml
diff --git a/src/changelog/2.21.0/1418_fix_ArrayOutOfBound_in_Log4jFixedFormatter.xml b/src/changelog/.2.x.x/1418_fix_ArrayOutOfBound_in_Log4jFixedFormatter.xml
similarity index 100%
rename from src/changelog/2.21.0/1418_fix_ArrayOutOfBound_in_Log4jFixedFormatter.xml
rename to src/changelog/.2.x.x/1418_fix_ArrayOutOfBound_in_Log4jFixedFormatter.xml
diff --git a/src/changelog/2.21.0/1445_1549_fix_sync_roll_action_propagation.xml b/src/changelog/.2.x.x/1445_1549_fix_sync_roll_action_propagation.xml
similarity index 100%
rename from src/changelog/2.21.0/1445_1549_fix_sync_roll_action_propagation.xml
rename to src/changelog/.2.x.x/1445_1549_fix_sync_roll_action_propagation.xml
diff --git a/src/changelog/2.21.0/1445_fix_synchronous_rolling_file_manager.xml b/src/changelog/.2.x.x/1445_fix_synchronous_rolling_file_manager.xml
similarity index 98%
rename from src/changelog/2.21.0/1445_fix_synchronous_rolling_file_manager.xml
rename to src/changelog/.2.x.x/1445_fix_synchronous_rolling_file_manager.xml
index 4e446eb..573e5f6 100644
--- a/src/changelog/2.21.0/1445_fix_synchronous_rolling_file_manager.xml
+++ b/src/changelog/.2.x.x/1445_fix_synchronous_rolling_file_manager.xml
@@ -22,6 +22,6 @@
   <issue id="1445" link="https://github.com/apache/logging-log4j2/issues/1445"/>
   <author id="thisdudeiknew" name="Timothy Pfeifer"/>
   <description format="asciidoc">
-    Fixed `RollingFileManager` to propagate failed synchronous actions correctly.
+    Fixed `RollingFileManager` to propagate failed synchronous actions correctly
   </description>
 </entry>
diff --git a/src/changelog/2.21.0/1484_fix_StackLocator_stdout.xml b/src/changelog/.2.x.x/1484_fix_StackLocator_stdout.xml
similarity index 100%
rename from src/changelog/2.21.0/1484_fix_StackLocator_stdout.xml
rename to src/changelog/.2.x.x/1484_fix_StackLocator_stdout.xml
diff --git a/src/changelog/2.21.0/1485_fix_DatePatternConverter_when_TL_disabled.xml b/src/changelog/.2.x.x/1485_fix_DatePatternConverter_when_TL_disabled.xml
similarity index 100%
rename from src/changelog/2.21.0/1485_fix_DatePatternConverter_when_TL_disabled.xml
rename to src/changelog/.2.x.x/1485_fix_DatePatternConverter_when_TL_disabled.xml
diff --git a/src/changelog/2.21.0/1503_change_defaults_for_LevelRangeFilter.xml b/src/changelog/.2.x.x/1503_change_defaults_for_LevelRangeFilter.xml
similarity index 100%
rename from src/changelog/2.21.0/1503_change_defaults_for_LevelRangeFilter.xml
rename to src/changelog/.2.x.x/1503_change_defaults_for_LevelRangeFilter.xml
diff --git a/src/changelog/2.21.0/1508_fix-javadoc.xml b/src/changelog/.2.x.x/1508_fix-javadoc.xml
similarity index 100%
rename from src/changelog/2.21.0/1508_fix-javadoc.xml
rename to src/changelog/.2.x.x/1508_fix-javadoc.xml
diff --git a/src/changelog/2.21.0/1530_fix_runtime-dependencies_documentation.xml b/src/changelog/.2.x.x/1530_fix_runtime-dependencies_documentation.xml
similarity index 100%
rename from src/changelog/2.21.0/1530_fix_runtime-dependencies_documentation.xml
rename to src/changelog/.2.x.x/1530_fix_runtime-dependencies_documentation.xml
diff --git a/src/changelog/2.21.0/1533_set_fqcn_eventbuilder.xml b/src/changelog/.2.x.x/1533_set_fqcn_eventbuilder.xml
similarity index 100%
rename from src/changelog/2.21.0/1533_set_fqcn_eventbuilder.xml
rename to src/changelog/.2.x.x/1533_set_fqcn_eventbuilder.xml
diff --git a/src/changelog/2.21.0/1545_add_warn_in_case_of_incorrect_syntax_of_highlighting_style.xml b/src/changelog/.2.x.x/1545_add_warn_in_case_of_incorrect_syntax_of_highlighting_style.xml
similarity index 100%
rename from src/changelog/2.21.0/1545_add_warn_in_case_of_incorrect_syntax_of_highlighting_style.xml
rename to src/changelog/.2.x.x/1545_add_warn_in_case_of_incorrect_syntax_of_highlighting_style.xml
diff --git a/src/changelog/2.21.0/1550_multiple_filter_invocations.xml b/src/changelog/.2.x.x/1550_multiple_filter_invocations.xml
similarity index 100%
rename from src/changelog/2.21.0/1550_multiple_filter_invocations.xml
rename to src/changelog/.2.x.x/1550_multiple_filter_invocations.xml
diff --git a/src/changelog/2.21.0/1589_mongodb_tests.xml b/src/changelog/.2.x.x/1589_mongodb_tests.xml
similarity index 100%
rename from src/changelog/2.21.0/1589_mongodb_tests.xml
rename to src/changelog/.2.x.x/1589_mongodb_tests.xml
diff --git a/src/changelog/2.21.0/1626_parameter_format_rewrite.xml b/src/changelog/.2.x.x/1626_parameter_format_rewrite.xml
similarity index 100%
rename from src/changelog/2.21.0/1626_parameter_format_rewrite.xml
rename to src/changelog/.2.x.x/1626_parameter_format_rewrite.xml
diff --git a/src/changelog/2.21.0/1640_java_9_stack_trace_element.xml b/src/changelog/.2.x.x/1640_java_9_stack_trace_element.xml
similarity index 100%
rename from src/changelog/2.21.0/1640_java_9_stack_trace_element.xml
rename to src/changelog/.2.x.x/1640_java_9_stack_trace_element.xml
diff --git a/src/changelog/2.21.0/1646_unsafe_cleaner.xml b/src/changelog/.2.x.x/1646_unsafe_cleaner.xml
similarity index 100%
rename from src/changelog/2.21.0/1646_unsafe_cleaner.xml
rename to src/changelog/.2.x.x/1646_unsafe_cleaner.xml
diff --git a/src/changelog/2.21.0/1650_fix_rollover_strategy_log4j1.xml b/src/changelog/.2.x.x/1650_fix_rollover_strategy_log4j1.xml
similarity index 100%
rename from src/changelog/2.21.0/1650_fix_rollover_strategy_log4j1.xml
rename to src/changelog/.2.x.x/1650_fix_rollover_strategy_log4j1.xml
diff --git a/src/changelog/2.21.0/1681_fix_and_improve_lookup_docs.xml b/src/changelog/.2.x.x/1681_fix_and_improve_lookup_docs.xml
similarity index 100%
rename from src/changelog/2.21.0/1681_fix_and_improve_lookup_docs.xml
rename to src/changelog/.2.x.x/1681_fix_and_improve_lookup_docs.xml
diff --git a/src/changelog/2.21.0/1692_make_JTL_LocationAware.xml b/src/changelog/.2.x.x/1692_make_JTL_LocationAware.xml
similarity index 100%
rename from src/changelog/2.21.0/1692_make_JTL_LocationAware.xml
rename to src/changelog/.2.x.x/1692_make_JTL_LocationAware.xml
diff --git a/src/changelog/2.21.0/1747_mongodb4-long-collection-size-conifg.xml b/src/changelog/.2.x.x/1747_mongodb4-long-collection-size-conifg.xml
similarity index 100%
rename from src/changelog/2.21.0/1747_mongodb4-long-collection-size-conifg.xml
rename to src/changelog/.2.x.x/1747_mongodb4-long-collection-size-conifg.xml
diff --git a/src/changelog/2.21.0/1760_use_java_version_specific_warnings_in_StackLocator.xml b/src/changelog/.2.x.x/1760_use_java_version_specific_warnings_in_StackLocator.xml
similarity index 100%
rename from src/changelog/2.21.0/1760_use_java_version_specific_warnings_in_StackLocator.xml
rename to src/changelog/.2.x.x/1760_use_java_version_specific_warnings_in_StackLocator.xml
diff --git a/src/changelog/2.21.0/1782_allow_multiple_servletcontextlistener_instances.xml b/src/changelog/.2.x.x/1782_allow_multiple_servletcontextlistener_instances.xml
similarity index 98%
rename from src/changelog/2.21.0/1782_allow_multiple_servletcontextlistener_instances.xml
rename to src/changelog/.2.x.x/1782_allow_multiple_servletcontextlistener_instances.xml
index 50f3f61..4173122 100644
--- a/src/changelog/2.21.0/1782_allow_multiple_servletcontextlistener_instances.xml
+++ b/src/changelog/.2.x.x/1782_allow_multiple_servletcontextlistener_instances.xml
@@ -23,6 +23,6 @@
   <author name="Christian Seewald" id="github:cseewald"/>
   <author id="github:ppkarwasz"/>
   <description format="asciidoc">
-    Only shutdown Log4j after last `Log4jServletContextListener` is executed.
+    Only shutdown Log4j after last `Log4jServletContextListener` is executed
   </description>
 </entry>
diff --git a/src/changelog/2.21.0/1783_spring_arbiter_without_environment.xml b/src/changelog/.2.x.x/1783_spring_arbiter_without_environment.xml
similarity index 95%
rename from src/changelog/2.21.0/1783_spring_arbiter_without_environment.xml
rename to src/changelog/.2.x.x/1783_spring_arbiter_without_environment.xml
index 0065cce..610e255 100644
--- a/src/changelog/2.21.0/1783_spring_arbiter_without_environment.xml
+++ b/src/changelog/.2.x.x/1783_spring_arbiter_without_environment.xml
@@ -22,6 +22,6 @@
   <issue id="1783" link="https://github.com/apache/logging-log4j2/issues/1783"/>
   <author id="github:ppkarwasz"/>
   <description format="asciidoc">
-    Allow using Spring Arbiter without a Spring environment.
+    Allowed using Spring Arbiter without a Spring environment
   </description>
 </entry>
diff --git a/src/changelog/2.21.0/1786_fix_async_context_data_loss.xml b/src/changelog/.2.x.x/1786_fix_async_context_data_loss.xml
similarity index 100%
rename from src/changelog/2.21.0/1786_fix_async_context_data_loss.xml
rename to src/changelog/.2.x.x/1786_fix_async_context_data_loss.xml
diff --git a/src/changelog/2.21.0/1805_fix_NPE_in_JTL_LevelResolver.xml b/src/changelog/.2.x.x/1805_fix_NPE_in_JTL_LevelResolver.xml
similarity index 100%
rename from src/changelog/2.21.0/1805_fix_NPE_in_JTL_LevelResolver.xml
rename to src/changelog/.2.x.x/1805_fix_NPE_in_JTL_LevelResolver.xml
diff --git a/src/changelog/2.21.0/LOG4J2-170_Improve_XML_schema.xml b/src/changelog/.2.x.x/LOG4J2-170_Improve_XML_schema.xml
similarity index 100%
rename from src/changelog/2.21.0/LOG4J2-170_Improve_XML_schema.xml
rename to src/changelog/.2.x.x/LOG4J2-170_Improve_XML_schema.xml
diff --git a/src/changelog/2.21.0/LOG4J2-3217_fix_NPE_in_ContextSelector.xml b/src/changelog/.2.x.x/LOG4J2-3217_fix_NPE_in_ContextSelector.xml
similarity index 100%
rename from src/changelog/2.21.0/LOG4J2-3217_fix_NPE_in_ContextSelector.xml
rename to src/changelog/.2.x.x/LOG4J2-3217_fix_NPE_in_ContextSelector.xml
diff --git a/src/changelog/2.21.0/LOG4J2-3657_fix_TL_usage_in_AbstractLogger.xml b/src/changelog/.2.x.x/LOG4J2-3657_fix_TL_usage_in_AbstractLogger.xml
similarity index 100%
rename from src/changelog/2.21.0/LOG4J2-3657_fix_TL_usage_in_AbstractLogger.xml
rename to src/changelog/.2.x.x/LOG4J2-3657_fix_TL_usage_in_AbstractLogger.xml
diff --git a/src/changelog/2.21.0/LOG4J2-3660_fix_notEmpty_converter_for_empty_collections.xml b/src/changelog/.2.x.x/LOG4J2-3660_fix_notEmpty_converter_for_empty_collections.xml
similarity index 100%
rename from src/changelog/2.21.0/LOG4J2-3660_fix_notEmpty_converter_for_empty_collections.xml
rename to src/changelog/.2.x.x/LOG4J2-3660_fix_notEmpty_converter_for_empty_collections.xml
diff --git a/src/changelog/2.21.0/LOG4J2-3663_fix_file_descriptor_leak_on_Tomcat.xml b/src/changelog/.2.x.x/LOG4J2-3663_fix_file_descriptor_leak_on_Tomcat.xml
similarity index 100%
rename from src/changelog/2.21.0/LOG4J2-3663_fix_file_descriptor_leak_on_Tomcat.xml
rename to src/changelog/.2.x.x/LOG4J2-3663_fix_file_descriptor_leak_on_Tomcat.xml
diff --git a/src/changelog/2.21.0/OsgiServiceLocator_npe.xml b/src/changelog/.2.x.x/OsgiServiceLocator_npe.xml
similarity index 100%
rename from src/changelog/2.21.0/OsgiServiceLocator_npe.xml
rename to src/changelog/.2.x.x/OsgiServiceLocator_npe.xml
diff --git a/src/changelog/2.21.0/PreventResourceLeak.xml b/src/changelog/.2.x.x/PreventResourceLeak.xml
similarity index 100%
rename from src/changelog/2.21.0/PreventResourceLeak.xml
rename to src/changelog/.2.x.x/PreventResourceLeak.xml
diff --git a/src/changelog/2.21.0/new-release-process.xml b/src/changelog/.2.x.x/new-release-process.xml
similarity index 100%
rename from src/changelog/2.21.0/new-release-process.xml
rename to src/changelog/.2.x.x/new-release-process.xml
diff --git a/src/changelog/2.21.0/remove-jmx-gui.xml b/src/changelog/.2.x.x/remove-jmx-gui.xml
similarity index 100%
rename from src/changelog/2.21.0/remove-jmx-gui.xml
rename to src/changelog/.2.x.x/remove-jmx-gui.xml
diff --git a/src/changelog/2.21.0/update-1runtime-angus-activation.xml b/src/changelog/.2.x.x/update-1runtime-angus-activation.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-angus-activation.xml
rename to src/changelog/.2.x.x/update-1runtime-angus-activation.xml
diff --git a/src/changelog/2.21.0/update-1runtime-angus-mail.xml b/src/changelog/.2.x.x/update-1runtime-angus-mail.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-angus-mail.xml
rename to src/changelog/.2.x.x/update-1runtime-angus-mail.xml
diff --git a/src/changelog/2.21.0/update-1runtime-cassandra-driver.xml b/src/changelog/.2.x.x/update-1runtime-cassandra-driver.xml
similarity index 98%
rename from src/changelog/2.21.0/update-1runtime-cassandra-driver.xml
rename to src/changelog/.2.x.x/update-1runtime-cassandra-driver.xml
index f90c44d..c8f071a 100644
--- a/src/changelog/2.21.0/update-1runtime-cassandra-driver.xml
+++ b/src/changelog/.2.x.x/update-1runtime-cassandra-driver.xml
@@ -22,6 +22,6 @@
   <issue id="1591" link="https://github.com/apache/logging-log4j2/issues/1591"/>
   <author id="github:dependabot"/>
   <description format="asciidoc">
-    Update `com.datastax.cassandra:cassandra-driver-core` to version 3.11.5.
+    Update `com.datastax.cassandra:cassandra-driver-core` to version 3.11.5
   </description>
 </entry>
diff --git a/src/changelog/2.21.0/update-1runtime-cassandra.xml b/src/changelog/.2.x.x/update-1runtime-cassandra.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-cassandra.xml
rename to src/changelog/.2.x.x/update-1runtime-cassandra.xml
diff --git a/src/changelog/2.21.0/update-1runtime-commons-compress.xml b/src/changelog/.2.x.x/update-1runtime-commons-compress.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-commons-compress.xml
rename to src/changelog/.2.x.x/update-1runtime-commons-compress.xml
diff --git a/src/changelog/2.21.0/update-1runtime-commons-csv.xml b/src/changelog/.2.x.x/update-1runtime-commons-csv.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-commons-csv.xml
rename to src/changelog/.2.x.x/update-1runtime-commons-csv.xml
diff --git a/src/changelog/2.21.0/update-1runtime-jackson.xml b/src/changelog/.2.x.x/update-1runtime-jackson.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-jackson.xml
rename to src/changelog/.2.x.x/update-1runtime-jackson.xml
diff --git a/src/changelog/2.21.0/update-1runtime-jakarta-activation.xml b/src/changelog/.2.x.x/update-1runtime-jakarta-activation.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-jakarta-activation.xml
rename to src/changelog/.2.x.x/update-1runtime-jakarta-activation.xml
diff --git a/src/changelog/2.21.0/update-1runtime-jakarta-mail.xml b/src/changelog/.2.x.x/update-1runtime-jakarta-mail.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-jakarta-mail.xml
rename to src/changelog/.2.x.x/update-1runtime-jakarta-mail.xml
diff --git a/src/changelog/2.21.0/update-1runtime-jctools.xml b/src/changelog/.2.x.x/update-1runtime-jctools.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-jctools.xml
rename to src/changelog/.2.x.x/update-1runtime-jctools.xml
diff --git a/src/changelog/2.21.0/update-1runtime-kafka.xml b/src/changelog/.2.x.x/update-1runtime-kafka.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-kafka.xml
rename to src/changelog/.2.x.x/update-1runtime-kafka.xml
diff --git a/src/changelog/2.21.0/update-1runtime-kubernetes.xml b/src/changelog/.2.x.x/update-1runtime-kubernetes.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-kubernetes.xml
rename to src/changelog/.2.x.x/update-1runtime-kubernetes.xml
diff --git a/src/changelog/2.21.0/update-1runtime-mongodb.xml b/src/changelog/.2.x.x/update-1runtime-mongodb.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-mongodb.xml
rename to src/changelog/.2.x.x/update-1runtime-mongodb.xml
diff --git a/src/changelog/2.21.0/update-1runtime-netty.xml b/src/changelog/.2.x.x/update-1runtime-netty.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-netty.xml
rename to src/changelog/.2.x.x/update-1runtime-netty.xml
diff --git a/src/changelog/2.21.0/update-1runtime-spring-boot.xml b/src/changelog/.2.x.x/update-1runtime-spring-boot.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-spring-boot.xml
rename to src/changelog/.2.x.x/update-1runtime-spring-boot.xml
diff --git a/src/changelog/2.21.0/update-1runtime-spring-framework.xml b/src/changelog/.2.x.x/update-1runtime-spring-framework.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-spring-framework.xml
rename to src/changelog/.2.x.x/update-1runtime-spring-framework.xml
diff --git a/src/changelog/2.21.0/update-1runtime-tomcat-juli.xml b/src/changelog/.2.x.x/update-1runtime-tomcat-juli.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-tomcat-juli.xml
rename to src/changelog/.2.x.x/update-1runtime-tomcat-juli.xml
diff --git a/src/changelog/2.21.0/update-1runtime-woodstox.xml b/src/changelog/.2.x.x/update-1runtime-woodstox.xml
similarity index 100%
rename from src/changelog/2.21.0/update-1runtime-woodstox.xml
rename to src/changelog/.2.x.x/update-1runtime-woodstox.xml
diff --git a/src/changelog/2.21.0/.release-notes.adoc.ftl b/src/changelog/2.21.0/.release-notes.adoc.ftl
deleted file mode 100644
index 4bef52a..0000000
--- a/src/changelog/2.21.0/.release-notes.adoc.ftl
+++ /dev/null
@@ -1,46 +0,0 @@
-////
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         https://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-////
-
-[#release-notes-${release.version?replace("[^a-zA-Z0-9]", "-", "r")}]
-== ${release.version}
-
-<#if release.date?has_content>Release date:: ${release.date}</#if>
-
-This release primarily focuses on enhancements to our OSGi and JPMS support and contains several bug fixes.
-It will be the first release built and signed by the CI using the https://keyserver.ubuntu.com/pks/lookup?search=077E8893A6DCC33DD4A4D5B256E73BA9A0B592D0&op=index[ASF Logging Services Release Manager GPG key], which is shared in https://www.apache.org/dist/logging/KEYS[KEYS].
-
-The Log4j 2.21.0 API, as well as the other artifacts, maintains binary compatibility with the previous release.
-
-Apache Log4j 2.21.0 requires Java 8 to run.
-The build requires JDK 11 and generates reproducible binaries.
-
-For complete information on Apache Log4j 2, including instructions on how to submit bug reports, patches, get support, or suggestions for improvement, see http://logging.apache.org/log4j/2.x/[the Apache Log4j 2 website].
-
-=== OSGi changes
-
-All the published artifacts are OSGi bundles or fragments.
-
-This release introduces a change in the bundle symbolic names to allow them to function as JPMS module name: all hyphens `-` present in the bundle names of previous releases were replaced by dots `.`.
-
-=== JPMS changes
-
-All the published artifacts have been migrated from automatic modules to named JPMS modules.
-All packages marked as private in the Javadoc are not exported.
-
-The module name of four bridges (`log4j-slf4j-impl`, `log4j-slf4j2-impl`, `log4j-to-jul` and `log4j-to-slf4j`) have been changed to adhere to the same convention as the OSGi bundle names.
-
-<#include "../.changelog.adoc.ftl">
diff --git a/src/site/_constants.adoc b/src/site/_constants.adoc
index 9e4123d..078500b 100644
--- a/src/site/_constants.adoc
+++ b/src/site/_constants.adoc
@@ -34,7 +34,7 @@
 ////
 
 :project-github-url: https://github.com/apache/logging-log4j2
-:project-version: 2.21.0
+:project-version: 2.21.0-SNAPSHOT
 :project-name: Log4j
 :project-id: log4j
 :java-target-version: 8
diff --git a/src/site/_release-notes.adoc b/src/site/_release-notes.adoc
index c4743cb..6f9d281 100644
--- a/src/site/_release-notes.adoc
+++ b/src/site/_release-notes.adoc
@@ -36,7 +36,7 @@
 [#release-notes]
 = Release Notes
 
-include::_release-notes/_2.21.0.adoc[]
+include::_release-notes/_2.x.x.adoc[]
 include::_release-notes/_2.20.0.adoc[]
 include::_release-notes/_2.19.0.adoc[]
 include::_release-notes/_2.18.0.adoc[]
diff --git a/src/site/_release-notes/_2.21.0.adoc b/src/site/_release-notes/_2.21.0.adoc
deleted file mode 100644
index 9805999..0000000
--- a/src/site/_release-notes/_2.21.0.adoc
+++ /dev/null
@@ -1,124 +0,0 @@
-////
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         https://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-////
-
-[#release-notes-2-21-0]
-== 2.21.0
-
-Release date:: 2023-10-09
-
-This release primarily focuses on enhancements to our OSGi and JPMS support and contains several bug fixes.
-It will be the first release built and signed by the CI using the https://keyserver.ubuntu.com/pks/lookup?search=077E8893A6DCC33DD4A4D5B256E73BA9A0B592D0&op=index[ASF Logging Services Release Manager GPG key], which is shared in https://www.apache.org/dist/logging/KEYS[KEYS].
-
-The Log4j 2.21.0 API, as well as the other artifacts, maintains binary compatibility with the previous release.
-
-Apache Log4j 2.21.0 requires Java 8 to run.
-The build requires JDK 11 and generates reproducible binaries.
-
-For complete information on Apache Log4j 2, including instructions on how to submit bug reports, patches, get support, or suggestions for improvement, see http://logging.apache.org/log4j/2.x/[the Apache Log4j 2 website].
-
-=== OSGi changes
-
-All the published artifacts are OSGi bundles or fragments.
-
-This release introduces a change in the bundle symbolic names to allow them to function as JPMS module name: all hyphens `-` present in the bundle names of previous releases were replaced by dots `.`.
-
-=== JPMS changes
-
-All the published artifacts have been migrated from automatic modules to named JPMS modules.
-All packages marked as private in the Javadoc are not exported.
-
-The module name of four bridges (`log4j-slf4j-impl`, `log4j-slf4j2-impl`, `log4j-to-jul` and `log4j-to-slf4j`) have been changed to adhere to the same convention as the OSGi bundle names.
-
-
-=== Added
-
-* Added marker parent support to `JsonTemplateLayout` (https://github.com/apache/logging-log4j2/pull/1381[1381])
-* Added https://facebook.github.io/zstd/[ZStandard compression] support (https://github.com/apache/logging-log4j2/issues/1508[1508], https://github.com/apache/logging-log4j2/pull/1514[1514])
-* Added a warning for incorrect syntax of highlighting styles (https://github.com/apache/logging-log4j2/issues/1545[1545], https://github.com/apache/logging-log4j2/pull/1637[1637])
-
-=== Changed
-
-* Open `FileExtension` methods to allow their usage in custom ``RolloverStrategy``s (https://github.com/apache/logging-log4j2/issues/1365[1365], https://github.com/apache/logging-log4j2/pull/1683[1683])
-* Bumped the minimum Java version required for the build to JDK 11. Runtime requirements remain unchanged. (https://github.com/apache/logging-log4j2/issues/1369[1369])
-* Set the default `minLevel` and `maxLevel` of `LevelRangeFilter` to `OFF` and `ALL`, respectively (https://github.com/apache/logging-log4j2/pull/1503[1503])
-* Removed additional `isFiltered` checks in `AsyncLoggerConfig` (https://github.com/apache/logging-log4j2/pull/1550[1550])
-* Use Java version-specific warnings in `StackLocator` (https://github.com/apache/logging-log4j2/pull/1760[1760])
-* Started logging a status error event instead of an NPE in `OsgiServiceLocator.loadServices(Class, Lookup, boolean)` when a bundle has no valid `BundleContext` for a service type
-* Implemented a CI-based release process
-* Update Eclipse Angus Activation to version https://github.com/eclipse-ee4j/angus-activation/releases/tag/2.0.1[2.0.1] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Eclipse Angus Mail to version https://github.com/eclipse-ee4j/angus-mail/releases/tag/2.0.2[2.0.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update `com.datastax.cassandra:cassandra-driver-core` to version 3.11.5. (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Apache Cassandra to version https://github.com/apache/cassandra/blob/cassandra-3.11/CHANGES.txt[3.11.16] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Apache Commons Compress to version https://commons.apache.org/proper/commons-compress/changes-report.html#a1.24.0[1.24.0] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Apache Commons CSV to version https://commons.apache.org/proper/commons-csv/changes-report.html#a1.10.0[1.10.0] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Jackson to version https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.15.2[2.15.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Jakarta Activation API to version https://jakarta.ee/specifications/activation/2.1/changelog/[2.1.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Jakarta Mail API to version https://jakarta.ee/specifications/mail/2.1/changelog/[2.1.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update JCTools to version https://github.com/JCTools/JCTools/blob/master/RELEASE-NOTES.md[4.0.1] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Apache Kafka to version https://archive.apache.org/dist/kafka/3.4.0/RELEASE_NOTES.html[3.4.0] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Kubernetes client to version https://github.com/fabric8io/kubernetes-client/releases?q=5.12.4[5.12.4] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update `org.mongodb:mongodb-driver-core` to version 4.10.2 (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update `io.netty:netty-bom` to version 4.1.97 (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Spring Boot to version https://github.com/spring-projects/spring-boot/releases/tag/v2.7.15[2.7.15] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Spring Framework to version https://github.com/spring-projects/spring-framework/releases/tag/v5.3.29[5.3.29] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Tomcat JULI to version 10.0.27 (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Woodstox to version https://github.com/FasterXML/woodstox/blob/master/release-notes/VERSION[6.5.1] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-
-=== Removed
-
-* Moved `log4j-jmx-gui` to https://github.com/apache/logging-log4j-jmx-gui/actions[its own repository] along with its own release cycle
-
-=== Fixed
-
-* Added validation to rolling file manager path conditions (https://github.com/apache/logging-log4j2/issues/1231[1231])
-* Adapted the OSGi metadata of `log4j-to-slf4j` to work with SLF4J 1 and 2. To achieve that used a version range of `[1.7,3)` for the imported SLF4J packages. (https://github.com/apache/logging-log4j2/issues/1232[1232])
-* Fixed Javadoc failures (https://github.com/apache/logging-log4j2/issues/1275[1275], https://github.com/apache/logging-log4j2/pull/1753[1753])
-* Removed locale-dependent `toLowerCase/toUpperCase` calls (https://github.com/apache/logging-log4j2/pull/1281[1281])
-* Redirected old `/<module>/apidocs` URLs (broken in 2.20.0) to `/javadoc/<module>` (https://github.com/apache/logging-log4j2/pull/1284[1284])
-* Added environment variable arbiter (https://github.com/apache/logging-log4j2/issues/1312[1312])
-* Fixed logging of `java.sql.Date` objects by appending it before Log4J tries to call `java.util.Date.toInstant()` on it (https://github.com/apache/logging-log4j2/pull/1366[1366])
-* Adapted the OSGi metadata of `log4j-api`, `log4j-core`, `log4j-slf4j-impl` and `log4j-slf4j2-impl` to activate the bundle when it is accessed. To achieve that set the `Bundle-ActivationPolicy` to `lazy` for the log4j bundles. (https://github.com/apache/logging-log4j2/issues/1367[1367])
-* Avoided using released objects in `StackTraceStringResolver` of `JsonTemplateLayout` (https://github.com/apache/logging-log4j2/pull/1380[1380])
-* Added missing setter for `connectionStringSource` in `MongoDb4Provider` builder (https://github.com/apache/logging-log4j2/issues/1389[1389])
-* Fixed NPE in `PluginElementVisitor` (https://github.com/apache/logging-log4j2/issues/1391[1391])
-* Add `columnType` as alias for the column mapping `type` attribute. (https://github.com/apache/logging-log4j2/issues/1405[1405])
-* Restored `Log4jMarker` visibility in SLF4J adapters (https://github.com/apache/logging-log4j2/issues/1414[1414])
-* Fixed buffer size in `Log4jFixedFormatter` date time formatter (https://github.com/apache/logging-log4j2/pull/1418[1418])
-* Fixed the propagation of synchronous action failures in `RollingFileManager` and `FileRenameAction` (https://github.com/apache/logging-log4j2/issues/1445[1445], https://github.com/apache/logging-log4j2/pull/1549[1549])
-* Fixed `RollingFileManager` to propagate failed synchronous actions correctly. (https://github.com/apache/logging-log4j2/issues/1445[1445])
-* Replaced the usage of `System.out` in `StackLocator` for warnings with `System.err` (https://github.com/apache/logging-log4j2/issues/1484[1484])
-* Fixed concurrent date-time formatting issue in `PatternLayout` (https://github.com/apache/logging-log4j2/issues/1485[1485])
-* Fixed runtime dependencies documentation (https://github.com/apache/logging-log4j2/pull/1530[1530])
-* Allowed to override FQCN in `Log4jEventBuilder` by implementing `CallerBoundaryAware` (https://github.com/apache/logging-log4j2/pull/1533[1533])
-* Migrated MongoDB tests to JUnit 5 and Flapdoodle Embedded MongoDB 4 (https://github.com/apache/logging-log4j2/issues/1589[1589])
-* Rewrote message parameter formatter with improved escape handling (https://github.com/apache/logging-log4j2/issues/1626[1626])
-* Improved formatting and serialization of `StackTraceElement` on JDK 9+ (https://github.com/apache/logging-log4j2/issues/1640[1640])
-* Fixed `MemoryMappedFileAppender` buffer unmapping on JRE 9+ (https://github.com/apache/logging-log4j2/issues/1646[1646])
-* Fixed rollover strategy in the Log4j 1.x compatibility layer (https://github.com/apache/logging-log4j2/issues/1650[1650])
-* Removed incorrect mention of `base64` lookup and improve the rest of the lookup manual (https://github.com/apache/logging-log4j2/issues/1681[1681], https://issues.apache.org/jira/browse/LOG4J2-3504[LOG4J2-3504])
-* Implemented `LocationAware` for `JsonTemplateLayout`, since this was causing location not being passed to underlying appenders (https://github.com/apache/logging-log4j2/issues/1692[1692])
-* Added support for `long` values in MongoDb 4 appender to configure `collectionSize` (https://github.com/apache/logging-log4j2/issues/1747[1747])
-* Only shutdown Log4j after last `Log4jServletContextListener` is executed. (https://github.com/apache/logging-log4j2/issues/1782[1782])
-* Allow using Spring Arbiter without a Spring environment. (https://github.com/apache/logging-log4j2/issues/1783[1783])
-* Fixed context data loss if `<AsyncLogger>` components are used with an all async logger context (https://github.com/apache/logging-log4j2/issues/1786[1786])
-* Fixed `JsonTemplateLayout` NPE thrown on custom log levels (https://github.com/apache/logging-log4j2/issues/1805[1805])
-* Improved `Log4j-config.xsd` schema (https://issues.apache.org/jira/browse/LOG4J2-170[LOG4J2-170])
-* Fixed NPE in `ContextSelector` (https://issues.apache.org/jira/browse/LOG4J2-3217[LOG4J2-3217], https://github.com/apache/logging-log4j2/pull/1538[1538])
-* Avoided allocating ``ThreadLocal``s in `AbstractLogger` when they are disabled, since this was causing memory leaks due to retained reference to class loaders in web applications (https://issues.apache.org/jira/browse/LOG4J2-3657[LOG4J2-3657])
-* Fixed `%notEmpty` directive of `PatternLayout` for empty MDC/NDC inputs (https://issues.apache.org/jira/browse/LOG4J2-3660[LOG4J2-3660])
-* Fixed file descriptor leak on Tomcat (https://issues.apache.org/jira/browse/LOG4J2-3663[LOG4J2-3663])
-* Ensured `FileOutputStream` is closed in `CommonsCompressAction.execute()`
diff --git a/src/site/_release-notes/_2.x.x.adoc b/src/site/_release-notes/_2.x.x.adoc
index f6d6875..c3204dc 100644
--- a/src/site/_release-notes/_2.x.x.adoc
+++ b/src/site/_release-notes/_2.x.x.adoc
@@ -15,29 +15,110 @@
     limitations under the License.
 ////
 
-////
-    ██     ██  █████  ██████  ███    ██ ██ ███    ██  ██████  ██
-    ██     ██ ██   ██ ██   ██ ████   ██ ██ ████   ██ ██       ██
-    ██  █  ██ ███████ ██████  ██ ██  ██ ██ ██ ██  ██ ██   ███ ██
-    ██ ███ ██ ██   ██ ██   ██ ██  ██ ██ ██ ██  ██ ██ ██    ██
-     ███ ███  ██   ██ ██   ██ ██   ████ ██ ██   ████  ██████  ██
-
-    IF THIS FILE DOESN'T HAVE A `.ftl` SUFFIX, IT IS AUTO-GENERATED, DO NOT EDIT IT!
-
-    Version-specific release notes (`7.8.0.adoc`, etc.) are generated from `src/changelog/*/.release-notes.adoc.ftl`.
-    Auto-generation happens during `generate-sources` phase of Maven.
-    Hence, you must always
-
-    1. Find and edit the associated `.release-notes.adoc.ftl`
-    2. Run `./mvnw generate-sources`
-    3. Commit both `.release-notes.adoc.ftl` and the generated `7.8.0.adoc`
-////
-
 [#release-notes-2-x-x]
 == 2.x.x
 
 
 
-This is a placeholder introduction to these release notes.
-This will be updated prior to the release.
+This release primarily focuses on enhancements to our OSGi and JPMS support and contains several bug fixes.
+It will be the first release built and signed by the CI using the https://keyserver.ubuntu.com/pks/lookup?search=077E8893A6DCC33DD4A4D5B256E73BA9A0B592D0&op=index[ASF Logging Services Release Manager GPG key], which is shared in https://www.apache.org/dist/logging/KEYS[KEYS].
 
+The Log4j 2.21.0 API, as well as the other artifacts, maintains binary compatibility with the previous release.
+
+Apache Log4j 2.21.0 requires Java 8 to run.
+The build requires JDK 11 and generates reproducible binaries.
+
+For complete information on Apache Log4j 2, including instructions on how to submit bug reports, patches, get support, or suggestions for improvement, see http://logging.apache.org/log4j/2.x/[the Apache Log4j 2 website].
+
+=== OSGi changes
+
+All the published artifacts are OSGi bundles or fragments.
+
+This release introduces a change in the bundle symbolic names to allow them to function as JPMS module name: all hyphens `-` present in the bundle names of previous releases were replaced by dots `.`.
+
+=== JPMS changes
+
+All the published artifacts have been migrated from automatic modules to named JPMS modules.
+All packages marked as private in the Javadoc are not exported.
+
+The module name of four bridges (`log4j-slf4j-impl`, `log4j-slf4j2-impl`, `log4j-to-jul` and `log4j-to-slf4j`) have been changed to adhere to the same convention as the OSGi bundle names.
+
+
+=== Added
+
+* Added marker parent support to `JsonTemplateLayout` (https://github.com/apache/logging-log4j2/pull/1381[1381])
+* Added https://facebook.github.io/zstd/[ZStandard compression] support (https://github.com/apache/logging-log4j2/issues/1508[1508], https://github.com/apache/logging-log4j2/pull/1514[1514])
+* Added a warning for incorrect syntax of highlighting styles (https://github.com/apache/logging-log4j2/issues/1545[1545], https://github.com/apache/logging-log4j2/pull/1637[1637])
+
+=== Changed
+
+* Open `FileExtension` methods to allow their usage in custom ``RolloverStrategy``s (https://github.com/apache/logging-log4j2/issues/1365[1365], https://github.com/apache/logging-log4j2/pull/1683[1683])
+* Bumped the minimum Java version required for the build to JDK 11. Runtime requirements remain unchanged. (https://github.com/apache/logging-log4j2/issues/1369[1369])
+* Set the default `minLevel` and `maxLevel` of `LevelRangeFilter` to `OFF` and `ALL`, respectively (https://github.com/apache/logging-log4j2/pull/1503[1503])
+* Removed additional `isFiltered` checks in `AsyncLoggerConfig` (https://github.com/apache/logging-log4j2/pull/1550[1550])
+* Use Java version-specific warnings in `StackLocator` (https://github.com/apache/logging-log4j2/pull/1760[1760])
+* Started logging a status error event instead of an NPE in `OsgiServiceLocator.loadServices(Class, Lookup, boolean)` when a bundle has no valid `BundleContext` for a service type
+* Implemented a CI-based release process
+* Update Eclipse Angus Activation to version https://github.com/eclipse-ee4j/angus-activation/releases/tag/2.0.1[2.0.1] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Eclipse Angus Mail to version https://github.com/eclipse-ee4j/angus-mail/releases/tag/2.0.2[2.0.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update `com.datastax.cassandra:cassandra-driver-core` to version 3.11.5 (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Apache Cassandra to version https://github.com/apache/cassandra/blob/cassandra-3.11/CHANGES.txt[3.11.16] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Apache Commons Compress to version https://commons.apache.org/proper/commons-compress/changes-report.html#a1.24.0[1.24.0] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Apache Commons CSV to version https://commons.apache.org/proper/commons-csv/changes-report.html#a1.10.0[1.10.0] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Jackson to version https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.15.2[2.15.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Jakarta Activation API to version https://jakarta.ee/specifications/activation/2.1/changelog/[2.1.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Jakarta Mail API to version https://jakarta.ee/specifications/mail/2.1/changelog/[2.1.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update JCTools to version https://github.com/JCTools/JCTools/blob/master/RELEASE-NOTES.md[4.0.1] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Apache Kafka to version https://archive.apache.org/dist/kafka/3.4.0/RELEASE_NOTES.html[3.4.0] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Kubernetes client to version https://github.com/fabric8io/kubernetes-client/releases?q=5.12.4[5.12.4] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update `org.mongodb:mongodb-driver-core` to version 4.10.2 (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update `io.netty:netty-bom` to version 4.1.97 (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Spring Boot to version https://github.com/spring-projects/spring-boot/releases/tag/v2.7.15[2.7.15] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Spring Framework to version https://github.com/spring-projects/spring-framework/releases/tag/v5.3.29[5.3.29] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Tomcat JULI to version 10.0.27 (https://github.com/apache/logging-log4j2/issues/1591[1591])
+* Update Woodstox to version https://github.com/FasterXML/woodstox/blob/master/release-notes/VERSION[6.5.1] (https://github.com/apache/logging-log4j2/issues/1591[1591])
+
+=== Removed
+
+* Moved `log4j-jmx-gui` to https://github.com/apache/logging-log4j-jmx-gui/actions[its own repository] along with its own release cycle
+
+=== Fixed
+
+* Added validation to rolling file manager path conditions (https://github.com/apache/logging-log4j2/issues/1231[1231])
+* Adapted the OSGi metadata of `log4j-to-slf4j` to work with SLF4J 1 and 2. To achieve that used a version range of `[1.7,3)` for the imported SLF4J packages. (https://github.com/apache/logging-log4j2/issues/1232[1232])
+* Fixed Javadoc failures (https://github.com/apache/logging-log4j2/issues/1275[1275], https://github.com/apache/logging-log4j2/pull/1753[1753])
+* Removed locale-dependent `toLowerCase/toUpperCase` calls (https://github.com/apache/logging-log4j2/pull/1281[1281])
+* Redirected old `/<module>/apidocs` URLs (broken in 2.20.0) to `/javadoc/<module>` (https://github.com/apache/logging-log4j2/pull/1284[1284])
+* Added environment variable arbiter (https://github.com/apache/logging-log4j2/issues/1312[1312])
+* Fixed logging of `java.sql.Date` objects by appending it before Log4J tries to call `java.util.Date.toInstant()` on it (https://github.com/apache/logging-log4j2/pull/1366[1366])
+* Adapted the OSGi metadata of `log4j-api`, `log4j-core`, `log4j-slf4j-impl` and `log4j-slf4j2-impl` to activate the bundle when it is accessed. To achieve that set the `Bundle-ActivationPolicy` to `lazy` for the log4j bundles. (https://github.com/apache/logging-log4j2/issues/1367[1367])
+* Avoided using released objects in `StackTraceStringResolver` of `JsonTemplateLayout` (https://github.com/apache/logging-log4j2/pull/1380[1380])
+* Added missing setter for `connectionStringSource` in `MongoDb4Provider` builder (https://github.com/apache/logging-log4j2/issues/1389[1389])
+* Fixed NPE in `PluginElementVisitor` (https://github.com/apache/logging-log4j2/issues/1391[1391])
+* Added `columnType` as alias for the column mapping `type` attribute (https://github.com/apache/logging-log4j2/issues/1405[1405])
+* Restored `Log4jMarker` visibility in SLF4J adapters (https://github.com/apache/logging-log4j2/issues/1414[1414])
+* Fixed buffer size in `Log4jFixedFormatter` date time formatter (https://github.com/apache/logging-log4j2/pull/1418[1418])
+* Fixed the propagation of synchronous action failures in `RollingFileManager` and `FileRenameAction` (https://github.com/apache/logging-log4j2/issues/1445[1445], https://github.com/apache/logging-log4j2/pull/1549[1549])
+* Fixed `RollingFileManager` to propagate failed synchronous actions correctly (https://github.com/apache/logging-log4j2/issues/1445[1445])
+* Replaced the usage of `System.out` in `StackLocator` for warnings with `System.err` (https://github.com/apache/logging-log4j2/issues/1484[1484])
+* Fixed concurrent date-time formatting issue in `PatternLayout` (https://github.com/apache/logging-log4j2/issues/1485[1485])
+* Fixed runtime dependencies documentation (https://github.com/apache/logging-log4j2/pull/1530[1530])
+* Allowed to override FQCN in `Log4jEventBuilder` by implementing `CallerBoundaryAware` (https://github.com/apache/logging-log4j2/pull/1533[1533])
+* Migrated MongoDB tests to JUnit 5 and Flapdoodle Embedded MongoDB 4 (https://github.com/apache/logging-log4j2/issues/1589[1589])
+* Rewrote message parameter formatter with improved escape handling (https://github.com/apache/logging-log4j2/issues/1626[1626])
+* Improved formatting and serialization of `StackTraceElement` on JDK 9+ (https://github.com/apache/logging-log4j2/issues/1640[1640])
+* Fixed `MemoryMappedFileAppender` buffer unmapping on JRE 9+ (https://github.com/apache/logging-log4j2/issues/1646[1646])
+* Fixed rollover strategy in the Log4j 1.x compatibility layer (https://github.com/apache/logging-log4j2/issues/1650[1650])
+* Removed incorrect mention of `base64` lookup and improve the rest of the lookup manual (https://github.com/apache/logging-log4j2/issues/1681[1681], https://issues.apache.org/jira/browse/LOG4J2-3504[LOG4J2-3504])
+* Implemented `LocationAware` for `JsonTemplateLayout`, since this was causing location not being passed to underlying appenders (https://github.com/apache/logging-log4j2/issues/1692[1692])
+* Added support for `long` values in MongoDb 4 appender to configure `collectionSize` (https://github.com/apache/logging-log4j2/issues/1747[1747])
+* Only shutdown Log4j after last `Log4jServletContextListener` is executed (https://github.com/apache/logging-log4j2/issues/1782[1782])
+* Allowed using Spring Arbiter without a Spring environment (https://github.com/apache/logging-log4j2/issues/1783[1783])
+* Fixed context data loss if `<AsyncLogger>` components are used with an all async logger context (https://github.com/apache/logging-log4j2/issues/1786[1786])
+* Fixed `JsonTemplateLayout` NPE thrown on custom log levels (https://github.com/apache/logging-log4j2/issues/1805[1805])
+* Improved `Log4j-config.xsd` schema (https://issues.apache.org/jira/browse/LOG4J2-170[LOG4J2-170])
+* Fixed NPE in `ContextSelector` (https://issues.apache.org/jira/browse/LOG4J2-3217[LOG4J2-3217], https://github.com/apache/logging-log4j2/pull/1538[1538])
+* Avoided allocating ``ThreadLocal``s in `AbstractLogger` when they are disabled, since this was causing memory leaks due to retained reference to class loaders in web applications (https://issues.apache.org/jira/browse/LOG4J2-3657[LOG4J2-3657])
+* Fixed `%notEmpty` directive of `PatternLayout` for empty MDC/NDC inputs (https://issues.apache.org/jira/browse/LOG4J2-3660[LOG4J2-3660])
+* Fixed file descriptor leak on Tomcat (https://issues.apache.org/jira/browse/LOG4J2-3663[LOG4J2-3663])
+* Ensured `FileOutputStream` is closed in `CommonsCompressAction.execute()`
diff --git a/src/site/asciidoc/_release-notes/_2.21.0.adoc b/src/site/asciidoc/_release-notes/_2.21.0.adoc
deleted file mode 100644
index 9034f17..0000000
--- a/src/site/asciidoc/_release-notes/_2.21.0.adoc
+++ /dev/null
@@ -1,121 +0,0 @@
-////
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         https://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-////
-
-[#release-notes-2-21-0]
-== 2.21.0
-
-Release date:: 2023-10-09
-
-This release primarily focuses on enhancements to our OSGi and JPMS support and contains several bug fixes.
-It will be the first release built and signed by the CI using the https://keyserver.ubuntu.com/pks/lookup?search=077E8893A6DCC33DD4A4D5B256E73BA9A0B592D0&op=index[ASF Logging Services Release Manager GPG key], which is shared in https://www.apache.org/dist/logging/KEYS[KEYS].
-
-The Log4j 2.21.0 API, as well as the other artifacts, maintains binary compatibility with the previous release.
-
-Apache Log4j 2.21.0 requires Java 8 to run.
-The build requires JDK 11 and generates reproducible binaries.
-
-For complete information on Apache Log4j 2, including instructions on how to submit bug reports, patches, get support, or suggestions for improvement, see http://logging.apache.org/log4j/2.x/[the Apache Log4j 2 website].
-
-=== OSGi changes
-
-All the published artifacts are OSGi bundles or fragments.
-
-This release introduces a change in the bundle symbolic names to allow them to function as JPMS module name: all hyphens `-` present in the bundle names of previous releases were replaced by dots `.`.
-
-=== JPMS changes
-
-All the published artifacts have been migrated from automatic modules to named JPMS modules.
-All packages marked as private in the Javadoc are not exported.
-
-The module name of four bridges (`log4j-slf4j-impl`, `log4j-slf4j2-impl`, `log4j-to-jul` and `log4j-to-slf4j`) have been changed to adhere to the same convention as the OSGi bundle names.
-
-
-=== Added
-
-* Added marker parent support to `JsonTemplateLayout` (https://github.com/apache/logging-log4j2/pull/1381[1381])
-* Added a warning for incorrect syntax of highlighting styles (https://github.com/apache/logging-log4j2/issues/1545[1545], https://github.com/apache/logging-log4j2/pull/1637[1637])
-
-=== Changed
-
-* Bumped the minimum Java version required for the build to JDK 11. Runtime requirements remain unchanged. (https://github.com/apache/logging-log4j2/issues/1369[1369])
-* Set the default `minLevel` and `maxLevel` of `LevelRangeFilter` to `OFF` and `ALL`, respectively (https://github.com/apache/logging-log4j2/pull/1503[1503])
-* Removed additional `isFiltered` checks in `AsyncLoggerConfig` (https://github.com/apache/logging-log4j2/pull/1550[1550])
-* Use Java version-specific warnings in `StackLocator` (https://github.com/apache/logging-log4j2/pull/1760[1760])
-* Started logging a status error event instead of an NPE in `OsgiServiceLocator.loadServices(Class, Lookup, boolean)` when a bundle has no valid `BundleContext` for a service type
-* Implemented a CI-based release process
-* Update Eclipse Angus Activation to version https://github.com/eclipse-ee4j/angus-activation/releases/tag/2.0.1[2.0.1] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Eclipse Angus Mail to version https://github.com/eclipse-ee4j/angus-mail/releases/tag/2.0.2[2.0.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update `com.datastax.cassandra:cassandra-driver-core` to version 3.11.5. (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Apache Cassandra to version https://github.com/apache/cassandra/blob/cassandra-3.11/CHANGES.txt[3.11.16] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Apache Commons Compress to version https://commons.apache.org/proper/commons-compress/changes-report.html#a1.24.0[1.24.0] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Apache Commons CSV to version https://commons.apache.org/proper/commons-csv/changes-report.html#a1.10.0[1.10.0] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Jackson to version https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.15.2[2.15.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Jakarta Activation API to version https://jakarta.ee/specifications/activation/2.1/changelog/[2.1.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Jakarta Mail API to version https://jakarta.ee/specifications/mail/2.1/changelog/[2.1.2] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update JCTools to version https://github.com/JCTools/JCTools/blob/master/RELEASE-NOTES.md[4.0.1] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Apache Kafka to version https://archive.apache.org/dist/kafka/3.4.0/RELEASE_NOTES.html[3.4.0] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Kubernetes client to version https://github.com/fabric8io/kubernetes-client/releases?q=5.12.4[5.12.4] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update `org.mongodb:mongodb-driver-core` to version 4.10.2 (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update `io.netty:netty-bom` to version 4.1.97 (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Spring Boot to version https://github.com/spring-projects/spring-boot/releases/tag/v2.7.15[2.7.15] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Spring Framework to version https://github.com/spring-projects/spring-framework/releases/tag/v5.3.29[5.3.29] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Tomcat JULI to version 10.0.27 (https://github.com/apache/logging-log4j2/issues/1591[1591])
-* Update Woodstox to version https://github.com/FasterXML/woodstox/blob/master/release-notes/VERSION[6.5.1] (https://github.com/apache/logging-log4j2/issues/1591[1591])
-
-=== Removed
-
-* Moved `log4j-jmx-gui` to https://github.com/apache/logging-log4j-jmx-gui/actions[its own repository] along with its own release cycle
-
-=== Fixed
-
-* Added validation to rolling file manager path conditions (https://github.com/apache/logging-log4j2/issues/1231[1231])
-* Adapted the OSGi metadata of `log4j-to-slf4j` to work with SLF4J 1 and 2. To achieve that used a version range of `[1.7,3)` for the imported SLF4J packages. (https://github.com/apache/logging-log4j2/issues/1232[1232])
-* Removed locale-dependent `toLowerCase/toUpperCase` calls (https://github.com/apache/logging-log4j2/pull/1281[1281])
-* Redirected old `/<module>/apidocs` URLs (broken in 2.20.0) to `/javadoc/<module>` (https://github.com/apache/logging-log4j2/pull/1284[1284])
-* Added environment variable arbiter (https://github.com/apache/logging-log4j2/issues/1312[1312])
-* Fixed logging of `java.sql.Date` objects by appending it before Log4J tries to call `java.util.Date.toInstant()` on it (https://github.com/apache/logging-log4j2/pull/1366[1366])
-* Adapted the OSGi metadata of `log4j-api`, `log4j-core`, `log4j-slf4j-impl` and `log4j-slf4j2-impl` to activate the bundle when it is accessed. To achieve that set the `Bundle-ActivationPolicy` to `lazy` for the log4j bundles. (https://github.com/apache/logging-log4j2/issues/1367[1367])
-* Avoided using released objects in `StackTraceStringResolver` of `JsonTemplateLayout` (https://github.com/apache/logging-log4j2/pull/1380[1380])
-* Added missing setter for `connectionStringSource` in `MongoDb4Provider` builder (https://github.com/apache/logging-log4j2/issues/1389[1389])
-* Fixed NPE in `PluginElementVisitor` (https://github.com/apache/logging-log4j2/issues/1391[1391])
-* Add `columnType` as alias for the column mapping `type` attribute. (https://github.com/apache/logging-log4j2/issues/1405[1405])
-* Restored `Log4jMarker` visibility in SLF4J adapters (https://github.com/apache/logging-log4j2/issues/1414[1414])
-* Fixed buffer size in `Log4jFixedFormatter` date time formatter (https://github.com/apache/logging-log4j2/pull/1418[1418])
-* Fixed the propagation of synchronous action failures in `RollingFileManager` and `FileRenameAction` (https://github.com/apache/logging-log4j2/issues/1445[1445], https://github.com/apache/logging-log4j2/pull/1549[1549])
-* Fixed `RollingFileManager` to propagate failed synchronous actions correctly. (https://github.com/apache/logging-log4j2/issues/1445[1445])
-* Replaced the usage of `System.out` in `StackLocator` for warnings with `System.err` (https://github.com/apache/logging-log4j2/issues/1484[1484])
-* Fixed concurrent date-time formatting issue in `PatternLayout` (https://github.com/apache/logging-log4j2/issues/1485[1485])
-* Fixed runtime dependencies documentation (https://github.com/apache/logging-log4j2/pull/1530[1530])
-* Allowed to override FQCN in `Log4jEventBuilder` by implementing `CallerBoundaryAware` (https://github.com/apache/logging-log4j2/pull/1533[1533])
-* Migrated MongoDB tests to JUnit 5 and Flapdoodle Embedded MongoDB 4 (https://github.com/apache/logging-log4j2/issues/1589[1589])
-* Rewrote message parameter formatter with improved escape handling (https://github.com/apache/logging-log4j2/issues/1626[1626])
-* Improved formatting and serialization of `StackTraceElement` on JDK 9+ (https://github.com/apache/logging-log4j2/issues/1640[1640])
-* Fixed `MemoryMappedFileAppender` buffer unmapping on JRE 9+ (https://github.com/apache/logging-log4j2/issues/1646[1646])
-* Fixed rollover strategy in the Log4j 1.x compatibility layer (https://github.com/apache/logging-log4j2/issues/1650[1650])
-* Removed incorrect mention of `base64` lookup and improve the rest of the lookup manual (https://github.com/apache/logging-log4j2/issues/1681[1681], https://issues.apache.org/jira/browse/LOG4J2-3504[LOG4J2-3504])
-* Implemented `LocationAware` for `JsonTemplateLayout`, since this was causing location not being passed to underlying appenders (https://github.com/apache/logging-log4j2/issues/1692[1692])
-* Added support for `long` values in MongoDb 4 appender to configure `collectionSize` (https://github.com/apache/logging-log4j2/issues/1747[1747])
-* Only shutdown Log4j after last `Log4jServletContextListener` is executed. (https://github.com/apache/logging-log4j2/issues/1782[1782])
-* Allow using Spring Arbiter without a Spring environment. (https://github.com/apache/logging-log4j2/issues/1783[1783])
-* Fixed context data loss if `<AsyncLogger>` components are used with an all async logger context (https://github.com/apache/logging-log4j2/issues/1786[1786])
-* Fixed `JsonTemplateLayout` NPE thrown on custom log levels (https://github.com/apache/logging-log4j2/issues/1805[1805])
-* Improved `Log4j-config.xsd` schema (https://issues.apache.org/jira/browse/LOG4J2-170[LOG4J2-170])
-* Fixed NPE in `ContextSelector` (https://issues.apache.org/jira/browse/LOG4J2-3217[LOG4J2-3217], https://github.com/apache/logging-log4j2/pull/1538[1538])
-* Avoided allocating ``ThreadLocal``s in `AbstractLogger` when they are disabled, since this was causing memory leaks due to retained reference to class loaders in web applications (https://issues.apache.org/jira/browse/LOG4J2-3657[LOG4J2-3657])
-* Fixed `%notEmpty` directive of `PatternLayout` for empty MDC/NDC inputs (https://issues.apache.org/jira/browse/LOG4J2-3660[LOG4J2-3660])
-* Fixed file descriptor leak on Tomcat (https://issues.apache.org/jira/browse/LOG4J2-3663[LOG4J2-3663])
-* Ensured `FileOutputStream` is closed in `CommonsCompressAction.execute()`