diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4472aca98..410164a10 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@
## Pending changes
-–
+- [#289](https://github.com/bumble-tech/appyx/issues/289) – **Added**: Introduced `interop-rx3` for RxJava 3 support. This has identical functionality to `interop-rx2`.
---
diff --git a/documentation/releases/downloads.md b/documentation/releases/downloads.md
index 5a47d1e3d..322f482d0 100644
--- a/documentation/releases/downloads.md
+++ b/documentation/releases/downloads.md
@@ -38,8 +38,9 @@ dependencies {
```groovy
dependencies {
- // Optional support for RxJava 2
+ // Optional support for RxJava 2/3
implementation "com.bumble.appyx:interop-rx2:$version"
+ implementation "com.bumble.appyx:interop-rx3:$version"
// Optional interoperability layer between Appyx and badoo/RIBs
// You have to add https://jitpack.io repository to use it because badoo/RIBs is hosted there
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index e346e0a80..386f83c26 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -13,8 +13,6 @@ ribs = "0.36.1"
mvicore = "1.2.6"
coroutines = "1.6.4"
kotlin = "1.7.10"
-rxjava2 = "2.2.21"
-rxandroid = "2.1.1"
junit5 = "5.8.2"
detekt = "1.21.0"
dependencyAnalysis = "1.13.1"
@@ -57,11 +55,13 @@ ribs-base-test = { module = "com.github.badoo.RIBs:rib-base-test", version.ref =
ribs-base-test-activity = { module = "com.github.badoo.RIBs:rib-base-test-activity", version.ref = "ribs" }
ribs-base-test-rx2 = { module = "com.github.badoo.RIBs:rib-base-test-rx2", version.ref = "ribs" }
ribs-compose = { module = "com.github.badoo.RIBs:rib-compose", version.ref = "ribs" }
-ribs-rx = { module = "com.github.badoo.RIBs:rib-rx2", version.ref = "ribs" }
-rxjava2 = { module = "io.reactivex.rxjava2:rxjava", version.ref = "rxjava2" }
-rxandroid = { module = "io.reactivex.rxjava2:rxandroid", version.ref = "rxandroid" }
-rxrelay = "com.jakewharton.rxrelay2:rxrelay:2.1.1"
+rxjava2 = "io.reactivex.rxjava2:rxjava:2.2.21"
+rxjava3 = "io.reactivex.rxjava3:rxjava:3.1.5"
+rxandroid2 = "io.reactivex.rxjava2:rxandroid:2.1.1"
+rxandroid3 = "io.reactivex.rxjava3:rxandroid:3.0.2"
+rxrelay2 = "com.jakewharton.rxrelay2:rxrelay:2.1.1"
+rxrelay3 = "com.jakewharton.rxrelay3:rxrelay:3.0.1"
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
junit-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit5" }
diff --git a/libraries/interop-rx2/build.gradle.kts b/libraries/interop-rx2/build.gradle.kts
index 5006f3984..86db0b1bd 100644
--- a/libraries/interop-rx2/build.gradle.kts
+++ b/libraries/interop-rx2/build.gradle.kts
@@ -26,7 +26,7 @@ android {
dependencies {
api(project(":libraries:core"))
api(libs.rxjava2)
- api(libs.rxrelay)
+ api(libs.rxrelay2)
implementation(libs.kotlin.coroutines.rx2)
implementation(libs.androidx.lifecycle.java8)
diff --git a/libraries/interop-rx3/build.gradle.kts b/libraries/interop-rx3/build.gradle.kts
new file mode 100644
index 000000000..e86b27b40
--- /dev/null
+++ b/libraries/interop-rx3/build.gradle.kts
@@ -0,0 +1,35 @@
+plugins {
+ id("com.android.library")
+ id("kotlin-android")
+ id("appyx-publish-android")
+ id("appyx-lint")
+ id("appyx-detekt")
+}
+
+android {
+ namespace = "com.bumble.appyx.interop.rx3"
+ compileSdk = libs.versions.androidCompileSdk.get().toInt()
+
+ defaultConfig {
+ minSdk = libs.versions.androidMinSdk.get().toInt()
+ targetSdk = libs.versions.androidTargetSdk.get().toInt()
+
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ }
+ testOptions {
+ unitTests.all {
+ it.useJUnitPlatform()
+ }
+ }
+}
+
+dependencies {
+ api(project(":libraries:core"))
+ api(libs.rxjava3)
+ api(libs.rxrelay3)
+
+ implementation(libs.androidx.lifecycle.java8)
+
+ testImplementation(libs.junit.api)
+ testRuntimeOnly(libs.junit.engine)
+}
diff --git a/libraries/interop-rx3/lint-baseline.xml b/libraries/interop-rx3/lint-baseline.xml
new file mode 100644
index 000000000..27ab162a6
--- /dev/null
+++ b/libraries/interop-rx3/lint-baseline.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/libraries/interop-rx3/src/main/kotlin/com/bumble/appyx/interop/rx3/connectable/Connectable.kt b/libraries/interop-rx3/src/main/kotlin/com/bumble/appyx/interop/rx3/connectable/Connectable.kt
new file mode 100644
index 000000000..8dd9f604b
--- /dev/null
+++ b/libraries/interop-rx3/src/main/kotlin/com/bumble/appyx/interop/rx3/connectable/Connectable.kt
@@ -0,0 +1,9 @@
+package com.bumble.appyx.interop.rx3.connectable
+
+import com.bumble.appyx.core.plugin.NodeLifecycleAware
+import com.jakewharton.rxrelay3.Relay
+
+interface Connectable : NodeLifecycleAware {
+ val input: Relay
+ val output: Relay