diff --git a/kafka/boil-config.toml b/kafka/boil-config.toml
index 0d5d0a387..bafa8dc7f 100644
--- a/kafka/boil-config.toml
+++ b/kafka/boil-config.toml
@@ -25,3 +25,17 @@ java-devel = "24"
[versions."4.1.1".build-arguments]
scala-version = "2.13"
jmx-exporter-version = "1.3.0"
+
+[versions."4.2.1".local-images]
+java-base = "25"
+java-devel = "25"
+"kafka/kcat" = "1.7.0"
+"kafka/kafka-opa-plugin" = "1.5.1"
+# TODO: this is not used in this version but it's added
+# to avoid major changes to the Kafka image build on short notice.
+# Building this image is quick and in CI should not even be noticed.
+"shared/reload4j" = "1.2.25"
+
+[versions."4.2.1".build-arguments]
+scala-version = "2.13"
+jmx-exporter-version = "1.3.0"
diff --git a/kafka/stackable/patches/4.2.1/0001-Add-CycloneDX-plugin.patch b/kafka/stackable/patches/4.2.1/0001-Add-CycloneDX-plugin.patch
new file mode 100644
index 000000000..3759c2515
--- /dev/null
+++ b/kafka/stackable/patches/4.2.1/0001-Add-CycloneDX-plugin.patch
@@ -0,0 +1,67 @@
+From 5ef351ca945bcaa8346ef066ba00fd9288a4f443 Mon Sep 17 00:00:00 2001
+From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com>
+Date: Wed, 13 May 2026 16:30:33 +0300
+Subject: Add CycloneDX plugin
+
+---
+ build.gradle | 45 +++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 45 insertions(+)
+
+diff --git a/build.gradle b/build.gradle
+index c07cd3b047..effbe0f65d 100644
+--- a/build.gradle
++++ b/build.gradle
+@@ -41,8 +41,53 @@ plugins {
+ id 'org.scoverage' version '8.1' apply false
+ id 'com.gradleup.shadow' version '8.3.9' apply false
+ id 'com.diffplug.spotless' version "8.0.0"
++ id 'org.cyclonedx.bom' version '3.2.4'
+ }
+
++cyclonedxBom {
++ // Specified the type of project being built. Defaults to 'library'
++ projectType = org.cyclonedx.model.Component.Type.APPLICATION
++ // Specified the version of the CycloneDX specification to use. Defaults to VERSION_16.
++ schemaVersion = org.cyclonedx.Version.VERSION_15
++ jsonOutput = file("build/reports/bom.json")
++ xmlOutput.unsetConvention()
++}
++
++// Exclude test components. This list needs to be checked and, if it changed, updated for every new Kafka version.
++// The list can be obtained by running `gradle projects | grep upgrade-system-tests`
++def skipCyclonedxProjects = [
++ ':streams:upgrade-system-tests-0110',
++ ':streams:upgrade-system-tests-10',
++ ':streams:upgrade-system-tests-11',
++ ':streams:upgrade-system-tests-20',
++ ':streams:upgrade-system-tests-21',
++ ':streams:upgrade-system-tests-22',
++ ':streams:upgrade-system-tests-23',
++ ':streams:upgrade-system-tests-24',
++ ':streams:upgrade-system-tests-25',
++ ':streams:upgrade-system-tests-26',
++ ':streams:upgrade-system-tests-27',
++ ':streams:upgrade-system-tests-28',
++ ':streams:upgrade-system-tests-30',
++ ':streams:upgrade-system-tests-31',
++ ':streams:upgrade-system-tests-32',
++ ':streams:upgrade-system-tests-33',
++ ':streams:upgrade-system-tests-34',
++ ':streams:upgrade-system-tests-35',
++ ':streams:upgrade-system-tests-36',
++ ':streams:upgrade-system-tests-37',
++ ':streams:upgrade-system-tests-38',
++ ':streams:upgrade-system-tests-39',
++ ':streams:upgrade-system-tests-40',
++ ':streams:upgrade-system-tests-41',
++]
++
++configure(subprojects.findAll { skipCyclonedxProjects.contains(it.path) }) {
++ tasks.named('cyclonedxDirectBom') {
++ enabled = false
++ }
++}
++
+ ext {
+ minClientJavaVersion = 11
+ minNonClientJavaVersion = 17
diff --git a/kafka/stackable/patches/4.2.1/0002-Change-Gradle-to-use-the-Nexus-Build-Repo.patch b/kafka/stackable/patches/4.2.1/0002-Change-Gradle-to-use-the-Nexus-Build-Repo.patch
new file mode 100644
index 000000000..6e82d1c21
--- /dev/null
+++ b/kafka/stackable/patches/4.2.1/0002-Change-Gradle-to-use-the-Nexus-Build-Repo.patch
@@ -0,0 +1,35 @@
+From e4e184668e99d71e2cbdebfd55ef4ba3322a6508 Mon Sep 17 00:00:00 2001
+From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com>
+Date: Wed, 13 May 2026 16:31:44 +0300
+Subject: Change Gradle to use the Nexus Build Repo
+
+---
+ build.gradle | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/build.gradle b/build.gradle
+index effbe0f65d..bd840210bd 100644
+--- a/build.gradle
++++ b/build.gradle
+@@ -18,7 +18,9 @@ import java.nio.charset.StandardCharsets
+
+ buildscript {
+ repositories {
+- mavenCentral()
++ maven {
++ url 'https://build-repo.stackable.tech/repository/maven-public/'
++ }
+ }
+ apply from: "$rootDir/gradle/dependencies.gradle"
+
+@@ -212,7 +214,9 @@ ext {
+ allprojects {
+
+ repositories {
+- mavenCentral()
++ maven {
++ url 'https://build-repo.stackable.tech/repository/maven-public/'
++ }
+ }
+
+ dependencyUpdates {
diff --git a/kafka/stackable/patches/4.2.1/0003-Build-custom-Stackable-version.patch b/kafka/stackable/patches/4.2.1/0003-Build-custom-Stackable-version.patch
new file mode 100644
index 000000000..853b81e07
--- /dev/null
+++ b/kafka/stackable/patches/4.2.1/0003-Build-custom-Stackable-version.patch
@@ -0,0 +1,114 @@
+From 915f1d9eb9c1fd7bf9c15a52a353c33475efa6a3 Mon Sep 17 00:00:00 2001
+From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com>
+Date: Fri, 29 May 2026 17:33:00 +0200
+Subject: Build custom Stackable version
+
+How it was done:
+
+Replace in files in root dir (do not garble .git):
+
+for d in $(ls -p|grep -v /); do find $d -type f -exec sed -i
+'s/4\.2\.1/4.2.1-stackable0.0.0-dev/g' {} +; done
+
+Replace in all subdirs:
+
+for d in $(ls -d */); do find $d -type f -exec sed -i
+'s/4\.2\.1/4.2.1-stackable0.0.0-dev/g' {} +; done
+---
+ committer-tools/kafka-merge-pr.py | 2 +-
+ gradle.properties | 2 +-
+ streams/quickstart/java/pom.xml | 2 +-
+ .../java/src/main/resources/archetype-resources/pom.xml | 2 +-
+ streams/quickstart/pom.xml | 2 +-
+ tests/kafkatest/__init__.py | 2 +-
+ tests/kafkatest/version.py | 2 +-
+ 7 files changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/committer-tools/kafka-merge-pr.py b/committer-tools/kafka-merge-pr.py
+index 92dabc607c..5611a8beeb 100755
+--- a/committer-tools/kafka-merge-pr.py
++++ b/committer-tools/kafka-merge-pr.py
+@@ -70,7 +70,7 @@ TEMP_BRANCH_PREFIX = "PR_TOOL"
+
+ DEV_BRANCH_NAME = "trunk"
+
+-DEFAULT_FIX_VERSION = os.environ.get("DEFAULT_FIX_VERSION", "4.2.1")
++DEFAULT_FIX_VERSION = os.environ.get("DEFAULT_FIX_VERSION", "4.2.1-stackable0.0.0-dev")
+
+ ORIGINAL_HEAD = ""
+
+diff --git a/gradle.properties b/gradle.properties
+index 8dad15054c..27c124ca21 100644
+--- a/gradle.properties
++++ b/gradle.properties
+@@ -14,7 +14,7 @@
+ # limitations under the License.
+
+ group=org.apache.kafka
+-version=4.2.1
++version=4.2.1-stackable0.0.0-dev
+ scalaVersion=2.13.17
+ # Adding swaggerVersion in gradle.properties to have a single version in place for swagger
+ swaggerVersion=2.2.39
+diff --git a/streams/quickstart/java/pom.xml b/streams/quickstart/java/pom.xml
+index 4930378053..41b602f98e 100644
+--- a/streams/quickstart/java/pom.xml
++++ b/streams/quickstart/java/pom.xml
+@@ -26,7 +26,7 @@
+
+ org.apache.kafka
+ streams-quickstart
+- 4.2.1
++ 4.2.1-stackable0.0.0-dev
+ ..
+
+
+diff --git a/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml b/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+index e78fa54f59..bd440c365d 100644
+--- a/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
++++ b/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+@@ -29,7 +29,7 @@
+
+
+ UTF-8
+- 4.2.1
++ 4.2.1-stackable0.0.0-dev
+ 2.0.16
+
+
+diff --git a/streams/quickstart/pom.xml b/streams/quickstart/pom.xml
+index de77049571..3964d486e1 100644
+--- a/streams/quickstart/pom.xml
++++ b/streams/quickstart/pom.xml
+@@ -22,7 +22,7 @@
+ org.apache.kafka
+ streams-quickstart
+ pom
+- 4.2.1
++ 4.2.1-stackable0.0.0-dev
+
+ Kafka Streams :: Quickstart
+
+diff --git a/tests/kafkatest/__init__.py b/tests/kafkatest/__init__.py
+index 49861a2ef2..2f50efe072 100644
+--- a/tests/kafkatest/__init__.py
++++ b/tests/kafkatest/__init__.py
+@@ -22,4 +22,4 @@
+ # Instead, in development branches, the version should have a suffix of the form ".devN"
+ #
+ # For example, when Kafka is at version 1.0.0-SNAPSHOT, this should be something like "1.0.0.dev0"
+-__version__ = '4.2.1'
++__version__ = '4.2.1-stackable0.0.0-dev'
+diff --git a/tests/kafkatest/version.py b/tests/kafkatest/version.py
+index d0297f10f9..10474bdf43 100644
+--- a/tests/kafkatest/version.py
++++ b/tests/kafkatest/version.py
+@@ -128,7 +128,7 @@ def get_version(node=None):
+ return DEV_BRANCH
+
+ DEV_BRANCH = KafkaVersion("dev")
+-DEV_VERSION = KafkaVersion("4.2.1")
++DEV_VERSION = KafkaVersion("4.2.1-stackable0.0.0-dev")
+
+ LATEST_STABLE_TRANSACTION_VERSION = 2
+ # This should match the LATEST_PRODUCTION version defined in MetadataVersion.java
diff --git a/kafka/stackable/patches/4.2.1/0004-Include-jackson-dataformat-xml-dependency.patch b/kafka/stackable/patches/4.2.1/0004-Include-jackson-dataformat-xml-dependency.patch
new file mode 100644
index 000000000..60740cd29
--- /dev/null
+++ b/kafka/stackable/patches/4.2.1/0004-Include-jackson-dataformat-xml-dependency.patch
@@ -0,0 +1,133 @@
+From 1f99c4cf15723be1ce1de65a7d5559b5bb29cb7a Mon Sep 17 00:00:00 2001
+From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com>
+Date: Fri, 29 May 2026 17:43:58 +0200
+Subject: Include jackson dataformat xml dependency
+
+Add jacksonDatabindXml everywhere near jacjsonDatabindYaml in
+build.gradle
+---
+ build.gradle | 15 ++++++++++++++-
+ gradle/dependencies.gradle | 1 +
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/build.gradle b/build.gradle
+index bd840210bd..487c2d06dd 100644
+--- a/build.gradle
++++ b/build.gradle
+@@ -188,13 +188,15 @@ ext {
+ libs.slf4jLog4j2,
+ libs.junitPlatformLanucher,
+ libs.jacksonDatabindYaml,
++ libs.jacksonDatabindXml,
+ project(":test-common:test-common-util")
+ ]
+
+ log4jReleaseLibs = [
+ libs.slf4jLog4j2,
+ libs.log4j1Bridge2Api,
+- libs.jacksonDatabindYaml
++ libs.jacksonDatabindYaml,
++ libs.jacksonDatabindXml,
+ ]
+
+ log4j2Libs = [
+@@ -1122,6 +1124,7 @@ project(':core') {
+ implementation libs.jacksonDataformatCsv
+ implementation libs.jacksonJDK8Datatypes
+ implementation libs.jacksonDatabindYaml
++ implementation libs.jacksonDatabindXml
+ implementation libs.joptSimple
+ implementation libs.jose4j
+ implementation libs.metrics
+@@ -1537,6 +1540,7 @@ project(':group-coordinator') {
+ testImplementation project(':server-common').sourceSets.test.output
+ testImplementation project(':coordinator-common').sourceSets.test.output
+ testImplementation libs.jacksonDatabindYaml
++ testImplementation libs.jacksonDatabindXml
+ testImplementation libs.junitJupiter
+ testImplementation libs.mockitoCore
+ testImplementation testLog4j2Libs
+@@ -1659,6 +1663,7 @@ project(':test-common:test-common-runtime') {
+ implementation libs.junitPlatformLanucher
+ implementation libs.junitJupiter
+ implementation libs.jacksonDatabindYaml
++ implementation libs.jacksonDatabindXml
+ implementation libs.slf4jApi
+
+ testImplementation libs.junitJupiter
+@@ -2133,6 +2138,7 @@ project(':raft') {
+ testImplementation project(':clients')
+ testImplementation project(':clients').sourceSets.test.output
+ testImplementation libs.jacksonDatabindYaml
++ testImplementation libs.jacksonDatabindXml
+ testImplementation libs.junitJupiter
+ testImplementation libs.mockitoCore
+ testImplementation libs.jqwik
+@@ -2230,6 +2236,7 @@ project(':server-common') {
+ testImplementation project(':clients')
+ testImplementation project(':clients').sourceSets.test.output
+ testImplementation libs.jacksonDatabindYaml
++ testImplementation libs.jacksonDatabindXml
+ testImplementation libs.junitJupiter
+ testImplementation libs.mockitoCore
+ testImplementation testLog4j2Libs
+@@ -2371,6 +2378,7 @@ project(':storage') {
+ testImplementation project(':transaction-coordinator')
+ testImplementation libs.hamcrest
+ testImplementation libs.jacksonDatabindYaml
++ testImplementation libs.jacksonDatabindXml
+ testImplementation libs.junitJupiter
+ testImplementation libs.mockitoCore
+ testImplementation libs.bcpkix
+@@ -2689,6 +2697,7 @@ project(':shell') {
+ testImplementation project(':server-common')
+ testImplementation project(':server-common').sourceSets.test.output
+ testImplementation libs.jacksonDatabindYaml
++ testImplementation libs.jacksonDatabindXml
+ testImplementation libs.junitJupiter
+ testImplementation testLog4j2Libs
+
+@@ -2738,6 +2747,7 @@ project(':streams') {
+
+ testImplementation project(':clients').sourceSets.test.output
+ testImplementation libs.jacksonDatabindYaml
++ testImplementation libs.jacksonDatabindXml
+ testImplementation libs.junitJupiter
+ testImplementation libs.bcpkix
+ testImplementation libs.hamcrest
+@@ -2883,6 +2893,7 @@ project(':streams:streams-scala') {
+ testImplementation project(':streams:test-utils')
+
+ testImplementation libs.jacksonDatabindYaml
++ testImplementation libs.jacksonDatabindXml
+ testImplementation libs.junitJupiter
+ testImplementation libs.mockitoJunitJupiter // supports MockitoExtension
+ testImplementation testLog4j2Libs
+@@ -2987,6 +2998,7 @@ project(':streams:test-utils') {
+
+ testImplementation project(':clients').sourceSets.test.output
+ testImplementation libs.jacksonDatabindYaml
++ testImplementation libs.jacksonDatabindXml
+ testImplementation libs.junitJupiter
+ testImplementation libs.mockitoCore
+ testImplementation libs.hamcrest
+@@ -3682,6 +3694,7 @@ project(':connect:runtime') {
+ testImplementation project(':server-common').sourceSets.test.output
+
+ testImplementation libs.jacksonDatabindYaml
++ testImplementation libs.jacksonDatabindXml
+ testImplementation libs.junitJupiter
+ testImplementation libs.mockitoCore
+ testImplementation libs.mockitoJunitJupiter
+diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle
+index de63116795..19d4117dca 100644
+--- a/gradle/dependencies.gradle
++++ b/gradle/dependencies.gradle
+@@ -159,6 +159,7 @@ libs += [
+ jacksonAnnotations: "com.fasterxml.jackson.core:jackson-annotations:$versions.jacksonAnnotations",
+ jacksonDatabind: "com.fasterxml.jackson.core:jackson-databind:$versions.jackson",
+ jacksonDatabindYaml: "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:$versions.jackson",
++ jacksonDatabindXml: "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:$versions.jackson",
+ jacksonDataformatCsv: "com.fasterxml.jackson.dataformat:jackson-dataformat-csv:$versions.jackson",
+ jacksonJDK8Datatypes: "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$versions.jackson",
+ jacksonBlackbird: "com.fasterxml.jackson.module:jackson-module-blackbird:$versions.jackson",
diff --git a/kafka/stackable/patches/4.2.1/patchable.toml b/kafka/stackable/patches/4.2.1/patchable.toml
new file mode 100644
index 000000000..9ae3d09e9
--- /dev/null
+++ b/kafka/stackable/patches/4.2.1/patchable.toml
@@ -0,0 +1 @@
+base = "18d5ecd939c8d510fdd72d0abb1f7099659dcd58"