diff --git a/binders/kafka-binder/pom.xml b/binders/kafka-binder/pom.xml
index 47e17fbba..bd887917a 100644
--- a/binders/kafka-binder/pom.xml
+++ b/binders/kafka-binder/pom.xml
@@ -34,6 +34,7 @@
spring-cloud-starter-stream-kafka
spring-cloud-stream-binder-kafka-core
spring-cloud-stream-binder-kafka-streams
+ spring-cloud-stream-binder-kafka-reactive
docs
diff --git a/binders/kafka-binder/spring-cloud-stream-binder-kafka/src/main/java/org/springframework/cloud/stream/binder/kafka/KafkaBinderEnvironmentPostProcessor.java b/binders/kafka-binder/spring-cloud-stream-binder-kafka-core/src/main/java/org/springframework/cloud/stream/binder/kafka/common/KafkaBinderEnvironmentPostProcessor.java
similarity index 98%
rename from binders/kafka-binder/spring-cloud-stream-binder-kafka/src/main/java/org/springframework/cloud/stream/binder/kafka/KafkaBinderEnvironmentPostProcessor.java
rename to binders/kafka-binder/spring-cloud-stream-binder-kafka-core/src/main/java/org/springframework/cloud/stream/binder/kafka/common/KafkaBinderEnvironmentPostProcessor.java
index 7fe2ef06b..203afb9b0 100644
--- a/binders/kafka-binder/spring-cloud-stream-binder-kafka/src/main/java/org/springframework/cloud/stream/binder/kafka/KafkaBinderEnvironmentPostProcessor.java
+++ b/binders/kafka-binder/spring-cloud-stream-binder-kafka-core/src/main/java/org/springframework/cloud/stream/binder/kafka/common/KafkaBinderEnvironmentPostProcessor.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.stream.binder.kafka;
+package org.springframework.cloud.stream.binder.kafka.common;
import java.util.HashMap;
import java.util.Map;
diff --git a/binders/kafka-binder/spring-cloud-stream-binder-kafka-reactive/pom.xml b/binders/kafka-binder/spring-cloud-stream-binder-kafka-reactive/pom.xml
new file mode 100644
index 000000000..b636732ea
--- /dev/null
+++ b/binders/kafka-binder/spring-cloud-stream-binder-kafka-reactive/pom.xml
@@ -0,0 +1,90 @@
+
+
+ 4.0.0
+
+ spring-cloud-stream-binder-kafka-reactive
+ jar
+ spring-cloud-stream-binder-kafka-reactive
+ Kafka binder implementation
+
+
+ org.springframework.cloud
+ spring-cloud-stream-binder-kafka-parent
+ 4.0.0-SNAPSHOT
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-stream-binder-kafka-core
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+ true
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.springframework.cloud
+ spring-cloud-stream
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+ true
+
+
+ org.apache.kafka
+ kafka-clients
+
+
+ org.springframework.kafka
+ spring-kafka
+
+
+ io.projectreactor.kafka
+ reactor-kafka
+ 1.3.8
+
+
+ org.springframework.boot
+ spring-boot-test
+ test
+
+
+ org.springframework.kafka
+ spring-kafka-test
+ test
+
+
+ org.springframework.cloud
+ spring-cloud-stream-binder-test
+ test
+
+
+
+ org.apache.kafka
+ kafka-clients
+ test
+
+
+ org.apache.kafka
+ kafka_2.13
+
+
+ org.apache.kafka
+ kafka_2.13
+ test
+
+
+ org.awaitility
+ awaitility
+ test
+
+
+
+
diff --git a/binders/kafka-binder/spring-cloud-stream-binder-kafka-reactive/src/main/java/org/springframework/cloud/stream/binder/reactorkafka/ReactorKafkaBinder.java b/binders/kafka-binder/spring-cloud-stream-binder-kafka-reactive/src/main/java/org/springframework/cloud/stream/binder/reactorkafka/ReactorKafkaBinder.java
new file mode 100644
index 000000000..cec65422f
--- /dev/null
+++ b/binders/kafka-binder/spring-cloud-stream-binder-kafka-reactive/src/main/java/org/springframework/cloud/stream/binder/reactorkafka/ReactorKafkaBinder.java
@@ -0,0 +1,321 @@
+/*
+ * Copyright 2021-2022 the original author or authors.
+ *
+ * Licensed 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.
+ */
+
+package org.springframework.cloud.stream.binder.reactorkafka;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.kafka.clients.consumer.ConsumerConfig;
+import org.apache.kafka.clients.producer.ProducerConfig;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.apache.kafka.clients.producer.RecordMetadata;
+import org.apache.kafka.common.serialization.ByteArrayDeserializer;
+import org.apache.kafka.common.serialization.ByteArraySerializer;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+import reactor.core.publisher.Sinks;
+import reactor.kafka.receiver.KafkaReceiver;
+import reactor.kafka.receiver.ReceiverOptions;
+import reactor.kafka.sender.KafkaSender;
+import reactor.kafka.sender.SenderOptions;
+import reactor.kafka.sender.SenderRecord;
+import reactor.kafka.sender.SenderResult;
+
+import org.springframework.cloud.stream.binder.AbstractMessageChannelBinder;
+import org.springframework.cloud.stream.binder.BinderSpecificPropertiesProvider;
+import org.springframework.cloud.stream.binder.ExtendedConsumerProperties;
+import org.springframework.cloud.stream.binder.ExtendedProducerProperties;
+import org.springframework.cloud.stream.binder.ExtendedPropertiesBinder;
+import org.springframework.cloud.stream.binder.kafka.properties.KafkaBinderConfigurationProperties;
+import org.springframework.cloud.stream.binder.kafka.properties.KafkaConsumerProperties;
+import org.springframework.cloud.stream.binder.kafka.properties.KafkaExtendedBindingProperties;
+import org.springframework.cloud.stream.binder.kafka.properties.KafkaProducerProperties;
+import org.springframework.cloud.stream.binder.kafka.provisioning.KafkaTopicProvisioner;
+import org.springframework.cloud.stream.provisioning.ConsumerDestination;
+import org.springframework.cloud.stream.provisioning.ProducerDestination;
+import org.springframework.context.Lifecycle;
+import org.springframework.integration.core.MessageProducer;
+import org.springframework.integration.endpoint.MessageProducerSupport;
+import org.springframework.integration.handler.AbstractMessageHandler;
+import org.springframework.kafka.support.converter.MessagingMessageConverter;
+import org.springframework.kafka.support.converter.RecordMessageConverter;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.MessageHandler;
+import org.springframework.util.Assert;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+/**
+ * @author Gary Russell
+ * @since 4.0
+ *
+ */
+public class ReactorKafkaBinder
+ extends AbstractMessageChannelBinder,
+ ExtendedProducerProperties, KafkaTopicProvisioner>
+ implements
+ ExtendedPropertiesBinder {
+
+ private static final Log log = LogFactory.getLog(ReactorKafkaBinder.class);
+
+ private final KafkaBinderConfigurationProperties configurationProperties;
+
+ private final KafkaExtendedBindingProperties extendedBindingProperties = new KafkaExtendedBindingProperties();
+
+ public ReactorKafkaBinder(KafkaBinderConfigurationProperties configurationProperties,
+ KafkaTopicProvisioner provisioner) {
+
+ super(new String[0], provisioner, null, null);
+ this.configurationProperties = configurationProperties;
+ }
+
+
+ @Override
+ protected MessageHandler createProducerMessageHandler(ProducerDestination destination,
+ ExtendedProducerProperties producerProperties, MessageChannel errorChannel)
+ throws Exception {
+
+ Map configs = createProducerConfigs(producerProperties);
+ // TODO: Move config customizers to core
+// if (this.producerConfigCustomizer != null) {
+// this.producerConfigCustomizer.configure(props, bindingNameHolder.get(), destination);
+// bindingNameHolder.remove();
+// }
+
+ SenderOptions